J'ai cette fonction dans ma classe de base de données. Il accepte 3 paramètres:Un problème avec cette classe Mysql Helper?
- La requête
- le serveur pour l'exécuter sur lequel est identifié par son nom qui est stocké dans une configuration
- un tableau d'arguments qui est cité dans la requête SQL
exemple appel:
$toplist = MyDbClass->q('SELECT * FROM movies WHERE score > ?','slaveserver1',array(100));
est ici le code ...
/*
* @param the sql query. may be pure sql or having ? as placeholders for variables that are passed in the 3rd param, not enquoted
* @param name of the link (slave or master server or other arbitrary database)
* @param optional array of vars that will be filled in where the ? signs in the query are
*/
public function q($sql,$name,$vars=false) {
// lets see if the link to the server with name $name has already been initialised, if not lets do it
if(!isset($this->links[$name])) {
$this->initialize($name);
}
// if variables have been passed, lets fill them into the query
if($vars !== false) {
// first real scape them all according to the correct link
for($i=0;$i<count($vars);$i++) {
$vars[$i] = mysql_real_escape_string($vars[$i],$this->links[$name]);
}
// now escape all actual % signs so they are not used as placeholders vor vsprintf
$sql = str_replace('%','%%', $sql);
// no add '' quotes arround every placeholder and fill in
$sql = str_replace('?','\'%\'', $sql);
$sql = vsprintf($sql,$args);
}
// now execute the parsed query on the correct server
return mysql_query($sql,$this->links[$name]) or die(mysql_error($this->links[$name]));
}
Maintenant, mes questions sont les suivantes:
sont-il un problème avec mon code? en particulier:
- y a-t-il des cas où mettre des citations
''
autour des arguments dans une requête peut le faire ne pas fonctionner? - Y at-il un moyen élégant d'empêcher ma fonction de se retrouver avec des choses entre guillemets comme
where score > ''100 ''
dans mes requêtes (si j'ai déjà mis des qutoes dans la requête d'entrée ...). - que pensez-vous de la fonction? bon moyen de le faire?
Je pense que vous vous êtes trompé :) le but est prmiary d'initier des connexions seulement si elles sont nécessaires, avec la première requête sur un serveur. le but principal sera la connexion en lecture/écriture, mais il peut y avoir d'autres connexions. certains qui sont rarement nécessaires par exemple. initialise prend alors les informations de connexion correctes d'une classe conflig et établit la connexion à la demande. le système fonctionne bien. pour l'instant je n'ai passé que des requêtes complètes et amélioré la classe par ce truc $ args. –