Ecrire requete dans boucle

Eléphanteau du PHP | 19 Messages

18 août 2011, 14:46

Bonjour,

J'ai un petit soucis pour écrire mes valeurs dans la bdd.

Voila la page ou l'utilisateur remplit ses valeurs il y a autant de valeur à remplir que de nombre de sous-ensemble remplis dans une des pages précédentes :
		    <form method="post" action="test.php">
			<?php
			$i=1;
			while ($i <= $_SESSION['nombre_sous_ensemble'])
			{ 
			$i++;?>
			<p>
			<fieldset>
				<legend>Définition de la pièce</legend>

				<label for="nom_sous_ensemble">Nom du sous-ensemble ?</label><br />
				<input type="text" name="nom_sous_ensemble[]" class="nom_sous_ensemble" nom="nom_sous_ensemble" /><br />
				
				<label for="poids_sous_ensemble">Poids (en grammes) ?</label><br />
				<input type="text" name="poids_sous_ensemble[]" class="poids_sous_ensemble"  nom="poids_sous_ensemble" /><br />
			</fieldset>
			<?php
			}
			?>
Lors de l'envoi, l'utilisateur génére donc 2 tableaux : "nom_sous_ensemble" et "poids_sous_ensemble"

Dans mon fichier "test.php" je voudrai écrire dans ma bdd toutes les valeurs de ces 2 tableaux mais je sais pas trop comment m'y prendre :'(.
J'ai essayer quelque chose comme :
			<?php
			$nom_sous_ensemble = array ($_POST['nom_sous_ensemble']);
			$poids_sous_ensemble = array ($_POST['poids_sous_ensemble']);			
			// Connexion à la base de données
			try
			{
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=localhost;dbname=Eco-conception', 'root', '', $pdo_options);
			foreach ( $nom_sous_ensemble as $nom_sous_ensemble)
			{// Insertion des données à l'aide d'une requête préparée
			$req = $bdd->prepare('INSERT INTO sous_ensemble(nom_sous_ensemble, poids_sous_ensemble, date_creation_sous_ensemble) VALUES(?, ?, NOW())');
			$req->execute(array($nom_sous_ensemble, $poids_sous_ensemble));
			$req->closeCursor();
			}
			// Redirection du visiteur
			header('Location: Eco-evaluation_saisir_piece.php');
			}
			catch(Exception $e)
			{
			die('Erreur : '.$e->getMessage());
			}
			?>
Mais ca marche pas car il faudrait mettre dans foreach les 2 tableaux :?
Quelqu'un pourrait me donner un coup de pouce?

Merci :)
Modifié en dernier par Ginta le 19 août 2011, 08:25, modifié 1 fois.

ViPHP
ViPHP | 2577 Messages

18 août 2011, 15:01

Bonjour,

Une solution est d'utiliser la fonction implode() pour transformer le tableau en chaine de caractères. Il faut cependant choisir astucieusement le caractère qui sépare les élément du tableau et s'assurer qu'il ne soit pas dans un des élément du tableau. "\n" n'est pas mal

A la lecture tu utilises explode pour récupérer ton tableau.

Cependant la bonne solution serait de stocker ces infos dans une autre table avec un sous-ensemble par ligne.

Eléphanteau du PHP | 19 Messages

18 août 2011, 15:27

Salut Mazarini,
Merci pour cette réponse rapide :)

Je débute en php/sql donc si je comprend il faudrait que je stock dans ma bdd la tableau "nom_sous_ensemble" sous forme nom_sous_ensemble1/nom_sous_ensemble2/nom_sous_ensemble3/...
Dans le même champs.
Puis à la lecture, j'exploserai la chaine en tableau.

Ça m'a l'air complexe à gérer ^^

Ce que je voudrait :
à partir de mes 2 tableaux :
$nom_sous_ensemble = nom_sous_ensemble[1],nom_sous_ensemble[2],nom_sous_ensemble[3],...
$poids_sous_ensemble = poids_sous_ensemble[1],poids_sous_ensemble[2],poids_sous_ensemble[3],...

Enregistrer dans ma table sous cette forme :

ligne 1 - nom_sous_ensemble1 - poids_sous_ensemble1
ligne 2 - nom_sous_ensemble2 - poids_sous_ensemble2
ligne 3 - nom_sous_ensemble3 - poids_sous_ensemble3
...

Après je sais pas trop si c'est possible...

ViPHP
ViPHP | 2577 Messages

18 août 2011, 15:46

Désolé, mais j'avais lu ton poste trop vite.

Un truc comme ca devrait t'aider :
foreach ($nom_sous_ensemble as $key=>$value) 
{
     traitement($nom_sous_ensemble[$key],$poids_sous_ensemble[$key]);
}
Edit : en fait le titre m'avait "enduit" d'erreur (Ecrire tableaux dans 1 ligne bdd )

Eléphanteau du PHP | 19 Messages

18 août 2011, 16:28

Hum,
voici ce que j'ai fait :
			<?php
			$nom_sous_ensemble = array ($_POST['nom_sous_ensemble']);
			$poids_sous_ensemble = array ($_POST['poids_sous_ensemble']);
			$matiere_sous_ensemble = array ($_POST['matiere_sous_ensemble']);
			$processus_matiere_sous_ensemble = array ($_POST['processus_matiere_sous_ensemble']);
			$traitement_matiere_sous_ensemble = array ($_POST['traitement_matiere_sous_ensemble']);
			
			// Connexion à la base de données
			try
			{
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=localhost;dbname=Eco-conception', 'root', '', $pdo_options);
			
			foreach ($nom_sous_ensemble as $key=>$value) 
			{
			traitement($nom_sous_ensemble[$key],$poids_sous_ensemble[$key],$matiere_sous_ensemble[$key],$processus_matiere_sous_ensemble[$key],$traitement_matiere_sous_ensemble[$key]);
			// Insertion des données à l'aide d'une requête préparée
			$req = $bdd->prepare('INSERT INTO sous_ensemble(nom_sous_ensemble, poids_sous_ensemble, matiere_sous_ensemble, process_sous_ensemble, traitement_sous_ensemble, date_creation_sous_ensemble) VALUES(?, ?, ?, ?, ?, NOW())');
			$req->execute(array($nom_sous_ensemble, $poids_sous_ensemble, $matiere_sous_ensemble, $processus_matiere_sous_ensemble, $traitement_matiere_sous_ensemble));
			}
$req->closeCursor();
			
			header('Location: Eco-evaluation_saisir_piece.php');
			}
			catch(Exception $e)
			{
			die('Erreur : '.$e->getMessage());
			}
			?>
Et j'ai un message d'erreur :
Fatal error: Call to undefined function traitement()
Je trouve pas d'aide sur cette fonction "traitement()" sur http://www.php.net/, c'est normal?

Merci encore ! :)

Mammouth du PHP | 2278 Messages

18 août 2011, 17:27

Avant tout un reflet de mes manies:
<?PHP
$t_nom_sous_ensemble = array("pignon 1", "pignon 2","courroie", "martinet");
foreach ( $t_nom_sous_ensemble as $nom_sous_ensemble) //ca me gênait que les deux variables portent le même nom mais ça fonctionnait
{
	print "$nom_sous_ensemble";
}
?>
Essaie ça:
<?PHP
$nombre_de_sous_ensembles = 3; // pour simuler ce que tu fais avec session 
// $nombre_de_sous_ensembles = $_SESSION['nombre_sous_ensemble'];
$donnees = array();
$texte = "<form method = 'post' action = 'test1.php'>";
for ($i = 1; $i <= $nombre_de_sous_ensembles; $i++)
{
        $texte .=	"<input type =' text' name=  'donnees[$i][1]' /> <input type =' text' name=  'donnees[$i][2]' /><br />";
}
$texte .= "<button type = 'submit'>OK</button></form>";
print "$texte";
?>
Dans test1.php tu te retrouves avec un truc semblable à ça:
Array ( [donnees] => Array ( [1] => Array ( [1] => pignon [2] => 12 ) [2] => Array ( [1] => chaine [2] => 24 ) [3] => Array ( [1] => huile [2] => 36 ) ) )
que tu peux gérer par un foreach
<?php
print_r($_POST);
$donnees= $_POST['donnees'];
foreach ( $donnees as $element)
{
	print_r($element);
	print"<br>";
	$l_element = implode ("/::/", $element);
	print "$l_element<br>";
}
     ?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 19 Messages

18 août 2011, 19:57

Salut Sirakawa,

Merci pour ta réponse,
Je vois que tu traites différemment la saisie des données, par contre je vois toujours pas comment les mettre dans le bon ordre dans ma bdd :/

Je cherche plus une réponse dans le genre :
<?php
			$nom_sous_ensemble = array ($_POST['nom_sous_ensemble']);
			$poids_sous_ensemble = array ($_POST['poids_sous_ensemble']);
			$matiere_sous_ensemble = array ($_POST['matiere_sous_ensemble']);
			$processus_matiere_sous_ensemble = array ($_POST['processus_matiere_sous_ensemble']);
			$traitement_matiere_sous_ensemble = array ($_POST['traitement_matiere_sous_ensemble']);
			
			// Connexion à la base de données
			try
			{
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=localhost;dbname=Eco-conception', 'root', '', $pdo_options);
			$i=1;
			$j=1;
			while ($i <= $_SESSION['nombre_sous_ensemble'])
			{ 
			$i++;?>
$req = $bdd->prepare('INSERT INTO sous_ensemble(nom_sous_ensemble, poids_sous_ensemble, matiere_sous_ensemble, process_sous_ensemble, traitement_sous_ensemble, date_creation_sous_ensemble) VALUES(?, ?, ?, ?, ?, NOW())');
			$req->execute(array($nom_sous_ensemble['<?php echo $j; ?>'], $poids_sous_ensemble['<?php echo $j; ?>'], $matiere_sous_ensemble['<?php echo $j; ?>'], $processus_matiere_sous_ensemble['<?php echo $j; ?>'], $traitement_matiere_sous_ensemble['<?php echo $j; ?>']));
}			
$req->closeCursor();
			// Redirection du visiteur
			header('Location: Eco-evaluation_saisir_piece.php');
			}
			catch(Exception $e)
			{
			die('Erreur : '.$e->getMessage());
			}
			?>
Mais ce code marche pas :'(
(je sais je suis un débutant pas doué #-o )

Eléphanteau du PHP | 19 Messages

22 août 2011, 08:50

Re bonjour à tous,

je suis toujours dans une impasse :/

J'ai réussi à faire une boucle qui marche si j'utilise fonction "echo" dans ma boucle.
Mais si j'y insére les fonctions pour écrire ma requete, ca marche po :'(
Parse error: syntax error, unexpected T_STRING
sur la ligne de ma requête.

Si quelqu'un pourrait me dire pourquoi ? :)

Merci d'avance.
<?php	
			// Connexion à la base de données
			try
			{
			$a = array($_POST['nom_sous_ensemble'][$j]);
			$b = array($_POST['poids_sous_ensemble'][$j]);
			$c = array($_POST['matiere_sous_ensemble'][$j]);
			$d = array($_POST['processus_matiere_sous_ensemble'][$j]);
			$e = array($_POST['traitement_matiere_sous_ensemble'][$j]);
			for ($i = 1; $i <= $_SESSION['nombre_sous_ensemble']; $i++)
			{
			$j = $i-1;
			$ai = $a[$j];
			$bi = $b[$j];
			$ci = $c[$j];
			$di = $d[$j];
			$ei = $e[$j];
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=localhost;dbname=Eco-conception', 'root', '', $pdo_options);
				// Insertion des données
			$req = $bdd->exec(INSERT INTO sous_ensemble('nom_sous_ensemble, poids_sous_ensemble, matiere_sous_ensemble, process_sous_ensemble, traitement_sous_ensemble, date_creation_sous_ensemble) VALUES('.$ai.', '.$bi.', '.$ci.', '.$di.', '.$ei.', NOW())');
			$req->closeCursor();
			}
			// Redirection du visiteur
			header('Location: Eco-evaluation_saisir_piece.php');
			}
			catch(Exception $e)
			{
			die('Erreur : '.$e->getMessage());
			}
			?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 août 2011, 09:54

Salut,

a tu bien regardé le code de la requete ?

tu vois directement, avec la colorisation syntaxique du forum, où est le problème.

tu ne définis pas comme il faut la chaine de caractère ça ne peux pas fonctionner ;)
$req = $bdd->exec('INSERT INTO sous_ensemble(nom_sous_ensemble, poids_sous_ensemble, matiere_sous_ensemble, process_sous_ensemble, traitement_sous_ensemble, date_creation_sous_ensemble) VALUES('.$ai.', '.$bi.', '.$ci.', '.$di.', '.$ei.', NOW())');

pour info le message d'erreur complet est utile car il indique le N° de la lignes ça facilite la recherche ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 19 Messages

22 août 2011, 10:55

Merci Moogli !

J'ai trouvé d'autres erreurs aussi qui trainer :roll:

Par contre maintenant j'ai une autre erreur :
Erreur : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'yoyo1' in 'field list'
Yoyo1 est la première valeur de mon "array($_POST['nom_sous_ensemble'][$j])".
Je comprend pas trop pourquoi il le cherche en tant que champs, alors que la requete lui demande de l'inscrire dans le champ "nom_sous_ensemble" :/

Voici le nouveau code :
<?php
session_start();

$_SESSION['ajout_piece'] = $_SESSION['ajout_piece'] + 1;

?>
			<?php	
			// Connexion à la base de données
			try
			{
			for ($i = 1; $i <= $_SESSION['nombre_sous_ensemble']; $i++)
			{
			$j = $i-1;
			$a = array($_POST['nom_sous_ensemble'][$j]);
			$b = array($_POST['poids_sous_ensemble'][$j]);
			$c = array($_POST['matiere_sous_ensemble'][$j]);
			$d = array($_POST['processus_matiere_sous_ensemble'][$j]);
			$e = array($_POST['traitement_matiere_sous_ensemble'][$j]);
			$ai = $a[$j];
			$bi = $b[$j];
			$ci = $c[$j];
			$di = $d[$j];
			$ei = $e[$j];
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=localhost;dbname=eco-conception', 'root', '', $pdo_options);
				// Insertion des données
			$req = $bdd->exec('INSERT INTO sous_ensemble(nom_sous_ensemble, poids_sous_ensemble, matiere_sous_ensemble, processus_matiere_sous_ensemble, traitement_matiere_sous_ensemble, date_creation_sous_ensemble) VALUES('.$ai.', '.$bi.', '.$ci.', '.$di.', '.$ei.', NOW())');
			$req->closeCursor();
			}
			// Redirection du visiteur
			header('Location: Eco-evaluation_saisir_piece.php');
			}
			catch(Exception $e)
			{
			die('Erreur : '.$e->getMessage());
			}
			?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 août 2011, 22:46

http://www.php.net/manual/fr/pdo.quote.php

si tu n'encadre pas les chaines de caractères par des ' cela ne va pas fonctionner.

je te conseil de revoir les base de SQL http://sqlpro.developpez.com

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 19 Messages

25 août 2011, 09:46

Salut Moogli,

encore merci pour tes conseils et ta patience :p
J'ai relu les cours que j'ai sur le php et pdo, mais je t'avouerais que j'ai toujours pas trouver ce qu'il cloche :'(
Il me semble avoir bien défini les chaines de caractères.

Dans le doute j'ai essayé de faire le code avec une requête préparé :
<?php
session_start();

$_SESSION['ajout_piece'] = $_SESSION['ajout_piece'] + 1;

?>
			<?php	
			// Connexion à la base de données
			try
			{
			for ($i = 1; $i <= $_SESSION['nombre_sous_ensemble']; $i++)
			{
			$j = $i-1;
			$a = array($_POST['nom_sous_ensemble']);
			$b = array($_POST['poids_sous_ensemble']);
			$c = array($_POST['matiere_sous_ensemble']);
			$d = array($_POST['processus_matiere_sous_ensemble']);
			$e = array($_POST['traitement_matiere_sous_ensemble']);
			$ai = $a[$j];
			$bi = $b[$j];
			$ci = $c[$j];
			$di = $d[$j];
			$ei = $e[$j];
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=localhost;dbname=eco-conception', 'root', '', $pdo_options);
				// Insertion des données
			$req = $bdd->prepare('INSERT INTO sous_ensemble(nom_sous_ensemble, poids_sous_ensemble, matiere_sous_ensemble, processus_matiere_sous_ensemble, traitement_matiere_sous_ensemble, date_creation_sous_ensemble) VALUES(?,?,?,?,?,NOW())');
			$req->execute(array($ai,$bi,$ci,$di,$ei));
			}
			// Redirection du visiteur
			header('Location: Eco-evaluation_saisir_piece.php');
			}
			catch(Exception $e)
			{
			die('Erreur : '.$e->getMessage());
			}
			?>
Mais j'ai toujours une erreur : "Notice: Array to string conversion" sur la ligne "$req->execute(array($ai,$bi,$ci,$di,$ei));"

Merci pour ton aide :)