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 ...


1ere méthode avec PDO, qui est buggée, donc normal que ca ne fonctionne pas à priori :
<?php
$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);
?>

2eme méthode avec mysqli :
<?php
    $link = mysqli_connect("localhost", $username, $password, $database);
    $query = "CALL ps_chercher(ma, liste, de, param);";
    $stmt = mysqli_prepare($link, $query);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $1, $2, $3, $4, $5);
    while (mysqli_stmt_fetch($stmt)) {
        printf ("%s - %s - %s - %s - %s<br>", $1, $2, $3, $4, $5);
    }
    mysqli_stmt_close($stmt);
    mysqli_close($link);
?>
La procédure s'exécute correctement et affiche bien le tableau mais avec des choses comme celles-ci : &#65533;
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
Modérateur
Salut flodotsoft et bienvenue sur le forum,

Est ce dans le code source de la page html ou à l'affichage ? Je peux te conseiller d'utiliser la fonction html_decode() qui permet de faire l'inverse de htmlentities().

Sinon en faisant une « chtite » recherche sur glouglou, je suis tombé sur ce lien en faisant cette recherche.

Espérant t'avoir aiguiller,
Bonne soirée à toi Smiley smile


@+
Salut,
merci pour ta réponse.

Les caractères "bizarres" apparaissent directement dans le code source, donc les fonctions html_entity_decode, stripslashes ... ne changent rien.
Le problème vient du PHP qui doit mal récupérer le resultset.

J'ai déjà chercher pas mal sur googueule, mais impossible de trouver un brin de solution, ni dans les liens que tu m'as fourni.

Je pense qu'il doit y avoir une méthode ou fonction dans la classe mysqli qui permettrait de gérer l'encodage, ou directement dans la procédure mais je ne voit pas comment ...

++
Salut,

Oui c'est ce que j'ai pensé au début, mais le problème est que le mauvais encodage (si l'erreur vient de là) se produit lors de la récupération du resultset par PHP.
Et je ne sais pas comment le définir lors de cette récupération ou directement dans la proc stock.
D'où proviennent les données ? C'est toi qui as la main sur le formulaire et l'encodage ? Quel est l'encodage des tables ?

A tout hasard, si tes données sont en utf-8 tu pourrais spécifier, juste après la connexion à ta base
mysqli_query("SET NAMES UTF8");

Sinon je déplacerai dans le Salon dédié à l'encodage...
Mes données viennent de ma base MySQL. Elles sont récupérées par une procédure stockée qui est appelée dans le PHP à l'aide du code ci-dessus.
Je te mets ma procedure au cas ou :

DELIMITER $$
DROP PROCEDURE IF EXISTS `ps_chercher` $$
CREATE DEFINER=`root`@`%` 
PROCEDURE `ps_chercher`(IN email VARCHAR(100), IN maville VARCHAR(100))
BEGIN

DECLARE SQLString VARCHAR(500);
SET @SQLString=CONCAT('SELECT id, nom, prenom 
FROM users 
WHERE (mail = ',email,' OR mail = \'\') 
AND (ville = ',maville,' OR ville = \'\')');

PREPARE rp FROM @SQLString;
EXECUTE rp;
DROP PREPARE rp;
END $$
DELIMITER ;


J'ai la main sur tout.
Les tables sont encodées en "Latin1".

Pour le mysqli_query ca ne fonctionne pas non plus ... Smiley decu
Mais je pense tout de même que ca reste un problème d'encodage.
Modifié par flodotsoft (08 Jul 2008 - 14:16)
Bonjour,

Je suppose que PHP te sors une page HTML? Dans ce cas:
- quel est l'encodage déclaré dans les en-têtes HTTP pour cette page (s'il y en a un)?
- quel est l'encodage déclaré dans le contenu HTML de la page (s'il y en a un)?
- quel est l'encodage utilisé par le navigateur pour afficher la page?
- qu'est-ce que ça donne si tu forces l'utilisation d'un encodage différent (en testant les suspects habituels: UTF-8, ISO-8859-1, WINDOWS-1252)?

Si la dernière étape ne donne rien de concluant alors les données qui sont récupérées par PHP sont sans doute corrompues, ce qui signifie que:
- soit elles sont enregistrées sous une forme corrompue dans la base;
- soit elles sont corrompues par MySQL à cause d'une connexion qui se fait dans le mauvais encodage.

Si tes données sont réellement en latin1 (ce qui n'est pas garanti par le fait qu'elles aient été créées en latin1, car en effet rien n'empêche d'ouvrir une connexion latin1 et d'injecter des données dans un autre encodage), un SET NAMES utf8 n'a aucun intérêt. Il te faudrait plutôt un SET NAMES latin1, bien que les connexions avec MySQL se font par défaut en latin1 dans la quasi-totalité des cas.
Modifié par Florent V. (08 Jul 2008 - 15:22)
Salut,

Mes pages HTML sont encodées en iso-8859-1.
J'effectue chaque test sur Firefox et IE7 dans leur paramétrage par défaut.
Même en changeant l'encodage des en-têtes de ma page ca ne change rien.

Mes données ne sont pas corrompues en base et la connexion/insertion de données se fait, tout comme la création de table, dans la plus grande simplicité, avec l'encodage par défaut.

C'est pour cela que je me penchais plus sur le fait que ce soit PHP avec la classe mysqli qui repcpère ou interprète mal le resultset de la proc stock.
Bon j'ai essayé d'afficher seulement un ID dans mon SELECT.
Il me retourne le bon nombre de lignes, par contre le premier ID est vide (^^) et les autres sont faux, c'est meme n'importe quoi : 959920438 au lieu de 869791 !!!
Bonjour,

J'ai trouvé une piste !!!

L'erreur vient du fait que ds ma procedure je stocke ma requete ds une chaine de caractères avec un CONCAT. Ex :

SET @SQLString = CONCAT('SELECT * FROM ma table WHERE id=',monid);

Il ya un probleme avec PHP pour exécuter ca.
Quelqu'un connaitrait-il un moyen de contourner ce CONCAT ?