Procédure stockée MySQL/PHP
flodotsoft
Messages postés
70
Date d'inscription
Statut
Membre
Dernière intervention
-
Amarazak -
Amarazak -
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
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
A voir également:
- Procédure stockée MySQL/PHP
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Expert php pinterest - Télécharger - Langages
- Procédure de frigo vide ✓ - Forum Consommation & Internet
- Le point d'entree de procedure est introuvable kernel32 dll ✓ - Forum Windows
12 réponses
Bonjour,
essaies:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Au debut de ta page.
:)
essaies:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Au debut de ta page.
:)
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 ...
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 ...
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
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
"[...] 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.
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.
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 ...
<?
$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 ...
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?
++
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?
++
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 ;)
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 ;)
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);
ex:
$chaine = "plein de é partout et de ç et de à";
echo htmlentities($chaine);
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);
?>
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);
?>