2010-01-09 7 views
6

J'essaye de créer une abstraction de base de données très simple, une partie en utilisant des requêtes préparées.implémenter une requête préparée simple en PHP

Maintenant, j'ai une fonction prend une chaîne de requête et un tableau de valeurs comme ceci:

$query = "SELECT `first_name`, `last_name` FROM ::table_name WHERE `id` = :id" 
$values = array(
    'table_name' = $this->table_name, 
    'id' = $user_id, 
); 

cela va créer une requête comme ceci:

SELECT `first_name`, `last_name` FROM `sometablename` WHERE `id` = '1234' 

mon problème est le suivant:
J'utilise preg_replace_callback pour récupérer les identificateurs :: et identificateurs de la chaîne de requête, puis l'envoyer à une fonction de nettoyage. Le problème est, j'ai aussi besoin d'envoyer le tableau de valeurs, afin que la fonction puisse prendre la correspondance de l'expression rationnelle, obtenir l'élément dans le tableau de valeurs avec cette clé, échapper la valeur, l'insérer dans les bons guillemets et le retourner .

Mais je ne peux pas transmettre d'informations supplémentaires au rappel. Je pourrais utiliser une variable statique privée, mais c'est très hacky.

Quelle est une autre approche à cela?

Répondre

2

L'une des solutions proposées par divers commentaires dans le manuel est d'utiliser preg_replace() avec le modificateur « e » dans le cadre de l'expression rationnelle:

preg_replace("/pattern/e","strtoupper('\\1')",$subject); 

Essentiellement vous spécifiez le code à évaluer. Je pense que this comment a un bon exemple, dans lequel vous créez la fonction, puis une petite chaîne pour évaluer ce qui vous permet de passer des paramètres supplémentaires:

preg_replace('/pattern/e',"your_function(\$array,\$foo,\$bar,\$etc)",$str); 
+0

c'est parfait! Je souhaite que je lise ceci avant que j'aie utilisé une grande classe pour le manipuler ... Je suppose que je le changerai à cette version plus simple. Je vous remercie! –

+0

Ou vous pouvez utiliser http://php.net/manual/en/function.preg-replace-callback.php. Je n'aime pas l'idée de mettre du code dans les chaînes. – mpen

+1

@Mark - Carson précise que 'preg_replace_callback()' ne fonctionne pas pour lui, car vous ne pouvez pas passer de paramètres supplémentaires à la fonction de rappel. Utiliser 'preg_replace()' avec l'option 'e' est la solution de rechange. Notez aussi que 'preg_replace_callback()' utilise du code évalué, donc c'est juste la nature de la situation. – zombat

1

Est-ce que vsprintf ne correspond pas à vos besoins?

+0

Je ne pense pas, non sans anéantir tout ce que je déjà –

2

vous pouvez également consulter pdo, zend_db et mdb2. bonne chose est qu'ils ont nommé les paramètres et les pilotes qui peuvent correctement créer des instructions préparées (ou émuler des instructions préparées) sur de nombreux moteurs de stockage.

par exemple, Zend_Db fera une analyse syntaxique SQL de base pour traiter les cas de pointe, comme dire quand un regex embarqué dans une requête est une classe de caractère avec deux points ...

+0

Bon, je n'ai pas choisi d'utiliser une bibliothèque car je voulais résoudre celle-ci par moi-même, compte tenu de la petitesse du projet (c'est vraiment minuscule) –

Questions connexes