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

codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 10 mars 2009 à 12:14
cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011 - 16 mars 2009 à 22:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49460-sqlal-classe-sql-pour-mysql-mysqli-sqlite-sql-server-et-odbc

cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011
16 mars 2009 à 22:46
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
cs_Boris090 Messages postés 4 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 16 mars 2009
16 mars 2009 à 21:59
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.
cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011
16 mars 2009 à 21:08
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.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 mars 2009 à 22:24
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_Boris090 Messages postés 4 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 16 mars 2009
10 mars 2009 à 12:28
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. ;)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
10 mars 2009 à 12:14
Et sinon il y a PDO ;)
http://php.net/pdo
Rejoignez-nous