8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je me tire les cheveux en essayant de trouver une solution qui est sans doute simple mais que je ne vois pas.


<?php 

// Déclaration des paramètres de connexion
try
{
$bdd = new PDO("mysql:host=$host; dbname=***********", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}
$req = $bdd->query("SELECT * FROM `annu` WHERE region='Provences-Alpes-Côte d'Azur' ORDER BY `id`");

$sth = $bdd->prepare($query);
$sth->execute(array('Provences-Alpes-Côte d'Azur' => $provencealpescotedazur)); 

// Recuperation des resultats
while($tab = $req->fetch(PDO::FETCH_ASSOC))
{
?>


Je suis persuadé que mon erreur provient de l'apostrophe se trouvant dans ma requête.
J'ai donc essayé plusieurs solutions trouvés sur des forums avec "replace", "bindvalue" ou encore avec "mysql_real_escape_string" mais ma page n'affiche pas les résultats de ma bdd.

auriez-vous une idée ?
Merci pour votre future aide
Administrateur
Bonjour,

Attention l'usage de PDO me semble erroné, et il ne faut pas le mélanger avec mysql_real_escape_string qui relève d'une autre version de la bibliothèque.

Suggestion :

$req = $bdd->query("SELECT * FROM `annu` WHERE region=:region ORDER BY `id`");

$sth = $bdd->prepare($query);
$sth->execute(array('region' => 'Provences-Alpes-Côte d\'Azur')); 
dew a écrit :
Bonjour,

Attention l'usage de PDO me semble erroné, et il ne faut pas le mélanger avec mysql_real_escape_string qui relève d'une autre version de la bibliothèque.

Suggestion :

$req = $bdd-&gt;query("SELECT * FROM `annu` WHERE region=:region ORDER BY `id`");

$sth = $bdd-&gt;prepare($query);
$sth-&gt;execute(array('region' =&gt; 'Provences-Alpes-Côte d\'Azur')); 



Bonjour Dew, merci de ta réponse, mais je n'ai pas de retour de ma base de donnée.
Administrateur
Pour voir s'il y a une erreur retournée du côté SQL

print_r($sth->errorInfo());
dew a écrit :
Pour voir s'il y a une erreur retournée du côté SQL

print_r($sth-&gt;errorInfo());


j'ai le message suivant qui s'affiche :


Array ( [0] => 42000 [1] => 1065 [2] => Query was empty )
$sth->execute(array("region" => "Provences-Alpes-Côte d'Azur")); 


et avec des doubles quotes ?

ou un

$sth->execute(array("region" => "Provences-Alpes-Côte d&quot;Azur")); 

Modifié par JENCAL (05 Oct 2015 - 14:57)
JENCAL a écrit :
$sth-&gt;execute(array("region" =&gt; "Provences-Alpes-Côte d'Azur")); 


et avec des doubles quotes ?

ou un

$sth-&gt;execute(array("region" =&gt; "Provences-Alpes-Côte d&amp;quot;Azur")); 


exactement les mêmes résultats !
ça ne marche pas
du coup quand tu essaye avec une autre région cela marche ?

quand tu consulte t'a base de donnée, tu vois bien l'apostrophe ?
JENCAL a écrit :
du coup quand tu essaye avec une autre région cela marche ?



>>Oui ma requète fonctionne parfaitement bien pour toutes les autres régions sauf la Provence-Alpes-Côte d'Azur


JENCAL a écrit :
quand tu consulte t'a base de donnée, tu vois bien l'apostrophe ?


>>l'apostrophe est bien là !!

une idée ?
Modifié par dafid5 (05 Oct 2015 - 15:34)
JENCAL a écrit :
3 méthodes à tester :

htmlspecialchars()

htmlentities()

utf8_encode().


Comment dois-je tester ces 3 méthodes, je débute en php
JENCAL a écrit :
peux tu re uploader ton code ici ?



<?php 

// Déclaration des paramètres de connexion
try
{
$bdd = new PDO("mysql:host=$host; dbname=***********", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}
$req = $bdd->query("SELECT * FROM `annu` WHERE region='Provences-Alpes-Côte d'Azur' ORDER BY `id`");

$sth = $bdd->prepare($query);
$sth->execute(array('Provences-Alpes-Côte d'Azur' => $provencealpescotedazur)); 

// Recuperation des resultats
while($tab = $req->fetch(PDO::FETCH_ASSOC))
{
?>
Bonjour, ton code initial n'est pas bon:

Par exemple:
$sth = $bdd->prepare($query);
$query n'existe pas ... Es-tu sûr d'avoir testé ?
$sth->execute(array('Provences-Alpes-Côte d'Azur' => $provencealpescotedazur)); 
???

Sinon, je pense que le problème peut venir de l'encodage:

$bdd = new PDO('mysql:host=localhost;dbname=interface', 'root', '',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

$req = "SELECT * FROM regions where nom = :valeur";
$sth = $bdd->prepare($req);
$sth->execute(array(':valeur' => 'Midi-Pyrénées'));

$result = $sth->fetchAll();

var_dump($result);
Sans UTF-8, ça ne marche pour aucun caractère accentué. Pour Paca, $sth->execute(array(':valeur' => 'Provence Alpes Côte d\'Azur'));



Testé avec une table trouvée ici: http://www.ligams.com/blog/serveur-web/regions-departements-de-france-sql. Ce qui m'a permis de découvrir PDO ... Dommage que l'on ne puisse pas imprimer la requête finale.
Modifié par loicbcn (06 Oct 2015 - 08:58)
+1,

soit tu encode en utf8 la requête, via ce que loicbcn t'a passé, soit les paramètre, via utf8_encode();
loicbcn a écrit :
Es-tu sûr d'avoir testé ?

Oui mon code fonctionne très bien pour toutes mes autres requêtes et sur l'ensemble de mes sites.
exemple : http://dieteticien-nutritionniste-sante.com/v2/annuaire-dieteticien/dieteticien-nord-pas-de-calais.php


$sth-&gt;execute(array('Provences-Alpes-Côte d'Azur' =&gt; $provencealpescotedazur)); 
???
loicbcn a écrit :

Sinon, je pense que le problème peut venir de l'encodage:

$bdd = new PDO('mysql:host=localhost;dbname=interface', 'root', '',array(PDO::MYSQL_ATTR_INIT_COMMAND =&gt; "SET NAMES utf8"));

$req = "SELECT * FROM regions where nom = :valeur";
$sth = $bdd-&gt;prepare($req);
$sth-&gt;execute(array(':valeur' =&gt; 'Midi-Pyrénées'));

$result = $sth-&gt;fetchAll();

var_dump($result);
Sans UTF-8, ça ne marche pour aucun caractère accentué. Pour Paca, $sth-&gt;execute(array(':valeur' =&gt; 'Provence Alpes Côte d\'Azur'));

Mais ma requête a déjà : (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); pour justement ces problèmes de caractères .
JENCAL a écrit :
+1,

soit tu encode en utf8 la requête, via ce que loicbcn t'a passé, soit les paramètre, via utf8_encode();


Bonsoir, mais j'encode déjà en utf-8 je ne comprend pas vos remarques !!

$bdd = new PDO("mysql:host=$host; dbname=***********", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

de plus ma page est en utf-8 ainsi que ma bdd !!

que dois-je faire de plus ?
Tout le monde est parti en déroute totale.

L'erreur provient d'une confusion entre requêtes directes et préparées. On utilise la méthode PDO::query pour faire une requête directe, et un objet résultat est retourné.

A ce stade du code ($bdd->query(...)), on exécutes une requête incorrecte puisque la forme nom=:valeur est spécifique à PDO. $query=null donc.

Par voie de conséquence, on prépare une requête vide (conversion null->chaîne vide). $sth = un objet requête préparée certes valide mais exécutant une requête vierge . D'où l'erreur query was empty; qui ne s'est malheureusement vu qu'à l'exécution effective.

Suggestions :
1 - Activer les warnings et notice; en les affichant tous, à mon avis, l'erreur aurait dû se voir beaucoup plus vite. La conversion implicite null->chaîne vide doit mettre la puce à l'oreille.
2 - Faire directement $sth = $bdd->prepare($query) avec $query contenant la string de la requête et non pas un résultat précédent qui de plus est incorrect. Ne pas utiliser la méthode $bdd->query qui ne sert à rien ici puisqu'on fait des requêtes préparées.
QuentinC a écrit :

2 - Faire directement $sth = $bdd-&gt;prepare($query) avec $query contenant la string de la requête et non pas un résultat précédent qui de plus est incorrect. Ne pas utiliser la méthode $bdd-&gt;query qui ne sert à rien ici puisqu'on fait des requêtes préparées.


Bonsoir,

Je pense avoir suivi vos conseils en regroupant les conseils proposés :

<?php 

// Déclaration des paramètres de connexion

try
{
$bdd = new PDO("mysql:host=$host; dbname=****************", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}
$query= "SELECT * FROM `annuaire-diet` WHERE region='region' ORDER BY `id`";
$sth = $bdd->prepare($query);
$sth->execute(array("region" => "Provence-Alpes-Côte d'Azur")); 

while($tab = $sth->fetch(PDO::FETCH_ASSOC));
{


Ma page affiche bien la partie HTML mais vide !!!!! alors que ma bdd est bien remplie

Je pense que l'on a traité qu'une partie du problème, mais que l'histoire de l'apostrophe reste la cause principale. Cependant je ne vois pas comment un caractère peut m’embêter alors que j'utilise (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
Modifié par dafid5 (07 Oct 2015 - 22:09)
Y a-t-il une erreur avec ton nouveau code ?
Vérifie avec la méthode errorInfo.
Modifié par QuentinC (07 Oct 2015 - 23:04)
Pages :