begin process at 2010 03 21 16:43:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

SQL

 > SQLAL : CLASSE SQL POUR MYSQL, MYSQLI, SQLITE, SQL SERVER, ET ODBC

SQLAL : CLASSE SQL POUR MYSQL, MYSQLI, SQLITE, SQL SERVER, ET ODBC


 Information sur la source

Note :
Aucune note
Catégorie :SQL Classé sous :mysql, abstraction, classe sql, sql server Niveau :Débutant Date de création :10/03/2009 Date de mise à jour :10/03/2009 04:54:36 Vu / téléchargé :2 159 / 162

Auteur : Boris090

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 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

  • <?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");
  • ?>
<?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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 mars 2009 00:36:38 :
Affichage du code d'un exemple, plutôt que le code de la classe qui fait 3 kilomètres...
10 mars 2009 04:54:37 :
Correction d'une erreur pour odbc.

 Sources de la même categorie

Source avec Zip Source avec une capture CRÉER ET ETABLIR UNE PAGE DE MAINTENANCE POUR X HEURES par popolino0
Source avec Zip Source avec une capture ENREGISTRER ET AFFICHER UN BLOB (MYSQL) par jmpicot
SEARCH QUERY COMPOSER par Centauriel
COMPTEUR DE VISITEUR : PHP ET MYSQL par didguess
Source avec Zip SE CONNECTER À DISTANCE AU SERVEUR SQL DE FREE.FR (SQL.FREE.... par pifol

 Sources en rapport avec celle ci

Source avec Zip CHARGER DES DONNÉES DEPUIS UN FICHIER TXT DANS UNE BASE DE D... par ig3
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip Source avec une capture ENREGISTRER ET AFFICHER UN BLOB (MYSQL) par jmpicot
Source avec Zip GESTION_ENSEIGNANTS par Elmarzougui
Source avec Zip CLASSE BASE DE DONNEES , EX AVEC MYSQL & MSSQL [PHP5 & PHP4] par malalam

Commentaires et avis

Commentaire de codefalse le 10/03/2009 12:14:03 administrateur CS

Et sinon il y a PDO ;)
http://php.net/pdo

Commentaire de Boris090 le 10/03/2009 12:28:48

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. ;)

Commentaire de malalam le 12/03/2009 22:24:13 administrateur CS

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.

Commentaire de eltyty le 16/03/2009 21:08:09

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"]."<br />";
}

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= "<b>-::[Requete SQL (ID : ".$idRequete.") : </b>".$query."<b>]::-</b><br />\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.

Commentaire de Boris090 le 16/03/2009 21:59:41

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.

Commentaire de eltyty le 16/03/2009 22:46:18

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

psSql > mySql [ par Nico ] Quelqu'un connaît-il un moyen de travailler avec les deux bases indifféremment avec php. (pour la même application)ou bien je doit tout traduire ??Mer MySql config ? [ par holger ] J'auyrai souhaiter savoir si il était possible de fairetourner MySql sur un ordi tout pourrit :PC 200Mx 48Mo Ram Edo sous Windows 95Merci,Un lyonnais statistiques ,graphique, php et mysql [ par mouss ] connaissez vous des exemples mettant en oeuvre une base de donnée mysql ,php permettant de créer des courbes, nuages de points sur une feuille html (p PB update table mysql ! [ par lolo ] Comment pourrai-je faire pour mettre à jour une table mysql par le biais d'un formulaire (parcourir ...*.cvs) et d'un fichier php d'update de table my php et mysql [ par stephane ] bonjour,j'ai des pb d'acces aux base de donnees, je suis sur free donc le 'host' est ftpperso.free.fr enfin ca c'est bon j'ai bien mis mon login et pa php et mysql : les index s'affichent pas !!! [ par stephane ] Voila, j'utilise cette procédure pour afficher les index d'une table (je suis deja connecté à la base de donnees) :$mode représente la table$rep=@mysq problème de mise à jour de base de données [ par rildspael ] Ben en fait maintenant j'ai refait ce code, je me suis concentré, j'ai tout analysé mais rien ne marche encore et je ne comprends pas : le voici :Donc multi recherche mysql ??? [ par stephane ] saluttout simplement je voudrai savoir comment effectuer une requete my sql dans toutes les tables (je pense que c'est faisable mais je ne sais pas co MYSQL: cas désespéré [ par aidezmoi ] Comment faire quand on a easyphp pour créer une table mysql? Je sais je suis nul, je viens de commencer le php.Et il y a des modifs à faire si on pass cherche hebergeur PHP4 et MySQL [ par Fafouneou ] Je recherche un hebergeur gratuit ou payant ( dans la limite de 50 frs par mois) avec 100 Mo et qui gere le PHP4 et MySQL merci d'avance ...Tout les g


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,326 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales