8722 sujets

Développement web côté serveur, CMS

Bonsoir,

Je n'ai pas trouvé de sujet semblable sur le forum, pourtant j'ai cherché ...

Voilà, on me demande de produire une page d'exercices avec 10 questions et 4 choix possibles (type radio), donc une réponse possible.

Dans la page admin, je fais une boucle for pour récupérer les questions :

<?php for ($i=1;$i<11;$i++) {
    // Question des exercices
?>
<label for="Question <?php echo $i; ?>">Question <?php echo $i; ?></label>
<input type="text" class="champ_question" name="question[]" placeholder="Question <?php echo $i; ?>" value="<?php if (isset($_POST['question$i'])) echo htmlentities(trim($_POST['question$i'])); ?>">
<?php } ?>


Puis dans le fichier PHP qui va traiter celà, je fais :

<?php
for($cpt1=1;$cpt1<11;$cpt1++) {
$sql_exoquestion = 'INSERT INTO exos_questions VALUES("", "'.mysql_escape_string($_POST['question$i']).'", "'.mysql_escape_string($_POST['titre']).'")';
mysql_query($sql_exoquestion) or die('Erreur SQL !'.$sql_exoquestion.'<br />'.mysql_error());
}
 
?>


Mais il y a quelque chose qui ne fonctionne pas. Je ne comprends pas pourquoi. J'utilise peut-être une mauvaise façon de procéder...

Oui, j'utilise l'ancienne syntaxe de mysql, je sais. Mais je n'ai pas eu le choix pour ça.

Merci ... Smiley confused
Modifié par enls (19 Mar 2014 - 20:40)
a écrit :
Mais il y a quelque chose qui ne fonctionne pas. Je ne comprends pas pourquoi. J'utilise peut-être une mauvaise façon de procéder...

Tu peux être moins précis ? Je crois que les boules de cristal sont en rupture de stock en ce moment, et aucun médium n'est disponible.

a noter par contre que faire une requête SQL dans une boucle est généralement une très mauvaise idée. Un certain nombre de SGBDR dont MySQL supportent les insertions multiples en une seule requête: insert into table (champs) values (ligne1), (ligne2), (ligne3), ...
PDO c'est la vie. Smiley cligne

Au moins, tu galèrerais pas avec tes concaténations de chaines. Je veux bien aider, mais faut faire un minimum d'efforts, et ne pas utiliser des fonctions dépréciées.

Met du PDO, et on en reparle Smiley smile
a écrit :

PDO c'est la vie. Au moins, tu galèrerais pas avec tes concaténations de chaines. Je veux bien aider, mais faut faire un minimum d'efforts, et ne pas utiliser des fonctions dépréciées.

+1 pour utiliser PDO. Par contre PDO ne t'empêche pas complètement d'avoir à faire des concaténations de chaînes parfois, surtout pour faire des insert multiples et quand on ne sait pas combien exactement on en a.

ET ceci
a écrit :
Oui, j'utilise l'ancienne syntaxe de mysql, je sais. Mais je n'ai pas eu le choix pour ça.

suggère qu'il est au courant, donc inutile d'insister.
totopsy a écrit :
PDO c'est la vie. Smiley cligne

Au moins, tu galèrerais pas avec tes concaténations de chaines. Je veux bien aider, mais faut faire un minimum d'efforts, et ne pas utiliser des fonctions dépréciées.

Met du PDO, et on en reparle Smiley smile

mysqli_ aussi possède des fonctions de préparation.

Et pour une insertion multiple, c'est pas si complexe Smiley biggol

$rq="insert into mytable set".
for($i=1;$i<11;$i++) 
{
    if($i!=1){$rq.=",";}
    $rq.="(".$value[$i][1].",".$value[$i][2].",".$value[$i][3].")";
}
mysqli->query($rq) or die ("error : ".$rq);


Pour résumer le code :

on crée le début de la requête ($rq)
on fait la boucle de ce qu'on va devoir insérer
si ce n'est pas le 1er insert, on met une virgule
on crée la parenthèse de données
à la fin de la boucle, on lance la requête

Et si on veut on peut créer une fonction (ou une méthode) du genre :

function insert_multiple($array, $table) //array est un tableau de données sous forme $array[x][y] x représentant le n° de ligne; y représentant les champs. $table étant la table où doit se faire l'insert
{
	global $mysqli;
    $rq="insert into ".$table." set";
    $i=0;
    foreach($array as $k=>$row)
    {
        $i++;
        if($i!=1){$rq.=",";}
        $rq.=" (";
        $c=0;
        foreach($row as $valeur)
        { 
             $c++;
             $rq.="'".$mysqli->escape_string($valeur)."'";
             if($c<sizeof($row)){$rq.=",";}
        }
        $rq.=")";    
    }
    $mysqli->query($rq) or die (erreur : ".$rq.");
}


(aller, c'est cadeau, c'est celle que j'utilise Smiley biggol )

Et pour passer au mysqli_ facilement : Petit tutoriel en Français

(pour utiliser ma requête en mysql_, il y a juste le $mysqli->escape_string() à changer en mysql_real_escape_string() et le $mysqli->query() en mysql_query() )
Modifié par Lothindil (19 Mar 2014 - 13:47)
Modérateur

function insert_multiple($array, $table)
{
     global $pdoRocks; // or a better way  [langue]
     $rq="INSERT INTO $table VALUES (", implode(', ', array_fill(0, count($array[0]), '?')) . ')';
     $sth = $pdoRocks->prepare($rq);
     foreach($array as $row){
        $sth->execute($row);
     }
}


PDO c'est comme mysqli, sauf que ça pique moins les yeux.

@Enis: Dans ta boucle, tu affectes 10 fois une valeur différent à $sql_exoquestion, mais tu n'en fais rien? Tu n'aurais pas oblié d'exécuter ces requêtes?
Modifié par kustolovic (19 Mar 2014 - 14:27)