Quelle BDD pour PHP

Discussions à propos de MySQL, des autres bases de données existantes, et du langage SQL.

Modérateur : Modérateurs

Avatar de l’utilisateur
Gandalf
Sorcier des forums
Sorcier des forums
Messages : 2528
Inscription : jeu. 04 déc. 2003, 22:58

Messagepar Gandalf » jeu. 05 août 2004, 11:44

certes Madness, car tu es dans le monde Java, ce qui veut dire que tu utilises JDBC et sa magnifique couche d'abstraction au niveau des drivers de base de données, ce qui fait que le problème ne se pose pas.

Malheureusement, pour les développeurs PHP, les appels de fonctions sont beaucoup trop proches de l'API native de chaque serveur, il ya des fonctions mysql_connect, pg_connect..... et ainsi pour chaque bdd existante, ce qui fait que tout changement de moteur de base de données implique la modification du code PHP.

Bien sûr, il existe des alternatives, comme l'extension dbx, ou l'extension ODBC, ou encore les classes de bases de données de PEAR... mais nombre de programmeurs n'utilisent que les fonctions de mysql....

c'est à mon avis LE point faible de PHP depuis sa création qui reste encore à résoudre.
Celui qui détruit quelque chose pour savoir ce que c'est, a quitté le chemin de la sagesse.

Avatar de l’utilisateur
Aspegic500mg
Membre avancé
Membre avancé
Messages : 59
Inscription : ven. 05 nov. 2004, 11:01

Messagepar Aspegic500mg » sam. 06 nov. 2004, 18:01

Perso je pense me faire une liste de fonctions du genre bdd_connect, bdd_query, bdd_fetch_array ... et avec une simple variable codée en dur dans un fichier de config, je pourrai changer de bdd facilement (il suffit de mettre des switch dans chaque fonctions, et de rajouter les fonctions de chaque sgbd)

Avatar de l’utilisateur
Gandalf
Sorcier des forums
Sorcier des forums
Messages : 2528
Inscription : jeu. 04 déc. 2003, 22:58

Messagepar Gandalf » lun. 08 nov. 2004, 0:25

c'est lent les switch/case.... je te conseille de trouver un moyen plus perfectionné (comme une table contenant les fonctions à appeler... ou alors utiliser des classes)
Celui qui détruit quelque chose pour savoir ce que c'est, a quitté le chemin de la sagesse.

Avatar de l’utilisateur
Aspegic500mg
Membre avancé
Membre avancé
Messages : 59
Inscription : ven. 05 nov. 2004, 11:01

Messagepar Aspegic500mg » lun. 08 nov. 2004, 1:45

Le temps d'execution du code php est négligeable à coté du temps d'execution des requetes par le sgbd !

Je comprends pas l'interet de mettre les noms de fonctions dans une table, entre remplir un tableau avec les noms des fonctions appropriées au sgbd courant, ou faire un switch (ou du if/elseif, un peu plus rapide), la différence est minime.

Voici ma solution:

Code : Tout sélectionner


$sgbd = "mysql";

function bdd_fetch_array($req)
{
    if($sgbd == 'mysql') return mysql_fetch_array($req);
    elseif($sgbd == 'sqlite') return sqlite_fetch_array($req);
    elseif($sgbd == 'pgsql') return pg_fetch_array($req);
}
function bdd_num_rows($req)
{
    if($sgbd == 'mysql') return mysql_num_rows($req);
    elseif($sgbd == 'sqlite') return sqlite_num_rows($req);
    elseif($sgbd == 'pgsql') return pg_num_rows($req);
}

// etc etc...


Pour la solution du tableau, j'espere que tu n'utilise pas quelque part un eval, car c'est hyper-lent (le eval n'est vraiment pas négligeable en temps d'execution)

Avatar de l’utilisateur
Gandalf
Sorcier des forums
Sorcier des forums
Messages : 2528
Inscription : jeu. 04 déc. 2003, 22:58

Messagepar Gandalf » mar. 16 nov. 2004, 15:53

cette solution n'est pas très optimisée :)

si tu utilise pgsql, tu vas tomber à la fin du if/else, et faire plein de tests inutiles, alors que mysql sera plus rapide... c'est tout à fait inacceptable d'avoir des scripts dont la vitesse va varier en fonction du nom de la bdd utillisée !

Ca ne ralentit pas le script tant que ça, mais dans un environnement de production avec un grand nombre de requêtes par secondes et si chaque requête fait appel à ces fonctions plusieurs fois, ton serveur va le sentir passer, surtout s'il y a beaucoup de SGBD dans ta liste.

Code : Tout sélectionner

$sgbd = "mysql";

$tpl_fetch_array = array(
    "mysql" => "mysql_fetch_array",
    "sqlite" => "sqlite_fetch_array",
    "pgsql" => "pg_fetch_array"
);

function bdd_fetch_array($req)
{
    return $tpl_fetch_array[$sgbd]($req);
}


ici, le tableau ne sera créé qu'une fois lors de l'include (au lieu d'avoir à faire le if/else à chaque appel de fonction), et l'accès à celui-ci est très rapide, donc le temps d'accès à la bonne fonction est réduit, et reste le même quel que soit le SGBD, grâce au principe de la table de hashage.

Cette approche gagne d'autant plus de performances que le nombre de SGBD est important.

(cet exemple utilise les fonctions variables qui sont beaucoup plus performantes que l'appel de eval)
Celui qui détruit quelque chose pour savoir ce que c'est, a quitté le chemin de la sagesse.

Avatar de l’utilisateur
Aspegic500mg
Membre avancé
Membre avancé
Messages : 59
Inscription : ven. 05 nov. 2004, 11:01

Messagepar Aspegic500mg » jeu. 12 mai 2005, 3:13

ah j'avais pas vu la réponse, en effet tu as raison, c'est mieux ainsi :)


Revenir vers « SQL »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités