Hello
je me casse un peu les dents sur une appli et je pense avoir pris le problème à l'envers.
Peut-être pourrez vous me remettre dans le droit chemin ...
J'ai créé une classe pour ma connexion MySQL. Cette classe a une méthode pour la connexion proprement dite, une pour l'exécution d'une requête, etc.
Je souhaite ajouter maintenant le moyen d'utiliser PDO. Par souci de compatibilité (je pense notamment à Free.fr chez qui j'ai constaté des comportements différents) je souhaite proposer le moyen "PDO" et le moyen "mysql_*" pour gérer les données. ça sera forcément l'un ou l'autre.
Et bien sûr, je ne veux pas faire 2 versions de chaque fichier ...
Intialement, donc je faisais:
$query = "SELECT ....."; // peu importe la requête, les variables étaient sécurisées, etc.
$conn = new ma_classe_mysql();
$conn->Execute($query);
ça me retourne un dataset que j'épluche comme ceci :
Code :
- while ($row = mysql_fetch_assoc($dataset))
- {
- ...
- }
|
tout ça fonctionne.
J'ai donc complété un peu ma classe MySQL en mettant une méthode d'exécution de requête avec PDO. L'implémentation fonctionne, je peux lui envoyer une requête et cette méthode appelle bien exec( ou query( selon ma requête. Et elle retourne un dataset.
Je ne souhaite pas modifier toutes mes pages, donc au lieu du "mysql_fetch_assoc" du dessus, j'ai créé une fonction comme ceci :
Code :
- function Mon_fetch_assoc($dataset)
- {
- if ($type == 'mysql')
- return mysql_fetch_assoc($dataset);
- else // PDO
- return $dataset->fetch(PDO::FETCH_ASSOC);
- }
|
Et du coup dans mon code j'épluche un dataset comme ceci :
Code :
- while ($row = Mon_fetch_assoc($dataset))
- {
- ...
- }
|
Et ça fonctionne toujours. En MySQL.
En PDO, ça fonctionne "bien" au départ (1ere requête qui me lit la config dans une table) et pour les requêtes suivantes ça ne marche pas.
Il y a donc sans doute un closeCursor à mettre qq part, mais je ne vois pas comment l'implémenter...
Voici la méthode d'exécution avec PDO :
Code :
- private function PDO_ExecuteQuery($query, $file, $line)
- {
- $firstletter = strtoupper($query[0]); // SELECT or other
- //if (isset($result))
- //$result->closeCursor();
- // exec or query ?
- if($firstletter == 'S')
- $result = $this->conn->query($query);
- else
- $result = $this->conn->exec($query);
- //$result->closeCursor();
- // return answer as dataset
- if ($result !== false)
- {
- // return dataset
- return $result;
- }
- else // log ERR query
- {
- }
- }
|
(j'ai laissé le minimum nécessaire)
J'ai tenté de le placer à plusieurs endroits, mais ça passe pas mieux ...
Vous avez dans la méthode les 2 endroits où j'ai essayé de le mettre, j'ai tenté après le "while" aussi, mais le pb c'est que je n'ai pas accès au $result.
C'est pour ça que je pense prendre mal le problème ... Doit y avoir une façon plus simple.
Une idée ? merci d'avance ...
---------------
NewsletTux - outil de mailing list en PHP MySQL