Page 1 sur 1

Ecrire requete dans boucle

Posté : 18 août 2011, 14:46
par Ginta
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 :)

Re: Ecrire tableaux dans 1 ligne bdd

Posté : 18 août 2011, 15:01
par Mazarini
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.

Re: Ecrire tableaux dans 1 ligne bdd

Posté : 18 août 2011, 15:27
par Ginta
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...

Re: Ecrire tableaux dans 1 ligne bdd

Posté : 18 août 2011, 15:46
par Mazarini
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 )

Re: Ecrire tableaux dans 1 ligne bdd

Posté : 18 août 2011, 16:28
par Ginta
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 ! :)

Re: Ecrire tableaux dans 1 ligne bdd

Posté : 18 août 2011, 17:27
par sirakawa
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>";
}
     ?>

Re: Ecrire tableaux dans 1 ligne bdd

Posté : 18 août 2011, 19:57
par Ginta
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 )

Re: Ecrire requete dans boucle

Posté : 22 août 2011, 08:50
par Ginta
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());
			}
			?>

Re: Ecrire requete dans boucle

Posté : 22 août 2011, 09:54
par moogli
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 ;)


@+

Re: Ecrire requete dans boucle

Posté : 22 août 2011, 10:55
par Ginta
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());
			}
			?>

Re: Ecrire requete dans boucle

Posté : 22 août 2011, 22:46
par moogli
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

@+

Re: Ecrire requete dans boucle

Posté : 25 août 2011, 09:46
par Ginta
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 :)