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

Soyez le premier à donner votre avis sur cette source.

Vue 5 930 fois - Téléchargée 423 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

Messages postés
86
Date d'inscription
mercredi 31 janvier 2007
Statut
Membre
Dernière intervention
22 novembre 2011

En fait, je vous explique le principe. Je suis en train de refaire mon site et de mettre à profit la notion de php5. Mais je suis autodidacte et j'ai un peu de mal à tout bien assimiler.
Je cherchais une manière de diminuer les requêtes par page et ton script ma semblé être une bonne solution.
J'ai réussi au bout d'un moment à trouver l'erreur : return $this->message_requete=$retour; au lieu de $this->message_requete=$retour; tout court.

J'aimerai gagner un max de temps quand je refais mes sites et je cherche un peu d'aide sur l'utilisation de requête sql et de class.
En tout cas merci pour ce code car ça m'aide à voir plus clair. et si qq'un se sent le courage de m'aider à apprendre comment utiliser au mieux php5 : MERCI
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.
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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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.
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. ;)
Afficher les 6 commentaires

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.