Procédure stockée MySQL/PHP

Fermé
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 - 1 juil. 2008 à 15:50
 Amarazak - 4 août 2009 à 16:30
Bonjour,

Je viens de faire une procédure stockée sous MySQL qui fonctionne très bien dans mon query browser mais quand je l'exécute à partir de PHP, il me renvoi un tableau d'enregistrement avec caractères quelques peu bizarre ...

<?
$dbh = new PDO('mysql:host=localhost;dbname='.$database, $username, $password);
$maproc = "CALL ps_chercher(ma, liste, de, param)";
$appelSP = $dbh->prepare($maproc);
$appelSP->execute();
while($row = $appelSP->fetchAll(PDO::FETCH_ASSOC)) print_r($row);
?>

La procédure s'exécute correctement et affiche bien le tableau mais avec des choses comme celles-ci : �
les données sont décalées par rapport aux clés du tableau, je peux par exemple avoir dans la clé 1 le début d'un ID et dans la clé 2 la fin du même ID ...

Je pense que cela pourrait venir d'un problème d'encodage des caractères du tableau ou du tableau lui même, mais impossible de trouver quoi que ce soit pour définir le type d'encodage directement dans la proc stock ou dans le PHP.

Si quelqu'un à une piste ou carrément pourquoi pas une solution, je suis preneur ;)

Merci d'avance

12 réponses

[o.o]REplay Messages postés 357 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
1 juil. 2008 à 15:54
Bonjour,

essaies:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Au debut de ta page.

:)
0
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 3
1 juil. 2008 à 15:59
Merci pour ta réponse.

Mais ca n'a rien a voir avec l'affichage en lui même, c'est en amont que les données ne sont pas bien encodées.
Soit dans la proc stock, soit dans la récupération en PHP.
Au niveau de la page il affiche bien ce qu'on lui donne, enfin presque, y'a un peu trop d'erreurs ...
0
[o.o]REplay Messages postés 357 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
1 juil. 2008 à 16:06
Essaies dans ce cas de faire un utf8_encode($tachaine de caractère) avant de l'afficher.

Sinon le mieux serai de faire des echo de tes chaines de caractères au fur et a mesure de leur manipulation, pour voir où ça ne va plus :)

++

~• Coin Coin •~
replay.homeunix.com
0
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 3
1 juil. 2008 à 16:22
En fait je vais reprendre:

Coté affichage tout se passe bien, il m'affiche bien le tableau dans le désordre avec des données incompréhensibles. Mais ce tableau lui est passé tel quel, donc on ne peut rien faire sur l'affichage.

C'est au niveau du traitement (PHP ou MySQL avec proc stock) que le problème intervient.
Il faudrait que je puisse définir le type d'encodage directement dans ma proc stock ou bien dans l'appel en PHP.
Et ca je ne sais pas comment faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 3
2 juil. 2008 à 10:30
up !
pliz ^^
0
[o.o]REplay Messages postés 357 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
2 juil. 2008 à 10:48
"[...] le mieux serai de faire des echo de tes chaines de caractères au fur et a mesure de leur manipulation, pour voir où ça ne va plus".

avant leur manipulation == avant leur stockage dans les tables..

As-tu essayé la fonction utf8_encode() comme je t'ai conseillé? essaie d'encoder directement les mots de tes tables avant de les afficher et dis moic e que ca donne.
0
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 3
2 juil. 2008 à 11:37
C'est justement ca le problème.

<?
$dbh = new PDO('mysql:host=localhost;dbname='.$database, $username, $password);
$maproc = "CALL ps_chercher(ma, liste, de, param)";
$appelSP = $dbh->prepare($maproc);
$appelSP->execute();
while($row = $appelSP->fetchAll(PDO::FETCH_ASSOC)) print_r($row);
?>

La proc stock me ramène les bons résultats bien codés, mais ds le traitement PHP, lors de la récupération c'est la qu'il merde. Et impossible de faire des echos avant le while .... ou alors je vois pas du tout ...

pour l'utf8_encode pareil, impossible de l'utiliser sauf dans le while et meme en affichant un élément du tableau ca ne change rien.

Je commence à desepérer ...
0
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 3
3 juil. 2008 à 10:39
Je commence à me demander si on peut bien récupérer un resultset en php avec une proc stock ...
0
[o.o]REplay Messages postés 357 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
3 juil. 2008 à 10:51
Yo,

Aucune idée, je ne sais pas ce qu'est une proc stock, mais a priori si tu affiche bien des résultats avec des données incompréhensibles, c'est que c'est possible. Est-ce que tous les caractères affichés sont comme ça, ou ça ne concerne que les accents?

++
0
flodotsoft Messages postés 70 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 juillet 2008 3
3 juil. 2008 à 11:00
non c'est aléatoire
certain accents passent bien, d'autres ne passent pas, mais c'est surtout qu'il mélange les colonne en piochant un peu partout.
enfin bon merci qd meme, je vais voir pour faire autrement ;)
0
Salut,
J'ai visiblement le même problème, tu as trouvé une solution ?

a+
0
login08 Messages postés 32 Date d'inscription vendredi 24 avril 2009 Statut Membre Dernière intervention 5 juin 2009 3
29 avril 2009 à 14:01
Dsl si je répond à côté car j'ai pas le temps de lire totalement le sujet. Mais si j'ai bien compris pour afficher une chaine de caractère en PHP sans être embêté par les caraactère spéciaux, il faut utiliser la fonction htmlentities

ex:

$chaine = "plein de é partout et de ç et de à";

echo htmlentities($chaine);
0
Salut,

Pour le htmlentities() il faut aussi que toutes les données de la base soient codées en HTML afin que la comparaison puisse être faite et certaine fois il bloquait sur le "&" donc je n'ai pas pu retenir cette solution.

Je me suis aperçu que MySQL zappait les accents, tu peux essayer de passer chaque paramètre dans cette fonction, qui effectue aussi un addslashes() :

<?
function stripAccents($str){
$str = htmlentities($str, ENT_NOQUOTES, "utf-8");
$str = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $str);
$str = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $str); // pour les ligatures e.g. 'œ'
$str = preg_replace('#\&[^;]+\;#', '', $str); // supprime les autres caractères
return addslashes($str);
}

$dbh = new PDO('mysql:host=localhost;dbname='.$database, $username, $password);
$maproc = "CALL ps_chercher(stripAccents($mes), stripAccents($paramètres))";
$appelSP = $dbh->prepare($maproc);
$appelSP->execute();
while($row = $appelSP->fetchAll(PDO::FETCH_ASSOC)) print_r($row);
?>
0
Essaye "SELECT * FROM taprocedure(et,tes,paramtres)"
0