une question de closeCursor ?

une question de closeCursor ? - PHP - Programmation

Marsh Posté le 20-06-2010 à 20:25:26    

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 :
  1. while ($row = mysql_fetch_assoc($dataset))
  2. {
  3.     ...
  4. }


 
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 :
  1. function Mon_fetch_assoc($dataset)
  2. {
  3.     if ($type == 'mysql')
  4.         return mysql_fetch_assoc($dataset);
  5.     else // PDO
  6.         return $dataset->fetch(PDO::FETCH_ASSOC);
  7. }


 
Et du coup dans mon code j'épluche un dataset comme ceci :

Code :
  1. while ($row = Mon_fetch_assoc($dataset))
  2. {
  3.     ...
  4. }


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 :
  1. private function PDO_ExecuteQuery($query, $file, $line)
  2.  {
  3.   $firstletter = strtoupper($query[0]); // SELECT or other
  4.   //if (isset($result))
  5.    //$result->closeCursor();
  6.   // exec or query ?
  7.   if($firstletter == 'S')
  8.    $result = $this->conn->query($query);
  9.   else
  10.    $result = $this->conn->exec($query);
  11.   //$result->closeCursor();
  12.   // return answer as dataset
  13.   if ($result !== false)
  14.   {
  15.    // return dataset
  16.    return $result;
  17.   }
  18.   else // log ERR query
  19.   {
  20.   }
  21.  }


(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
Reply

Marsh Posté le 20-06-2010 à 20:25:26   

Reply

Marsh Posté le 21-06-2010 à 09:36:21    

Je pense que ta fonction de récup d'enregistrements trouvés devrait lire le dataset et le retourner dans un tableau asociatif du genre :
array("NomChamp1" => array(), "NomChamp2" => array()...);
 
Comme ça, plus de pb.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-06-2010 à 12:23:30    

Merci de ta réponse.
 
Sur le principe, je suis bien de ton avis, seulement les champs ne sont pas tous les mêmes à chaque exécution, et parfois je fais des tableaux multidimensionnels (genre un tableau dont les indices sont les ID_user et les valeurs un sous tableau contenant les autres champs) quand j'ai une "liste d'objets".
Le souci c'est que même sans aller jusqu'à ce "formatage" du tableau en sortie, c'est la 2nde requête qui ne s'exécute pas.
 
Je viens de creuser un peu le souci de Free : PDO est juste dispo pour SQLite, et pas pour MySQL. ça règle le pb ... Je vais devoir faire 2 versions de l'appli alors :/


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 21-06-2010 à 14:08:26    

ben t'as qu'à faire une couche d'abstraction (comme PEAR:DB, par ex) qui t'affranchit de ce genre de problématique (voire même faire du MVC). Pas besoin de faire 2 applis :/ Ta couche modèle récupère les infos et les passent au contrôleur qui les passe à la vue.
 
Edit :

Citation :


seulement les champs ne sont pas tous les mêmes à chaque exécution,  


Je me doute bien, donc suffit de récupérer le nom des champs retournés par le SELECT. Pour ça, ça dépend du sgbd utilisé. Perso, j'ai bien fait une fonction qui retourne dans un tableau le contenu d'une table donnée (avec possibilité de ramener que certains champs). C'est donc pas la mère à boire ;)


Message édité par rufo le 21-06-2010 à 14:11:28

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-06-2010 à 14:38:50    

J'essaie autant que possible de me rapprocher du MVC, donc je vais continuer à creuser un peu.
 
Je vais p-ê faire une classe d'abstraction de ma DB aussi.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed