8721 sujets

Développement web côté serveur, CMS

Bonsoir,
Hier après les explications de Lothindil je pensais avoir compris ce genre de problème. J'avais réglé mon souci et bien avancé aujourd'hui.
Mais là ce soir, je retrouve ce message d'erreur pour un cas tout autre, j'ai essayé de le résoudre en suivant les explications de Lothindil à nouveau, pas à pas, mais je cale, quelque chose a du m'échapper.
Je souhaite récupérer le résultat de cases à cocher d'un formulaire. Il est possible d'en cocher plusieurs.

J'ai donc codé comme suit dans le formulaire :
<label for="trame">Trame : </label>	      
        <INPUT type="checkbox" name="trame[]" value="zoné"/> zoné
		<INPUT type="checkbox" name="trame[]" value="lité"/> lité
		<INPUT type="checkbox" name="trame[]" value="uni"/> uni
		<INPUT type="checkbox" name="trame[]" value="ponctué"/> ponctué


Je tente de récupèrer dans le traitement du formulaire avec :
$trame = $_POST["trame"];

Un [code=phpecho "<br />Trame : ".$_POST['trame'];][/code]
renvoie : Trame : Array
et le message d'erreur que je pensais ne plus revoir : Notice: Array to string conversion

Un var_dump renvoie :
array(1) { [0]=> array(4) { [0]=> string(5) "zoné" [1]=> string(5) "lité" [2]=> string(3) "uni" [3]=> string(8) "ponctué" } } 


Désolée de revenir sur le sujet mais apparemment je n'ai toujours pas compris quelque chose malgré vos explications claires et fournies ????? Smiley decu

Je vous remercie par avance si vous pouviez m'indiquer une piste. Très bonne soirée,
Evelyne
Dans ce cas, comme tu as initialisé ta valeur de $_POST['trame'] en tant qu'array (tableau).

Donc, pour récupérer tout tes choix, il faut parcourir le tableau, avec par exemple :

foreach($_POST['trame'] AS $key => value)
{
echo 'ceci est l\'index '.$key.' => et ceci et la valeur '.$value.'<br />'."\n";
}
Bonjour Super_baloo8,
et merci pour cette réponse nocturne !
J'avais bien pensé à un foreach mais je ne savais pas comment m'y prendre en cas de plusieurs cases cochées.
Je teste ta solution dans la matinée et je te tiens informé.
Très bon début de journée,
Evelyne
Re-bonjour,

J'ai testé la solution proposée par Super_baloo8 : super. Le echo $key et $value m'affiche bien les 4 index et les 4 noms de trames : zoné, lité, uni, ponctué.

Mais je bute à nouveau sur un autre problème : à partir de là il me faut récupérer les ID de ces trames pour les insérer dans une table associative.
J'avais posté à ce sujet il y a quelques jours et grâce à vos réponses j'avais solutionné mon problème.
Seulement ici cela ne marche pas en raison de ces 4 choix possibles ?????
Je vous soumets mon essai :
$trame = $_POST["trame"];
	
foreach ($_POST["trame"] AS $key => $value)
{
echo 'ceci est l\'index '.$key.' => et ceci et la valeur '.$value.'<br />'."\n";
}

$query3 = parcoursRS(SQLSelect("
    	SELECT ID_trame
    	FROM TRAME 
    	WHERE nomTrame = '" . $value . "'
     "));      
    foreach ($query3[0] as $value);
echo $value;


Le dernier echo $value m'affiche seulement de dernier ID des 4 souhaités.

Je remercie par avance quiconque pouvant me mettre sur une piste. Très bonne journée,
Evelyne
Salut,

Je pense que tu prends le problème à l'envers. Quel est l'intérêt d'avoir des ID et de ne pas les utiliser directement ?
Perso, j'utiliserais l'ID dans le html de départ comme valeur de l'attribut value.. Smiley rolleyes

Sinon, effectivement, il est normal qu'à la fin de ta boucle, $value possède comme valeur la dernière donnée du tableau...
Soit tu effectues ta requête dans la boucle (mais ça fait plusieurs requêtes), soit tu crées une clause WHERE qui va bien (avec des AND et tout ça) toujours dans ta boucle poour l'exécuter après.

tm
Bonjour tm™,
Je te remercie pour ta réponse. C'est vrai que pour ces cases multiples je ne comprends pas très bien, c'est la première fois que j'en utilise.
Ce que tu dis pour les ID directement dans le html est évident... maintenant.
J'ai rectifié, selon tes conseils, les values de mon formulaire et un echo dans le fichier de traitement me les affiche bien.
Mon souci maintenant est comment insérer cela dans ma bdd (table associative avec 2 ID dont celui des trames choisies dans les checkbox).

J'ai fait :
//INSERT dans la table associative AS_ECHAN_TRAME			
$AS_ECHAN_TRAME = SQLInsert("INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES('" . $ID_echantillon . "', 
			'". $value . "')");

et dans ma table je n'ai que le dernier.

Autre souci de conceptualisation, dans ma table associative j'ai une colonne ID_echantillon et une ID_trame. Or je souhaite pouvoir insérer, pour un même échantillon, de 1 à 4 trames.

J'ai beau réfléchir, faire des brouillons, je n'arrive pas à me dépatouiller de ces checkbox Smiley bawling

Merci de bien vouloir m'orienter dans la démarche à adopter, je pense arriver à coder ensuite.

Evelyne
Il faut que tu prépare ta requête avant.

En gros:

$start_sql = "INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES "

$end_sql = '';
$length_array = count($_POST['trame']);
for($i = 0; $i < $length_array; $i++)
{
$end_sql.= '("monchamps", "'.$_POST['trame'][$i].'")';
if($i <  ($length_array -1))
{
$end_sql.= ', ';
}
}
$AS_ECHAN_TRAME = SQLInsert($start_sql.$end_sql)


Je n'ai rien vérifié, il se peut que ça coince, mais je vois un truc comme ceci Smiley cligne
Bonsoir Super_baloo8,
Merci pour cette réponse, c'est très sympa.
Je suis à fond là-dedans, je teste une solution avec une boucle while.
Je vais tester ta solution également, espérons que tout ça m'aide à comprendre.
Bien sûr je te tiens informé et espère mettre rapidement ce post en résolu.
Très bonne soirée,
Evelyne
Bonsoir,
Toujours sur mon problème de récupérer les résultats de 1 ou plusieurs cases à cocher et insertion dans la bdd Smiley decu Smiley fache Smiley bawling .
J'ai testé 2 solutions : 1 boucle WHILE et celle proposée par Super_baloo8.
Résultat : RIEN pour ce soir, mais je teste et progresse, enfin j'espère.
Je vous soumets mes codes pour avoir votre avis :

1 - Juste récupération des values du formulaire (merci Super_baloo8) et echo pour vérification :
$trame = $_POST["trame"];
foreach ($_POST["trame"] AS $key => $value)
{
echo 'ceci est l\'index '.$key.' => et ceci et la valeur '.$value.'<br />'."\n";
}

Tout se passe bien, pas de message d'erreur. Affichage echo OK, exemple pour 3 choix sur 4 possibles :
ceci est l'index 0 => et ceci et la valeur zoné
ceci est l'index 1 => et ceci et la valeur lité
ceci est l'index 2 => et ceci et la valeur uni
Désolée tm™ mais on m'a déconseillé de retenir ta solution pour raison de sécurité et de maintenance. Pourtant je la trouvais très simple et pratique. Je ne l'abandonne pas... à voir et encore merci.

2 - Essai boucle WHILE avec INSERT dans l'instruction juste après le 1 ci-dessus :
while (isset($key))
{
	$trame_id = $value[$key];
	$query3 = parcoursRS(SQLSelect("
    	SELECT ID_trame
    	FROM TRAME 
    	WHERE nomTrame = '" . $trame_id . "'
     "));         
    foreach ($query3 as $value); 			
	$AS_ECHAN_TRAME = SQLInsert("INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES('" . $ID_echantillon . "', 
			'". $value . "')");			
}

Affichage echo OK comme ci-dessus (1). Mais message d'erreur sur requête SQL
Erreur sur la requete : INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES('125', 'uni')|Cannot add or update a child row: a foreign key constraint fails (`lithotheque`.`AS_ECHAN_TRAME`, CONSTRAINT `AS_ECHAN_TRAME_ibfk_2` FOREIGN KEY (`TRAME_ID_trame`) REFERENCES `TRAME` (`ID_trame`))

Dans VALUES, il n'est récupérée que la dernière case choisie "uni" alors que j'en ai coché 3. Ensuite je ne comprends pas ibdk_2 ??? ni pourquoi une contrainte de clé étrangère pose problème ?

3 - Test solution Super_baloo8
$start_sql = "INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES "
$end_sql = '';
$length_array = count($_POST['trame']);
for($i = 0; $i < $length_array; $i++)
{
$end_sql.= '("monchamps", "'.$_POST['trame'][$i].'")';
if($i <  ($length_array -1))
{
$end_sql.= ', ';
}
}
$AS_ECHAN_TRAME = SQLInsert($start_sql.$end_sql


Là rien ne s'affiche. Message d'erreur :
"Parse error: syntax error, unexpected '$end_sql' (T_VARIABLE) in… on line 162" 

Ligne 162 = $end_sql = '';
Le souci est que je ne comprends pas ce code donc il m'est difficile de le rectifier ? Si tu avais 1 mn Super_baloo8 pourrais-tu STP m'expliquer un peu ce code ?

Voilà où j'en suis pour ce soir. C'est galère ces choix multiples, au niveau du traitement en PHP et de l'insertion dans la BDD et ça m'étonne car c'est très courant je pense ???

Pouvez-vous, SVP, m'orienter dans mes tentatives d'éclaircir un peu tout ça ?
Avec mes remerciements par avance, je vous souhaite à toutes/tous une très bonne soirée.
Evelyne
Erreur de "parsage", en gros, il y a une coquille dans le code, dont voici le corrigé et commenté :

//Préparation de la requête SQL

//Je la coupe en deux morceau, la partie invariable
$start_sql = "INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES "

//J'initialise la variable à vide, pour pouvoir la concaténer dans la boucle "for"
$end_sql = '';

//Pour ma boucle "for", j'ai besoin de savoir la longueur du tableau associatif ($_POST['trame']) puis c'est un choix multiple, je vais aussi le réutiliser pour concaténer ma série de valeur pour ma requête SQL
$length_array = count($_POST['trame']);

//J'entame une boucle "for" qui dit : tant que $i (compteur) est strictement inférieur à la longueur de mon tableau associatif, effectuer une boucle, puis incrémenter $i
for($i = 0; $i < $length_array; $i++)
	{
	//Je concatène mes valeurs pour ma requête SQL ("valeur1", "valeur2")
	$end_sql.= '("monchamps", "'.$_POST['trame'][$i].'")';
	
	//Si je n'ai pas atteint la fin de ma boucle
	if($i <  ($length_array -1))
		{
		//Alors je rajoute une virgule pour avoir $end_sql => ("valeur1", "valeur2"), ("valeur3", "valeur4"), etc...
		$end_sql.= ', ';
		}
	}
	
//Je lance ma requête avec ta fonction SQLInsert en concaténant "$start et $end"
$AS_ECHAN_TRAME = SQLInsert($start_sql.$end_sql);

//Grosso merdo, j'obtient une requête comme :
/*
INSERT INTO AS_ECHAN_TRAME(ECHANTILLON_ID_echantillon, TRAME_ID_trame) VALUES ("valeur1", "valeur2"), ("valeur3", "valeur4"), ("valeur5", "valeur6"), ("valeur7", "valeur8")
*/


Par contre attention, comme je ne vois pas vraiment où elle se situe dans ton code, les variables ne sont surement pas les bonnes ... c'est juste le concept que je te montre.

----------------

Revenons à ton code, et son erreur SQL, il t'indique un "TRAME_ID_trame" est une clef étrangère, et que celle que tu essayes de lui donnée lors de l'insertion n'existe pas, et ne peux donc l'accepter.
Modifié par Super_baloo8 (12 Mar 2013 - 23:57)
Super_baloo8,
Sincèrement merci et chapeau bas pour toutes ces explications.
Je suis loin loin loin d'en être là, ce n'est pas évident.
Demain je reprends tranquillement avec tout ça et te tiens informé en espérant mettre très vite "resolu".
Bonne soirée,
Evelyne31
Y'a vraiment aucun soucis, tu sais on a tous commencé de zéro, et pour ma part, j'ai beaucoup appris grâce aux autres (ce n'est pas du tout mon métier, juste un "passe temps")
Bonsoir à tous/toutes,
Je poste enfin pour mettre ce sujet en résolu. Quelle galère Smiley cligne
J'ai testé les différentes solutions proposées. Désolée Super_baloo8 mais je n'ai pas réussi à appliquer ta solution pourtant super bien expliquée. Je suis pas douée !
J'ai réussi à récupérer mes checkbox multiples avec un double foreach, expliqué dans un précédent post par Lothindil.
Un grand merci à tout ce forum pour votre aide. Je reposte très vite car j'arrive en fin de projet et j'ai plein de petits soucis qui traînent.
Très bonne soirée,
Evelyne