PHP basit hazırlanmış sorgu uygulanması

3 Cevap php

Ben çok basit bir veritabanı soyutlama, hazırlanmış sorguları kullanarak bunun bir parçası oluşturmak için çalışıyorum.

Şimdi, bir işlev, bir sorgu dizesi ve bu gibi değerlerin bir dizi çekmek var:

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

Bu böyle bir sorgu oluşturur:

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

my problem is this:
I'm using preg_replace_callback to grab the ::identifiers and :identifiers from the query string, and then sending it to a sanitization function. The problem is, I also need to send the values array, so that the function can take the match from the regexp, get the item in the values array with that key, escape the value, wrap it in the right quotes and then return it.

Ama ben geri arama için herhangi bir ekstra bilgi geçemez. Ben özel bir statik değişkeni kullanabilirsiniz ama bu çok hacky olduğunu.

Buna başka bir yaklaşım nedir?

3 Cevap

Kılavuzun çeşitli yorumlar tarafından önerilen alternatiflerden biri regexp parçası olarak 'e' değiştirici ile preg_replace() kullanmaktır:

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

Esasen değerlendirmek için kodu belirtilerek ediyoruz. Ben işlevi oluşturmak sayede, this comment iyi bir örnek olduğunu düşünüyorum, ve sonra küçük bir dize ekstra parametreleri geçmesine izin veren bunu değerlendirmek için:

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

Ayrıca pdo Zend_Db'nin ve mdb2 kontrol edebilir. İyi bir şey, onlar düzgün birçok depolama motorları (hazırlanmış deyimleri ya da taklit) hazırlanmış ifadeleri oluşturabilirsiniz adlandırılmış parametreleri ve sürücüleri olması.

Örneğin Zend_Db'nin kenar davalarını bazı temel SQL ayrıştırma yapacak gibi bir sorguda gömülü bir regex bir kolon bir karakter sınıfı olduğunda söylüyorlar ...

vsprintf size uymuyor mu?