Insérer plusieurs tableaux dans une table SQL

Eléphanteau du PHP | 19 Messages

12 mars 2009, 12:27

Bonjour à tous,


J'ai une table "description" qui est composé de 4 champs : id_description, texte1_description, texte2_description, texte3_description et id_site.

L'utilisateur saisit x mots dans 3 textarea et valide le formulaire.

Je souhaite récupérer ces valeurs sous forme de tableau (c'est déjà fait) et mon problème vient de l'insertion des données dans ma table.

J'ai un décalage lors de l'insertion des données dans ma table sql.

Exemple :
Mon insertion dans ma table affiche trois lignes distincts dans ma colonne "texte1_description" (ligne1.1, ligne1.2, ligne1.3).
Et dans les lignes en dessous dans ma colonne "texte2_description" trois autres lignes (ligne2.1, ligne2.2, ligne2.3).

Résultat souhaité dans ma table pour la première ligne par exemple : ligne1.1, ligne2.1, ligne3.1

Je voudrais qu'il n'y ai pas de décalage lors de l'insertion des données dans ma table.

Textarea1 :

ligne1.1
ligne1.2
ligne1.3
ligne1.4

Textarea2

ligne2.1
ligne2.2
ligne2.3
ligne2.4

Textarea3

ligne3.1
ligne3.2
ligne3.3
ligne3.4


Voici mon code actuel :

Code : Tout sélectionner

if (isset($_GET['valid'])) { $champ_form1 = $_POST['champ1']; $champ_form2 = $_POST['champ2']; $champ_form3 = $_POST['champ3']; $champ_formulaire1 = explode("\n",$champ_form1); $champ_formulaire2 = explode("\n",$champ_form2); $champ_formulaire3 = explode("\n",$champ_form3); $req="INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, id_site) Values('','$champ_formulaire1','$champ_formulaire2','$champ_formulaire3','$site')"; mysql_query ($req)."<br>"; }

Merci pour votre aide.

José

Eléphant du PHP | 254 Messages

12 mars 2009, 14:26

Salut

J'ai pas bien compris ton histoire de ligne, et donc de décalage mais en fait ce que je vois c'est que explode retourne un tableau, donc $champ_formulaire1 est un tableau

Du coup si ton but est d'insérer la premier ligne de ce qu'a entré l'utilisateur dans ta table, alors la syntaxe est $champ_formulaire1[0]

En fait je me demande ce que peux contenir ta requête avec ta syntaxe (et donc comment tu as réussit a insérer quelque chose de correct)

Eléphanteau du PHP | 19 Messages

12 mars 2009, 15:10

Merci furiouslol, c'est beaucoup mieux mais j'ai encore des soucis.

Les données saisies s'affichent bien dans ma table mais j'ai des lignes vides qui s'insèrent entre chaque entrée.

De plus, savez-vous s'il est possible de détecter le nombre de lignes saisies par l'utilisateur dans ma première colonne par exemple de déterminer $i.

Code : Tout sélectionner

if (isset($_GET['valid'])) { $champ_form1 = $_POST['champ1']; $champ_form2 = $_POST['champ2']; $champ_form3 = $_POST['champ3']; $champ_form4 = $_POST['champ4']; $champ_formulaire1 = explode("\n",$champ_form1); $champ_formulaire2 = explode("\n",$champ_form2); $champ_formulaire3 = explode("\n",$champ_form3); $champ_formulaire4 = explode("\n",$champ_form4); for ($i=0;$i<=10;$i++) { $req="INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','$champ_formulaire1[$i]','$champ_formulaire2[$i]','$champ_formulaire3[$i]','$champ_formulaire4[$i]','$site')"; mysql_query ($req); } }

Eléphant du PHP | 254 Messages

12 mars 2009, 20:34

De plus, savez-vous s'il est possible de détecter le nombre de lignes saisies par l'utilisateur dans ma première colonne par exemple de déterminer $i.
Explode retourne un tableau, tu peux donc en connaitre le nombre d'éléments avec la fonction count() par exemple
Les données saisies s'affichent bien dans ma table mais j'ai des lignes vides qui s'insèrent entre chaque entrée.
Vérifie tes tableaux et tes requêtes générées en les affichant dans le navigateur

Eléphant du PHP | 254 Messages

12 mars 2009, 20:37

De plus oui avec un code comme celui la tu vas générer un tas d'enregistrements vides. Ton for fait 10 tous la ou une partie de tes entrées seront inférieures, préfère peut être l'utilisation de foreach avec une boucle pour chaque textfield

Eléphanteau du PHP | 19 Messages

15 mars 2009, 02:00

En affichant mes requêtes dans mon navigateur, je m'aperçois que des champs vides sont insérés dans ma base dû certainement à la fonction explode.

Exemple en saisissant 3 entrées :

Code : Tout sélectionner

INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','Titre 1 ','Description 1 ','Mots-clés 1 ','URL 1 ','33') INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','','','','','33') INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','Titre 2 ','Description 2 ','Mots-clés 2 ','URL 2 ','33') INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','','','','','33') INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','Titre 3','Description 3','Mots-clés 3','URL 3','33')
J'ai essayé count() mais le problème, c'est qu'il me retourne le nombre d'entrée saisit dans le textarea + le nombre de champs vide (J'ai essayer aussi $champ_form1[0] mais sans succès.

Pour le foreach, celà me retourne l'erreur "Invalid argument supplied for foreach()"

Code : Tout sélectionner

<?php if (isset($_GET['valid'])) { $champ_form1 = $_POST['champ1']; $champ_form2 = $_POST['champ2']; $champ_form3 = $_POST['champ3']; $champ_form4 = $_POST['champ4']; $champ_formulaire1 = explode("\n",$champ_form1); $champ_formulaire2 = explode("\n",$champ_form2); $champ_formulaire3 = explode("\n",$champ_form3); $champ_formulaire4 = explode("\n",$champ_form4); $j = count($champ_formulaire1); foreach ($j as $i) { $req="INSERT INTO description(id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) Values('','$champ_formulaire1[$i]','$champ_formulaire2[$i]','$champ_formulaire3[$i]','$champ_formulaire4[$i]','$site')"; echo ($req)."<br>"; $i++; } } ?>

José

ViPHP
ViPHP | 1996 Messages

15 mars 2009, 02:31

J'ai déjà eu le même truc :
if (isset($_GET['valid'])) {

$champ_form1 = addslashes($_POST['champ1']);
$champ_form2 = addslashes($_POST['champ2']);
$champ_form3 = addslashes($_POST['champ3']);
$champ_form4 = addslashes($_POST['champ4']);

$champ_formulaire1 = explode("\n",$champ_form1);
$champ_formulaire2 = explode("\n",$champ_form2);
$champ_formulaire3 = explode("\n",$champ_form3);
$champ_formulaire4 = explode("\n",$champ_form4);

$requete="INSERT INTO description (id_description, texte1_description, texte2_description, texte3_description, texte4_description, id_site) VALUES";

//on vérifie que les 4 tableaux ont la même dimension pour cela je les mets dans un tableau
//où j'enlève les doublons : s'il ne me reste que 1 cellule = tous les tableaux ont la même dimension
$tab_temp = array();
array_push ($tab_temp,count ($champ_formulaire1),count ($champ_formulaire2),count ($champ_formulaire3),count ($champ_formulaire4));
$resultat = array_unique ($tab_temp);

if (count($resultat) == 1) //les tableaux ont la même dimension
{
 for ($cle =0 ; $cle < count (champ_formulaire1) ; $cle++)
 {
 $requete .= " ('','$champ_formulaire1[$cle]','$champ_formulaire2[cle]','$champ_formulaire3[cle]','$champ_formulaire4[cle]','$site'),";
 }
//on enlève la , final qu'on ne veut pas
$requete = substr ($requete,0,-1);

//on vérifie la requete
echo $requete;

//mysql_query ($req);
}
}
il faut voir s'il ne faut pas passer par des variables intermédiaires pour les count() présents dans : array_push ($tab_temp,count ($champ_formulaire1),count ($champ_formulaire2),count ($champ_formulaire3),count ($champ_formulaire4));

je t'ai mis //mysql_query en commentaires pour que tu fasses d'abord les vérifications
Enfin j'ai rajouté addslashes() pour protéger des injections sql

EDIT : correction du script après nuit de sommeil.
Modifié en dernier par Aureusms le 15 mars 2009, 12:34, modifié 1 fois.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 254 Messages

15 mars 2009, 11:59

Pour le foreach, celà me retourne l'erreur "Invalid argument supplied for foreach()"
En même temps la syntaxe du foreach prend un tableau en premier argument, forcément il va pas marcher, pour rappel la syntaxe d'un foreach te permet de parcourir un tableau sans en connaitre la taille
foreach ($tableau as $valeur) // si tu n'as pas besopin de traiter avec les index de ton tableau, la valeur te suffit
foreach ($tableau as $clef=>$valeur) // ici tu peux traiter a la fois la clef et la valeur d'un element de ton tableau

Eléphanteau du PHP | 19 Messages

15 mars 2009, 14:13

Yes, ça marche.

Mes sincères remerciements pour m'avoir aidé furiouslol et Aureusms.

Cependant, il y a une chose que je comprends pas.

L'insertion pour la première fois de mes données se fait sans soucis.

Mais lorsque je veux modifier directement mes données dans mon textarea afin de les mettre à jour dans ma table j'ai de nouveau des lignes vides qui se mettent dans ma table.

Le problème vient de " $donnees["texte$i"."_description"]."\r"; ", il faudrait forcer l'affichage ligne par ligne de ma table. Si quelqu'un a une solution, je suis preneur.

J'ai essayé "\n", "\r", rien n'y fait. Lorsque je met rien, les champs de ma table sont collés dans les textarea.
<?php
// $nb correspond au nombre de textarea
for($i=1;$i<=$nb;$i++) {
echo '<textarea name="champ'.$i.'" rows="10">';
$sql_textarea = mysql_query("select id_description, texte$i"."_description from description where theme_description='$theme' and nb_morceaux_description='$nb'");
while ($donnees = mysql_fetch_array($sql_textarea)) {
echo $donnees["texte$i"."_description"]."\r";
}
echo "</textarea>";

}
?>