Sqlal : classe sql pour mysql, mysqli, sqlite, sql server, et odbc

Soyez le premier à donner votre avis sur cette source.

Vue 5 813 fois - Téléchargée 401 fois

Description

Bonjour à tous!

Depuis le temps que je viens prendre des scripts à droite à gauche sur ce site, il est temps que je poste mon premier!

SQLAL : SQL Abstraction Layer
Il s'agit d'une classe PHP permettant, via un jeu de méthodes unique, de piloter au choix l'une des BDD suivantes :
MySQL(i), SQLite, SQL Server (mssql), et ODBC.

Vous trouverez deux fichiers : Le code de la classe, et un fichier texte expliquant comment utiliser la classe.
Si vous préférez, la classe est entièrement documentée pour Doxygen. Il vous suffit donc de la passer dans la moulinette doxygen pour avoir la doc complète. ;)

Merci d'avance pour vos commentaires & suggestions. ;)

Boris

Source / Exemple :


<?php

require_once("sqlal.class.php");

$mode_sql = "mysql"; // ou mysqli, mssql, sqlite, odbc
$dbhost = "localhost";
$dblogin = "login";
$dbpass = "password";
$dbname = "ma_base";

$sql = new sqlal($mode_sql, $dbhost, $dblogin, $dbpass, $dbname);

// Utilisation simple
$sql->query("SELECT nom, prenom FROM users;");
while($ligne = $sql->fetch_assoc()) {
    echo $ligne["nom"]." ".$ligne["prenom"]."<br />";
}

// Utilisation avec deux requêtes imbriquées
// Les requêtes ne veulent pas dire grand chose, c'est juste pour exemple. ;) 
$sql->query("SELECT id FROM table_1 WHERE champ1 = '50';", "requete1");
while(list($id) = $sql->fetch_row("requete1")) {
    $sql->query("SELECT nom, prenom FROM table_2 WHERE champ2 = '".$id."';", "requete2");
    $resultat = $sql->fetch_assoc("requete2");
    echo $resultat["nom"]." ".$resultat["prenom"]."<br />";
}

// Statistiques
echo "<br />Nombre de requêtes SQL : ".$sql->get_nb_sql_query()."<br />";
echo "Temps d'exécution SQL en secondes : ".$sql->get_sql_query_time(); // Ou encore $sql->get_sql_query_time("s")
echo "Temps d'exécution SQL en milli-secondes : ".$sql->get_sql_query_time("ms");

?>

Conclusion :


Il ne s'agit pas d'une solution "parfaite", mais je pense que c'est déjà un bon début pour améliorer la portabilité d'un logiciel.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
Et sinon il y a PDO ;)
http://php.net/pdo
cs_Boris090
Messages postés
4
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
16 mars 2009

Oui, si votre hébergeur propose l'extension... ;) Mon objectif, c'est toujours un maximum de compatibilité sur tous les types de serveurs, qu'ils soient gratuits, payants, professionnels, etc... ;)
Là, ça demande PHP5, point final. (et PHP 5 est maintenant sur la quasi totalité des serveurs, contrairement à PDO)

Après, oui, pour une appli destinée à tourner sur un serveur dédié, c'est clair que PDO est bien plus riche en fonctionnalités, mais c'est aussi plus complexe. ;)
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
18
Hello,

il manque au moins 2 choses à ta classe :
- des fonctionnalités plus riches que ce que n'offre les extensions utilisées (ça, c'est un plus)
- une notion d'abstraction : si on veut ajouter un moteur DB à ta classe, il faut modifier toute la classe (ça, c'est vital); alors qu'une modification toute conne serait déjà un pas en avant vers une classe intéressante, et vers une meilleure utilisation de ta part de la POO :
abstract class db {
abstract public function query($sQuery);
}

class mysql extends db {
public function query ($sQuery) {
return mysql_query($sQuery);
}
}

class mssql extends db {
public function query ($sQuery) {
return mssql_query($sQuery);
}
}

C'est juste un exemple hein...pour montrer comment peut fonctionner une abstraction.
cs_eltyty
Messages postés
86
Date d'inscription
mercredi 31 janvier 2007
Statut
Membre
Dernière intervention
22 novembre 2011

J'essaie de l'adapter mais j'ai des prooblèmes. Voici l'erreur classique mais j'arrive pas à trouver :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /sql_class.php on line 119

et ton code allégé :

$sql->query("SELECT id, login FROM t_utilisateur");
while($ligne = $sql->fetch_assoc()) {
$this->content .= $ligne["id"]." ".$ligne["login"]."
";
}

pour le fichier sql_class :

/*!
* \fn query($query, $idRequete = 0)
* \param $query Requête SQL
* \param $idRequete ID de requête (pour gérer plusieurs requêtes SQL en même temps)
* \return Booléen
* \brief Exécute une requête SQL
*/
public function query($query, $idRequete = 0) {
$this->sql_count += 1;
if($this->debug) {
$retour= " -::[Requete SQL (ID : ".$idRequete.") : ".$query."]::-
\n";
return $this->message_requete =$retour;
}
$time_start = microtime(true);
$this->sql_results[$idRequete] = mysql_query($query, $this->sql_link);
$time_end = microtime(true);
$this->sql_time += $time_end - $time_start;
return (bool)$this->sql_results[$idRequete];

}
/*!
* \fn fetch_assoc($idRequete = 0)
* \param $idRequete ID de requête (pour gérer plusieurs requêtes SQL en même temps)
* \return Tableau associatif
* \brief Retourne un résultat de requête SQL sous forme de tableau associatif
*/
public function fetch_assoc($idRequete=0) {
return mysql_fetch_assoc($this->sql_results[$idRequete]);
}

Pourriez-vous m'aider.
merci d'avance.
cs_Boris090
Messages postés
4
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
16 mars 2009

Hello Eltyty.

C'est la seule requête dans ton code? Si non, les autres fonctionnent-elle?
As-tu essayé d'activer le mode debug (param optionnel à la création de l'objet) pour vérifier que tout se passe bien (à la connexion, entre autre).

As-tu essayé de rentrer ta requête SQL directement dans un phpmyadmin, pour être sûr que ça ne vienne pas de la requête elle-même?

Pour pas polluer les commentaires, recontacte moi par message privé, on postera ici uniquement la solution (pour les autres).

--------------------
>Malalam : Tout à fait d'accord avec toi sur le principe, mais ça ne correspond pas à mon objectif.
Perso, j'ai fait cette classe entre autre parce que dans un logiciel, j'ai besoin d'une connexion à mysql(i) et d'une connexion ODBC sur un mdb en même temps. Et je n'avais pas envie de me saoûler avec 50 fonctions, 50 bibliothèques, etc...
Là, en gros, ce que tu me proposes, c'est de faire une classe pour chaque serveur, la classe abstraite n'étant alors qu'une sorte de prototype (comme en C avec les fonctions), qui ne sert à pas grand chose d'autre qu'imposer la déclaration des méthodes avec leurs paramètres.

Pour moi, l'objectif était d'avoir une seule et unique bibliothèque qui gère le maximum de serveurs. J'ai codé en objet parce que ça s'y prêtait bien, mais si la programmation te semble trop peu orthodoxe, je peux le refaire en linéaire avec des fonctions! Mais le code sera un peu plus lourd, et moins pratique.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.