Page 1 sur 1

Sélection multiple dans un formulaire et php

Posté : 20 août 2005, 16:32
par chessjc
bonjour à tous

j'ai encore une question que je pense extrèmement basique :

j'ai un formulaire avec un <SELECT MULTIPLE nom=mavariable

html me renvoit la réponse c donc de la forme

truc.php?mavariable=1&mavariable=2&mavariable=3

et quand je veux récupérer tout ca
avec $_REQUEST['mavariable'] cela ne garde que la dernière valeur...
je me doute qu'il y a une histoire de tableau mais je ne trouve pas...

merci d'avance

Posté : 20 août 2005, 16:36
par Cyrano
Ajoute des crochets [ ] au nom de ton select (name="nom_champ[]") tu récupèreras un tableau indexé

Posté : 20 août 2005, 17:32
par chessjc
merci cyrano

je suis autodidacte et débutant donc je galère et mes questions sont... mais ca commence à venir...

en fait je ne connaissais pas print_r() donc après moultes recherches au moins je récupère mes données.

Posté : 20 août 2005, 17:35
par Cyrano
Tu as print_r et aussi var_dump(), par exemple pour savoir ce qui arrive dans la variable $_POST, tu peux faire :
<pre>
<?php
var_dump($_POST);
?>
</pre>
Très pratique en débuggage.

Posté : 20 août 2005, 21:26
par Xenon_54
Bonjour,

De plus, la FAQ de PHPFrance propose déjà un élément de réponse:
http://www.phpfrance.com/forums/voir_sujet-5220.php

Posté : 20 août 2005, 23:36
par etycia
si tu lui dit mavariable =1 puis =2 alors le 1 est remplacé par le 2 donc normal qu'il ne garde que la derniere données, il faut que tu utilise un tabeau.
Il faut que tu mettes dans ton SELECT : nom=mavariable[].

Posté : 25 août 2005, 21:30
par TomX
Oui mais comment faire si après qu'on ait récupéré ces valeurs, on souhaite les insérer dans notre BDD de la manière suivante :
INSERTION NUMÉRO 1 => VALEUR SÉLECTIONNÉE 1
INSERTION NUMÉRO 2 => VALEUR SÉLECTIONNÉE 2
INSERTION NUMÉRO 3 => VALEUR SÉLECTIONNÉE 3
...

[Une insertion pour chaque valeur sélectionnée]

INSERT INTO mabdd(valeur) VALUES("$valeur1")
INSERT INTO mabdd(valeur) VALUES("$valeur2")
INSERT INTO mabdd(valeur) VALUES("$valeur3")
...



J'ai réfléchi longuement cet aprèm' (pendant que je travaillais à mon job d'été, lol !) mais j'ai pas trouvé comment faire...
Merci d'avance si qqn peut m'aider. :wink:

Posté : 25 août 2005, 21:41
par Cyrano
C'est de la manipulation de tableaux. Si tu as un tableau indexé, les valeurs sont dans $tableau[0], $tableau[1], $tableau[2], etc.. DOnc tu peux pointer les éléments et les insérer les uns après les autres dans une boucle en construisant une requête dynamiquement : en utilisant un pointeur qui s'incrémente à chaque tour du type for()
Ainsi:
<?php
//...
/* On compte les éléments qu'on doit insérer */
$nb = count($tableau);

/* On initialise le début d'une requête SQL */
$sql = "INSERT INTO TABLE (champ_1) VALUES ";

On initialise une boucle
for($i = 0; $i < $nb; $i++)
{
    $sql .= "('". $tableau[$i] ."')";
    $sql .= $i < ($nb - 1) ? ", " : null;
}

/* Maintenant la requête est prête et on peut l'exécuter */
mysql_connect($host, $admin, $mdp);
// .. etc...
?>

Posté : 26 août 2005, 00:25
par Invité
Merci bcp pour ta réponse super rapide ;) T'es toujours là pour aider les autres et c'est un réel plaisir :D
Si je comprends bien, cette ligne :

Code : Tout sélectionner

$sql .= $i < ($nb - 1) ? ", " : null;
... sert à mettre une virgule SI il reste des valeurs à insérer mais SINON SI il ne reste rien ALORS ne rien mettre... C'est ça en gros ?? (je sais pas si je me suis bien exprimer lol)

Encore un Grand merci.
Sincèremement,
Tom.

Posté : 26 août 2005, 07:47
par Cyrano
Exactement, c'est une version raccourcie de ceci:
if($i < ($nb - 1))
{
    $sql .=  ", ";
}

Posté : 26 août 2005, 19:16
par Xenon_54
Bonjour,
C'est de la manipulation de tableaux. Si tu as un tableau indexé, les valeurs sont dans $tableau[0], $tableau[1], $tableau[2], etc.. DOnc tu peux pointer les éléments et les insérer les uns après les autres dans une boucle en construisant une requête dynamiquement : en utilisant un pointeur qui s'incrémente à chaque tour du type for()
Ainsi:
<?php
//...
/* On compte les éléments qu'on doit insérer */
$nb = count($tableau);

/* On initialise le début d'une requête SQL */
$sql = "INSERT INTO TABLE (champ_1) VALUES ";

On initialise une boucle
for($i = 0; $i < $nb; $i++)
{
    $sql .= "('". $tableau[$i] ."')";
    $sql .= $i < ($nb - 1) ? ", " : null;
}

/* Maintenant la requête est prête et on peut l'exécuter */
mysql_connect($host, $admin, $mdp);
// .. etc...
?>
Bien vu, j'avais jamais vu cette syntaxe et pourtant elle fonctionne.

Donc à noter.

Insertion multiple dans une table MysQL (la parade)

Posté : 20 sept. 2005, 16:47
par Marc GD
On dirait que la boucle for se termine avant d'avoir effectué la requete.
Ne faut-il pas intégre à la boucle justement l'exécution de la requete sinon, seul la derniere valeur de la boucle sera prise en compte?

moi, j'ai fais un truc du genre avec Dreamweaver
//nombre de lignes souhaitées. Récupéré depuis un formulaire juste avant
$nb_rec=$_POST['nombredelignes'];

//boucle pour l'insertion multiple dans la même table
for ($i = 0; $i < $nb_rec; $i++)
{
    //là j'ai redéfini les noms des variables de formulaire où on a rentré les données à insérer.
    $variable1="code".$i;
    $variable2="nom".$i;
    $variable3="pnom".$i;
    //on n'enregistre que si variable2 (nom) n'est pas vide ou égale à 0 car dans mon cas, le code est une variable cachée incrémentée par mysql donc vide dans le formulaire
    if (!empty($_POST[$variable2]))
    {
          $insertSQL = sprintf("INSERT INTO test (code, nom, pnom) VALUES (%s, %s, %s)",
                           GetSQLValueString($_POST[$variable1], "int"),
                           GetSQLValueString($_POST[$variable2], "text"),
                           GetSQLValueString($_POST[$variable3], "text"));

        mysql_select_db($database_marccnx, $marccnx);
        $Result1 = mysql_query($insertSQL, $marccnx) or die(mysql_error());
    }
}
}

Posté : 20 sept. 2005, 18:06
par Cyrano
Utilise donc le bouton [php] quand tu mets du code : j'ai corrigé, mais c'est lassant. Tu trouve pas ça plus facile à lire commme ça ? :evil: