Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1737 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  une question de closeCursor ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

une question de closeCursor ?

n°2003123
NewsletTux
<Insérez ici votre vie />
Posté le 20-06-2010 à 20:25:26  profilanswer
 

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
mood
Publicité
Posté le 20-06-2010 à 20:25:26  profilanswer
 

n°2003169
rufo
Pas me confondre avec Lycos!
Posté le 21-06-2010 à 09:36:21  profilanswer
 

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
n°2003259
NewsletTux
<Insérez ici votre vie />
Posté le 21-06-2010 à 12:23:30  profilanswer
 

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
n°2003318
rufo
Pas me confondre avec Lycos!
Posté le 21-06-2010 à 14:08:26  profilanswer
 

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
n°2003339
NewsletTux
<Insérez ici votre vie />
Posté le 21-06-2010 à 14:38:50  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  une question de closeCursor ?

 

Sujets relatifs
Question sur les autotools[struts] question bête sur action
[RESOLU] question con mais utile image en htmlQuestion CSS : position:relative;top:-40px ... et gap de 40px
Question à intégrateurs HTML/CSSvoir 4 eme reponse probleme chonometre
Question sur le duo new/delete dans une foncitonQuestion de débutante, débutante, débutante
Question d'orientation !? 
Plus de sujets relatifs à : une question de closeCursor ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR