Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/10/2011, 00h35   #1
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
Par défaut interprétation requete qui tourne mal

Bonjour,

Je tourne en rond depuis deux jours. Sur mon site en local, ma requête fonctionne lors que j'installe le source chez mon hébergeur, elle se comporte différemment.

Ci-dessous le code :

Code :
1
2
3
4
5
 
texte_requete="select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin ";
$texte_requete=$texte_requete."from t_calendrier ";
$texte_requete=$texte_requete."where c_zone=$selzone and c_annee=$selannee order by c_debut"; 
$requete1 = mysql_query($texte_requete);
Chez mon hébergeur, elle plante

Citation:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\"Zone B\" and c_annee=\"2011 - 2012\" order by c_debut' at line 1<br>La consultation a échoué select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin from t_calendrier where c_zone=\"Zone B\" and c_annee=\"2011 - 2012\" order by c_debut
on peut voir que dans ma requête on retrouve c_zone=\"Zone B\" alors que sur mon site en local j'obtiens c_zone="Zone B". On retrouve un \ chez l’hébergeur.

Pourquoi? avez-vous une idée?

Merci d'avance
efrbeldin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 02h16   #2
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 566
Points : 1 566
Cela vient de la configuration magic_quote_gpc du serveur qui est encore configuré à l'ancienne (sur on) alors qu'elle est sur off sur ton serveur d'évaluation (valeur standard maintenant par défaut).

Pour que ton code passe partout même sur des anciennes config, tu peux créer une petite fonction pour récupérer tes variables :
Code :
1
2
3
4
5
6
7
8
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
 
return $chaine;
} 
 
$selzone = isset($_POST['selzone']) ? Verif_magicquotes($_POST['selzone']) : null;
Tu pourrais aussi essayer de modifier la config magic_quote_gpc via un fichier .htaccess mais cela ne fonctionne pas sur tous les serveurs.

Sinon pour protéger la chaine de ta requête tu dois toujours utiliser mysql_real_escape_string (ou l'équivalent quotes ou requêtes préparée avec PDO) sur les variables.

Soit au final :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
 
return $chaine;
} 
 
 
$selzone = isset($_POST['selzone']) ? Verif_magicquotes($_POST['selzone']) : null;
 
if (isset($selzone))
{
// connexion à ta bdd
 
$requete = "SELECT mon_champ FROM matable WHERE un_champ = '".mysql_real_escape_string($selzone)."' AND ... "; 
 
// suite du code
}
A savoir que gpc veut dire "get", "post" et "cookie", donc tu devras utiliser la fonction Verif_magicquotes pour récupérer ces trois types de variables.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 08h32   #3
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
Merci pour ta réponse, j'ai fais les modifications nécessaire. la requête passe désormais chez l'hebergeur et le comportement est le même sur mon local mais elle ne ramène rien.

La requête qui s'exécute est la suivante avec tes modifications :

Code :
select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin from t_calendrier where c_zone='\"Zone A\"' and c_annee='\"2011 - 2012\"' order by c_debut
En fait j'aimerai qu'elle passe sous la forme

Code :
select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin from t_calendrier where c_zone='Zone A' and c_annee='2011 - 2012' order by c_debut
Merci d'avance pour ton aide.
efrbeldin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h14   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Entoure les variables du WHERE avec des apostrophes :
Code :
1
2
3
4
5
$texte_requete=$texte_requete."
  where c_zone = '$selzone' 
    and c_annee = '$selannee'
   order by c_debut
";
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h32   #5
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
Bonjour,

J'ai déjà fais ces modifications car j'ai suis une réponse qui m'a été faite ci-dessus et voici mon code :

Code :
1
2
3
4
5
6
$selzone = isset($_POST['zone']) ? Verif_magicquotes($_POST['zone']) : null;
$selannee = isset($_POST['annee']) ? Verif_magicquotes($_POST['annee']) : null;
 
$texte_requete="select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin ";
$texte_requete=$texte_requete."from t_calendrier ";
$texte_requete=$texte_requete."where c_zone='".mysql_real_escape_string($selzone)."' and c_annee='".mysql_real_escape_string($selannee)."' order by c_debut";
La requête me retourne vide et avec firebug voici la requete qui s'exécute :

select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin from t_calendrier where c_zone='\"Zone A\"' and c_annee='\"2011 - 2012\"' order by c_debut

je voudrais au final que le \" disparaisse.
efrbeldin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h37   #6
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 566
Points : 1 566
Le principe du code que je t'ai montré en exemple est correct mais mon explication n'était certainement pas la bonne concernant la cause de ton pb car magic_quote_gpc ajoute des antislah pour protéger les "'" et les """ à l'intérieur de la variable or là il sont à l'extérieur.

Attention aussi j'ai mis "null" comme valeur par défaut dans le test de la variable :
$selzone = isset($_POST['zone']) ? Verif_magicquotes($_POST['zone']) : null;

mais tu peux choisir la valeur par défaut la plus adaptée à tes besoins.

Faits afficher ta requête avec php le temps de débugguer
$requete_result = "SELECT...";
echo $requete;

puis copie le résultat pour le faire exécuter dans phpmyadmin pour voir.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 19h54   #7
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
J'ai essayé et je pense trouver la raison du problème mais je ne comprends toujours pas.

Mes variables $selzone et $selannee contiennent des valeurs mais lorsque récupére ces valeurs, elles sont entourées de ".

$selzone devrait par exemple être égale à Zone A et non à "Zone A".

Dans mon code, j'ai mis en place de l'AJAX j'ai un script "remplir_calendrier.js" dont voici le code ci-dessous et qui appelle "Recuperation_donnees.php".

remplir_calendrier.js :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
function getXhr()
	{
        var xhr = null; 
		if(window.XMLHttpRequest) // Firefox et autres
		   xhr = new XMLHttpRequest(); 
		else if(window.ActiveXObject)
			{ // Internet Explorer 
			   try {
						xhr = new ActiveXObject("Msxml2.XMLHTTP");
			        } catch (e) 
					{
			            xhr = new ActiveXObject("Microsoft.XMLHTTP");
			         }
			}
			else 
			{ // XMLHttpRequest non supporté par le navigateur 
				alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
				xhr = false; 
			} 
        return xhr;
	}
 
 
 
function Remplir()
	{
		var xhr = getXhr();
 
 
 
		// On défini ce qu'on va faire quand on aura la réponse
		xhr.onreadystatechange = function()
		{
			// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
			if(xhr.readyState == 4 && xhr.status == 200)
			{
			 var rst = xhr.responseXML;      
			 if (rst.getElementsByTagName('Enreg')[0].firstChild.nodeValue!="0")     		 
			  {
				document.getElementById('c0').value = rst.getElementsByTagName('champs')[0].firstChild.nodeValue;
				document.getElementById('c1').value = rst.getElementsByTagName('champs')[1].firstChild.nodeValue;
				document.getElementById('c2').value = rst.getElementsByTagName('champs')[2].firstChild.nodeValue;
				document.getElementById('c3').value = rst.getElementsByTagName('champs')[3].firstChild.nodeValue;
				document.getElementById('c4').value = rst.getElementsByTagName('champs')[4].firstChild.nodeValue;
				document.getElementById('c5').value = rst.getElementsByTagName('champs')[5].firstChild.nodeValue;
				document.getElementById('c6').value = rst.getElementsByTagName('champs')[6].firstChild.nodeValue;
				document.getElementById('c7').value = rst.getElementsByTagName('champs')[7].firstChild.nodeValue;
				document.getElementById('c8').value = rst.getElementsByTagName('champs')[8].firstChild.nodeValue;
				document.getElementById('c9').value = rst.getElementsByTagName('champs')[9].firstChild.nodeValue;
				document.getElementById('c10').value = rst.getElementsByTagName('champs')[10].firstChild.nodeValue;
				document.getElementById('c11').value = rst.getElementsByTagName('champs')[11].firstChild.nodeValue;
				document.getElementById('c12').value = rst.getElementsByTagName('champs')[12].firstChild.nodeValue;
				document.getElementById('c13').value = rst.getElementsByTagName('champs')[13].firstChild.nodeValue;
				document.getElementById('c14').value = rst.getElementsByTagName('champs')[14].firstChild.nodeValue;
				document.getElementById('c15').value = rst.getElementsByTagName('champs')[15].firstChild.nodeValue;
			 }
			}
		}
 
		// Ici on va voir comment faire du post
		xhr.open("POST","Recuperation_Donnees.php",true);
		// ne pas oublier ça pour le post
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		// ne pas oublier de poster les arguments
		// ici, le code_Appli de la application sélectionnée
		selzone = document.getElementById("sel_zone").options[document.getElementById("sel_zone").selectedIndex].value;
		selannee = document.getElementById("sel_annee").options[document.getElementById("sel_annee").selectedIndex].value;
		var chaine1 = "zone=";
		var chaine2 ="&annee=";
		data=chaine1+selzone+chaine2+selannee;
		xhr.send(data);
	}
Recuperation_donnees.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
<?php 
header("Content-type:text/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>';
 
include("./inc/data.php");
include("./inc/functions.php");
include("./connexion/control_log.php");
 
$selzone = isset($_POST['zone']) ? Verif_magicquotes($_POST['zone']) : null;
$selannee = isset($_POST['annee']) ? Verif_magicquotes($_POST['annee']) : null;
 
$texte_requete="select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin ";
$texte_requete=$texte_requete."from t_calendrier ";
$texte_requete=$texte_requete."where c_zone='".mysql_real_escape_string($selzone)."' and c_annee='".mysql_real_escape_string($selannee)."' order by c_debut"; 
 
echo stripslashes($texte_requete);
 
//$texte_requete=$texte_requete."where c_zone='".$_POST['zone']."' and c_annee='".$_POST['annee']."' order by c_debut"; 
 
$requete1 = mysql_query($texte_requete);
 
if (!$requete1) {
     $error = mysql_error();
     echo "<br>Erreur : $error";
     $resultat = "<font color='#FF0000'><b>Echec à la consultation</b></font>".$texte_requete;
     die ("<br>La consultation a échoué".$texte_requete);
    }
 
if ( mysql_num_rows($requete1)!= 0) {
 
	echo "<elements>";
	echo "<Enreg>";
	echo mysql_num_rows($requete1);
	echo "</Enreg>";
	$i=0;
 
	while ($row = mysql_fetch_object($requete1)) {
		if ($i==0) {
		echo "<champs>";
		echo $row->c_lieux;
		echo "</champs>";
		$i=$i+1;
		}
		echo "<champs>";
		echo $row->c_vacances;
		echo "</champs>";
		echo "<champs>";
		echo $row->c_debut;
		echo "</champs>";
		echo "<champs>";
		echo $row->c_fin;
		echo "</champs>";
	}
	echo "</elements>";
}
else
  {
	echo "<elements>";
	echo "<Enreg>";
	echo mysql_num_rows($requete1);
	echo "</Enreg>";
	echo "</elements>";
  }
?>
efrbeldin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 21h05   #8
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 566
Points : 1 566
Je pense que c'est lors du post via ajax que les " sont ajoutées. Utilises une des trois fonctions de ce lien sur chaque variable qui construit ton data
par exemple :


Code :
data = encodeURIComponent(chaine1)+encodeURIComponent(selzone)+encodeURIComponent(chaine2)+encodeURIComponent(selannee);
(et n'oublies pas d'utiliser mysql_real_escape_string dans tes requêtes, c'est important)
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 23h24   #9
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
Tout d'abord merci de consacrer autant de temps à mon problème. On avance mais ce n'est toujours pas cela.

En mettant ces fonctions, d'après firebug, le post passe en paramettre zone="Zone A"&annee="2011 - 2012"


Mais le $_POST['zone'] ne retourne rien du tout même chose pour l'autre variable. On obtient alors la requête :

select c_zone,c_annee,c_lieux,c_vacances,c_debut,c_fin from t_calendrier where c_zone='' and c_annee='' order by c_debut.

dur dur si tu as encore un atout je suis preneur
efrbeldin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 00h26   #10
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 566
Points : 1 566
Ha oui je t'ai dis d'utiliser ces fonctions sur tes variables mais je n'avais pas regardé suffisamment ton code pour mon exemple. En fait il faut écrire un truc dans le genre :
Code :
data: 'zone='+encodeURIComponent(selzone)+'&selzone='+encodeURIComponent(selannee);
encodeURIComponent uniquement sur les variables et pas sur le nom des variables

Si ça fonctionne toujours pas peut-être que c'est au moment de la récupération javascript que tu prends ces '"' ... fais afficher alert(selzone) pour vérifier.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 02h02   #11
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
Merci pour tout, je viens enfin de trouver et le problème se situait sur la récupération des valeurs dans le php en amont

selzone=document.getElementById("sel_zone").options[document.getElementById("sel_zone").selectedIndex].value;

Les guillemets se trouvaient déjà dans le champs sel_zone.
efrbeldin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h19.


 
 
 
 
Partenaires

Hébergement Web