2010-11-07 5 views
0

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?

Répondre

0

Je ne pense pas, qu'autoriser une classe à manipuler plusieurs connexions SQL est une bonne idée. Chaque instance de cette classe doit être autorisée à utiliser une seule connexion SQL. Ou, si vous essayez d'implémenter une sorte d'équilibrage de charge manuel, ceci devrait être utilisé de manière transparente par l'utilisateur avec, peut-être, uniquement des choix "esclave" et "maître" autorisés. Probablement, vous devriez séparer vos requêtes en "read" et "write" car vous pouvez "lire" à partir de n'importe quel esclave, mais vous devriez les "écrire".

De même, si l'envoi de requêtes est effectué à des fins d'équilibrage de charge, vous devez ouvrir les connexions dans le constructeur de classe au lieu de les ouvrir paresseux dans la requête. Un script est une créature à vie très courte. Il n'est pas nécessaire de retarder les connexions tant que la requête n'est réellement exécutée que si vous écrivez un script CLI pour des opérations à long terme.

+0

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. –