[spip-dev] pour encapsuler les requetes sql ...

Juste histoire de mettre mon grain de sel après avoir lu la todolist ;

"on" (alias pas mal de mes camarades et moi même) utilise une classe
php pour encapsuler tous nos appels à une BD. C'est du GPL ... je
crois que la version originale vient de Rodolphe Quiedeville
(lolix.org). En tout cas, "on" l'utilise dans la pluspart de nos
projets.

Voici la version mysql de cette classe. Rodolphe a aussi une version
postgresql de cette même classe.

Il suffit de mettre une variable dans un fichier de config indiquant
quelle base/classe on utilise et de faire le require qu'il faut.

Si cette classe convient, je posterai la même pour postgres ainsi que
les modifs qui apparaitront de notre côté. N'hésitez pas à m'envoyer
vos propres modifs ... :slight_smile:

--mysql.class.php--
<?PHP
/*
* $Id: mysql.class.php,v 1.3 2002/02/06 16:02:45 shinobi Exp $

@ Arnaud Fontaine <arnaud@crao.net> :

"on" (alias pas mal de mes camarades et moi même) utilise une classe
php pour encapsuler tous nos appels à une BD. C'est du GPL ...
Voici la version mysql de cette classe. Rodolphe a aussi une version
postgresql de cette même classe.
Il suffit de mettre une variable dans un fichier de config indiquant
quelle base/classe on utilise et de faire le require qu'il faut.

On pourrait imaginer livrer les deux classes en standard, mais que l'install
par défaut utilise la classe mysql. Si quelqu'un veut utiliser postgresql,
il n'aurait pas une install tout à fait automatique, puisqu'il lui faudrait
d'abord aller trifouiller un fichier. Mais bref, ça pourrait coller.

Si cette classe convient, je posterai la même pour postgres ainsi que
les modifs qui apparaitront de notre côté. N'hésitez pas à m'envoyer
vos propres modifs ... :slight_smile:

1) Pourrais-tu nous dire comment il faudrait modifier nos appels à la base
    pour pouvoir l'utiliser ?

2) De notre côté, utilise-t-on des choses spécifiques à mysql ?

--mysql.class.php--
<?PHP

-- Fil

De notre côté, utilise-t-on des choses spécifiques à mysql ?

Oui, je le soulignais justement dans un autre message cet après-midi
d'ailleurs ... :wink:

Il me semble que la syntaxe de LIMIT n'est pas la même dans MySQL et
PostgreSQL par exemple ...

Nicolas.

@ Nicolas Hoizey <nhoizey@phpheaven.net> :

Il me semble que la syntaxe de LIMIT n'est pas la même dans MySQL et
PostgreSQL par exemple ...

Ca commence déjà à devenir chiant. La classe postgresql ne pourrait-elle pas
accepter nos requêtes mysql et les convertir comme il faudra, histoire qu'on
n'ait pas encore une contrainte de plus quand on programme - surtout Arno et
moi, qui déjà surnageons à grand peine dans le code ?

-- Fil

Ca commence déjà à devenir chiant.

Oui, c'est toute la difficulté d'utiliser une abstraction de SGBDR, et
à laquelle un projet comme PEAR DB tente de répondre ...

cf http://articles.phpheaven.net/article.php3?id_article=10

Si la compatibilité PHP3 est encore nécessaire, il faudrait essayer de
s'inspirer fortement de ce PEAR DB.

Nicolas.

Oui, c'est toute la difficulté d'utiliser une abstraction de SGBDR, et
à laquelle un projet comme PEAR DB tente de répondre ...

Il doit aussi y avoir les OPTIMIZE TABLE et autres INSERT DELAYED IGNORE...
(la création des tables peut-être aussi).

Il doit aussi y avoir les OPTIMIZE TABLE et autres INSERT DELAYED
IGNORE... (la création des tables peut-être aussi).

En effet ...

le Mon, 11 Feb 2002 17:30:37 +0100
Fil <fil@rezo.net> écrivait :

@ Nicolas Hoizey <nhoizey@phpheaven.net> :
> Il me semble que la syntaxe de LIMIT n'est pas la même dans MySQL et
> PostgreSQL par exemple ...

Ca commence déjà à devenir chiant. La classe postgresql ne pourrait-elle pas
accepter nos requêtes mysql et les convertir comme il faudra, histoire qu'on
n'ait pas encore une contrainte de plus quand on programme - surtout Arno et
moi, qui déjà surnageons à grand peine dans le code ?

Justement .. dans la classe mysql et la classe postgres, il y a un
certain nombre de fonctions pour la contruction de requètes, entre
autre pour gérer les problèmes de date, limit, etc ...

Par contre, je n'ai rien qui comblent les manques de l'un ou l'autre
système (problèmes de jointures, de requêtes imbriquées ...)

Dès que j'ai 5 minutes (hmm .. 10) je vous post quelques exemples avec
des requêtes tirées de SPIP ...

le Mon, 11 Feb 2002 17:23:45 +0100
Fil <fil@rezo.net> écrivait :

On pourrait imaginer livrer les deux classes en standard, mais que l'install
par défaut utilise la classe mysql. Si quelqu'un veut utiliser postgresql,
il n'aurait pas une install tout à fait automatique, puisqu'il lui faudrait
d'abord aller trifouiller un fichier. Mais bref, ça pourrait coller.

Même pas .. ça peut être demandé à l'install ... et stocker sa réponse
dans un fichier de config ou une variable sérialisée.

1) Pourrais-tu nous dire comment il faudrait modifier nos appels à la base
    pour pouvoir l'utiliser ?

Le principe :

  - créer un objet DbComm avec les paramètres de connexion.
  - séléctionner un base

(et hop ... dans $GLOBALS ...)

  - contruire sa requete en utilisant les fonctions fournies
    pour les histoires de date (pdate et fdate) et de limit (plimit).

  - exécuter la query (ou directement appeller get_object si on ne
    veux que la première réponse.

  - fetcher le résultat dans un objet ou un array (fetch_object ou fetch_array)

Bref, c'est de l'encapsulation de base ...

2) De notre côté, utilise-t-on des choses spécifiques à mysql ?

Tant que tu ne joues pas avec des jointures à gauches .. ou des
transactions (là, il n'y a plus de problème si on utilise innodb ou le
berkeley db de sleepy cat), bref, tout ce qui est SQL que l'un ou
l'autre ne gére pas .. tu peux t'en sortir sans soucis.

Comme SPIP n'a pas été fabriqué sur postgres, pas de soucis du côté de
l'aspect objet de postgres ... ouf :wink:

En fait, il faudrait extraire tout le SQL et faire un check ..