2010-01-09 7 views
6

Próbuję stworzyć bardzo prostą abstrakcję baz danych, jedną jej część za pomocą przygotowanych zapytań.Implementacja prostego przygotowanego zapytania w PHP

Teraz mam funkcją wziąć ciąg kwerendy i tablicę wartości takiego:

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

będzie utworzyć kwerendę tak:

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

mój problem jest taki:
Używam preg_replace_callback do pobierania identyfikatorów :: i: identyfikatorów z ciągu zapytania, a następnie wysyłania ich do funkcji sanityzacji. Problem polega na tym, że muszę również wysłać tablicę wartości, aby funkcja mogła przyjąć dopasowanie z wyrażenia regularnego, pobrać element w tablicy wartości za pomocą tego klucza, uciec z wartości, zawinąć ją w odpowiednie cudzysłowy, a następnie zwrócić. .

Ale nie mogę przekazać żadnej dodatkowej informacji do oddzwonienia. Mogłabym użyć prywatnej zmiennej statycznej, ale jest to bardzo łatwa odpowiedź: hacky.

Jakie jest inne podejście do tego?

Odpowiedz

2

Jedną z alternatyw sugerowane przez różne komentarze w instrukcji jest użycie preg_replace() z „e” modyfikator jako część wyrażenia regularnego:

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

Zasadniczo jesteś podając kod do oceny. Myślę this comment ma dobry przykład, przy czym utworzyć funkcję, a następnie mały ciąg, aby ją ocenić, które pozwala przekazać dodatkowe parametry:

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

to jest idealne! Chciałbym przeczytać to zanim użyłem dużej klasy, aby sobie z tym poradzić ... Myślę, że zmienię to na tę prostszą wersję. Dziękuję Ci! –

+0

Możesz też użyć http://php.net/manual/en/function.preg-replace-callback.php. Nie podoba mi się pomysł umieszczania kodu w łańcuchach. – mpen

+1

@Mark - Carson stwierdza, że ​​'preg_replace_callback()' nie działa dla niego, ponieważ nie możesz przekazać dodatkowych parametrów do funkcji wywołania zwrotnego. Używanie 'preg_replace()' z opcją 'e' jest obejściem. Zauważ też, że 'preg_replace_callback()' wykorzystuje oszacowany kod, więc jest to po prostu charakter sytuacji. – zombat

1

Czy pasuje vsprintf do twoich potrzeb?

+0

Nie sądzę więc, nie bez unicestwiając wszystko, co mam już –

2

możesz również sprawdzić pdo, zend_db i mdb2. Dobrze, że mają nazwane parametry i sterowniki, które mogą poprawnie tworzyć przygotowane instrukcje (lub emulować przygotowane instrukcje) w wielu silnikach pamięci masowej.

np Zend_Db zrobi podstawowe parsowania SQL obsługiwać przypadki krawędzi, jak powiedzieć, gdy regex osadzony w zapytaniu jest klasa znaków z dwukropkiem ...

+0

Racja, nie wybrałem biblioteki, bo chciałem rozwiązać ten problem sam, biorąc pod uwagę cynizm projektu (jest naprawdę mały) –

Powiązane problemy