guillemets dans les rêquetes SQL

Eléphant du PHP | 206 Messages

06 janv. 2008, 13:45

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.

Eléphant du PHP | 185 Messages

06 janv. 2008, 14:50

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()); 

Eléphant du PHP | 206 Messages

06 janv. 2008, 15:01

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 :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 janv. 2008, 15:37

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 206 Messages

06 janv. 2008, 19:37

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>";
		}
	}
	

Eléphant du PHP | 206 Messages

07 janv. 2008, 21:20

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 :)

ViPHP
ViPHP | 4039 Messages

08 janv. 2008, 11:11

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.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 206 Messages

08 janv. 2008, 18:40

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

ViPHP
ViPHP | 4039 Messages

08 janv. 2008, 19:06

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") ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
ViPHP | 4674 Messages

08 janv. 2008, 20:04

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 206 Messages

08 janv. 2008, 22:11

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?

ViPHP
ViPHP | 4674 Messages

09 janv. 2008, 00:49

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 ? :P) ... 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 :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 1885 Messages

09 janv. 2008, 04:22

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.)
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 janv. 2008, 08:55

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 206 Messages

09 janv. 2008, 10:27

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 ? :shock: