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

Signaler
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
-
Messages postés
86
Date d'inscription
mercredi 31 janvier 2007
Statut
Membre
Dernière intervention
22 novembre 2011
-
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

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.
Afficher les 6 commentaires