Page 1 sur 2
guillemets dans les rêquetes SQL
Posté : 06 janv. 2008, 13:45
par Snipy
Bonjour à tous,
J'aurais besoin d'une petite remise à niveau sur l'utilisation des "" dans les requêtes SQL......
Il doit y avoir un litige entre les "" autour de mes variables dans la requête et le fait qsue ces variables soit définis plus haut entre " " aussi^^
Voici mon code
if( $result['id_equipe_dom'] == $_SESSION['id_equipe'])
{
$id_adv = $result['id_equipe_ext'];
$pre = "dom";
}
elseif ($result['id_equipe_ext'] == $_SESSION['id_equipe'])
{
$id_adv = $result['id_equipe_dom'];
$pre = "ext";
}
else
{
exit(" <p class=\"erreur\">Votre équipe ne participe pas à ce match</p>");
}
//On met à jour l'ordre de match
mysql_query("UPDATE phpl_ordres SET '".$pre."'_joueur1 =$poste1, '".$pre."'_joueur2 =$poste2, '".$pre."'_joueur3 =$poste3, '".$pre."'_joueur4 =$poste4, '".$pre."'_joueur5 =$poste5,
'".$pre."'_remp1 =$remp1, '".$pre."'_remp2 =$remp2, '".$pre."'_remp3 =$remp3, '".$pre."'_remp4 =$remp4, '".$pre."'_remp5 =$remp5
WHERE id_match=$id_match") or die (mysql_error());
Merci de m'éclairer.
Bon fin de week end.
Posté : 06 janv. 2008, 14:50
par Kaoteknik
Il y a en effet un problème avec ton code, tu n'as pas mis les simples quotes (apostrophes) au bon endroit. Essaie plutôt comme ceci :
mysql_query("UPDATE phpl_ordres
SET ".$pre."_joueur1 ='$poste1',
".$pre."_joueur2 ='$poste2',
".$pre."_joueur3 ='$poste3',
".$pre."_joueur4 ='$poste4',
".$pre."_joueur5 ='$poste5',
".$pre."_remp1 ='$remp1',
".$pre."_remp2 ='$remp2',
".$pre."_remp3 ='$remp3',
".$pre."_remp4 ='$remp4',
".$pre."_remp5 ='$remp5'
WHERE id_match='$id_match'")
or die (mysql_error());
Posté : 06 janv. 2008, 15:01
par Snipy
Je pense que les simples quote sont inutiles autour des variables $poste1 etc..
Car j'avais oublié de mentionner que ce sont des nombres,
Tandis que $pre est de dite string

Posté : 06 janv. 2008, 15:37
par Ryle
Si tu ne connais pas le contenu d'une variable, il est indispensable de protéger celle-ci avant de l'insérer en base de données. La fonction mysql_real_escape_string() est notament faite pour ça puisqu'elle va protéger les caractères spéciaux de ta chaine en ajoutant entre autre un antislash devant les apostrophes et guillemets. Attention si les magic quotes sont activées, à la redondance de cet ajout sur les variables récupérées en get ou post.
// Stocker la requête dans une variable permet de l'afficher et de vérifier que la requête générée ne contient pas d'erreur
// penser à sortir les variables des chaines pour une meilleur lisibilité
$sql = "UPDATE phpl_ordres
SET ".$pre."_joueur1 =".$poste1.",
".$pre."_joueur2 =".$poste2.",
".$pre."_joueur3 =".$poste3.",
".$pre."_joueur4 =".$poste4.",
".$pre."_joueur5 =".$poste5.",
".$pre."_remp1 ='".mysql_real_escape_string($remp1)."',
".$pre."_remp2 ='".mysql_real_escape_string($remp2)."',
".$pre."_remp3 ='".mysql_real_escape_string($remp3)."',
".$pre."_remp4 ='".mysql_real_escape_string($remp4)."',
".$pre."_remp5 ='".mysql_real_escape_string($remp5)."'
WHERE id_match=".$id_match;
mysql_query($sql) or die (mysql_error());
Et effectivement, on ne met pas d'apostrophes autour des nombres

Posté : 06 janv. 2008, 19:37
par Snipy
Ryle j'utilise en effet mysql_real_escape_string, mais un peu plus tot dans mon code.
Voici le code en entier.
Ma question reste donc entière
PAr contre avec ce code (j'ai modifié en partant du code que tu m'as fourni) j'ai une erreur du type
17118108811Table 'db191831735.phpl_ordres' doesn't exist
Alors que la table existe bien
// Si le formulaire est validée
if( !empty($_POST['poste1']) && !empty($_POST['poste2']) && !empty($_POST['poste3']) && !empty($_POST['poste4']) && !empty($_POST['poste5'])
&& !empty($_POST['remplacant1']) && !empty($_POST['remplacant2']) && !empty($_POST['remplacant3']) && !empty($_POST['remplacant4']) && !empty($_POST['remplacant5']))
{
// Et que l'on a le match
if($_POST['id_match'] && is_numeric($_POST['id_match']))
{
$id_match = $_POST['id_match'];
echo $poste1 = mysql_real_escape_string($_POST['poste1']);
echo $poste2 = mysql_real_escape_string($_POST['poste2']);
echo $poste3 = mysql_real_escape_string($_POST['poste3']);
echo $poste4 = mysql_real_escape_string($_POST['poste4']);
echo $poste5 = mysql_real_escape_string($_POST['poste5']);
echo $remp1 = mysql_real_escape_string($_POST['remplacant1']);
echo $remp2 = mysql_real_escape_string($_POST['remplacant2']);
echo $remp3 = mysql_real_escape_string($_POST['remplacant3']);
echo $remp4 = mysql_real_escape_string($_POST['remplacant4']);
echo $remp5 = mysql_real_escape_string($_POST['remplacant5']);
$requete = mysql_query("SELECT id_equipe_dom, id_equipe_ext, equipes.nom AS nom_equipe_dom, EXT.nom AS nom_equipe_ext, date_reelle
FROM phpl_matchs, equipes, equipes AS EXT
WHERE phpl_matchs.id_equipe_dom = equipes.id_equipe
AND phpl_matchs.id_equipe_ext = EXT.id_equipe
AND phpl_matchs.id = $id_match") or die (mysql_error());
$result = mysql_fetch_assoc($requete);
if( $result['id_equipe_dom'] == $_SESSION['id_equipe'])
{
$id_adv = $result['id_equipe_ext'];
$pre = "dom";
}
elseif ($result['id_equipe_ext'] == $_SESSION['id_equipe'])
{
$id_adv = $result['id_equipe_dom'];
$pre = "ext";
}
else
{
exit(" <p class=\"erreur\">Votre équipe ne participe pas à ce match</p>");
}
$sql = "UPDATE phpl_ordres
SET ".$pre."_joueur1 =".$poste1.",
".$pre."_joueur2 =".$poste2.",
".$pre."_joueur3 =".$poste3.",
".$pre."_joueur4 =".$poste4.",
".$pre."_joueur5 =".$poste5.",
".$pre."_remp1 ='".$remp1."',
".$pre."_remp2 ='".$remp2."',
".$pre."_remp3 ='".$remp3."',
".$pre."_remp4 ='".$remp4."',
".$pre."_remp5 ='".$remp5."'
WHERE id_match=".$id_match;
mysql_query($sql) or die (mysql_error());
echo "<p class=\"confirmation\">L'ordre pour ce match a bien été envoyé</p>";
}
}
Posté : 07 janv. 2008, 21:20
par Snipy
Je me permets de demander si quelqu'un pouvait m'éclairer sur ce problème de guillemet ? afin que je puisse par la suite avancer dans mon script.
Merci d'avance

Posté : 08 janv. 2008, 11:11
par Berzemus
alors.. Tu pourrais nous montrer un echo de la requête juste avant qu'elle est envoyée vers mysql ?
ça permettra d'y voir clair tout de suite, et de voir ou ça coince.
Posté : 08 janv. 2008, 18:40
par Snipy
J'ai testé différentes façon d'écrire cette foutu requête (en bougeant modifiant les "" et '')
Donc pour un echo du code SQL de mon post ci dessus ça me donne ceci :
UPDATE phpl_ordres SET dom_joueur1 =1, dom_joueur2 =6, dom_joueur3 =1, dom_joueur4 =1, dom_joueur5 =1, dom_remp1 ='1', dom_remp2 ='1', dom_remp3 ='1', dom_remp4 ='1', dom_remp5 ='1' WHERE id_match=23
erreur indiquée
Table 'db191831735.phpl_ordres' doesn't exist
Posté : 08 janv. 2008, 19:06
par Berzemus
Mince alors.. est-ce que ce serait trop demande d'avoir un dump mysql ?
Je ne crois pas que ce sont les guillemets et les apostrophes qui causent un souci, suite à un simple teste chez moi, la requête semble valable.
Au fait, tu es bien sur du nom de ta db ("db191831735") ?
Posté : 08 janv. 2008, 20:04
par Hywan
Et comme d'habitude, si tu exécutes ta requête dans PMA (PhpMyAdmin), tu as la même erreur ? Au moins, tu es sûr que la table existe, et ça te permettra un débuggage plus fin.
Posté : 08 janv. 2008, 22:11
par Snipy
Bon effectivement j'ai trouvé le problème mais je n'ai pas compris.
Dans phpmyadmin la requete me mettait la même erreur de table inexistante.
Donc j'ai pensé à mettre des ` ` autour de ma table (comme le fait automatiquement phpmyadmin, et dans ce cas la ça marche... ça marche dans phpmyadmin
Vous auriez une idée pourquoi?
Posté : 09 janv. 2008, 00:49
par Hywan
Normalement, on place des guillemets autour des chaînes de caractères (comme des noms de tables, des valeurs de champs etc.) si jamais il y a un espace, un caractère spécial, un mot réservé ou des choses du genre. Le
back-quoting (ça existe ce terme ?

) ... le guillemetage arrière — merci l'académie française — est assez spécifique à PhpMyAdmin. En effet, il n'est pas obligatoire dans SQL. Pour ce qui est de MySQL, je ne sais pas.
Comme ton nom de table contient un chiffre, c'est probablement une raison. Après, je ne suis pas assez expert en MySQL pour l'affirmer.
PS : Pense à marquer ton sujet comme résolu si c'est le cas

.
Posté : 09 janv. 2008, 04:22
par Xenon_54
Idéalement, il vaut mieux échapper ses noms de tables et champs avec le guillemetage arrière. Il s'agit d'une syntaxe incluse à MySQL et non un truc "propre" à phpMyAdmin.
Cela permet d'éviter certains problèmes avec des noms de tables/champs pas toujours recommendables. (chiffres, mots réservés, etc.)
Posté : 09 janv. 2008, 08:55
par zeus
Effectivement, le "guillemetage arrière" est propre à MySQL parce que ce SGBD permet des fantaisie non normalisées dans les noms de tables et de champs (chiffres, espaces, ...)
Et que ce guillemetage arrière est une juste une rustine qui permet de rattraper cette co**erie.
Si PMA utilise toujours les backquotes, c'est pour ne pas avoir a tester si les champs sont "valides" ou non.
Selon moi, pour avoir de bonnes pratiques, il vaut mieux nommer correctement ses tables et ses champs que de recourir à cette astuce

Posté : 09 janv. 2008, 10:27
par Snipy
J'ai bien compris l'interet des guillemets arrières...
Mais je comprends pas pourquoi pour ce nom de table j'en ai besoin?
phpl_ordres Aucun chiffre ou caractère spécial, je pense pas que ce nom soit réservé à Mysql ?
