2010-01-09 17 views
6

Tôi đang cố gắng tạo một trừu tượng cơ sở dữ liệu rất đơn giản, một phần của nó bằng cách sử dụng truy vấn đã chuẩn bị.thực hiện truy vấn được chuẩn bị đơn giản trong PHP

Bây giờ, tôi có một hàm lấy một chuỗi truy vấn và một mảng các giá trị như thế này:

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

này sẽ tạo ra một truy vấn như thế này:

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

vấn đề của tôi là thế này:
Tôi đang sử dụng preg_replace_callback để lấy :: số nhận dạng và: số nhận dạng từ chuỗi truy vấn và sau đó gửi đến một hàm khử trùng. Vấn đề là, tôi cũng cần gửi mảng giá trị, để hàm có thể so khớp từ regexp, lấy mục trong mảng giá trị bằng khóa đó, thoát khỏi giá trị, bọc nó vào dấu ngoặc kép và sau đó trả về nó .

Nhưng tôi không thể chuyển bất kỳ thông tin bổ sung nào vào cuộc gọi lại. Tôi có thể sử dụng biến tĩnh riêng nhưng điều này là rất hacky.

Cách tiếp cận khác cho điều này là gì?

Trả lời

2

Một trong những lựa chọn thay thế được đề xuất bởi ý kiến ​​khác nhau trong hướng dẫn sử dụng là sử dụng preg_replace() với công cụ sửa đổi 'e' làm một phần của regexp:

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

Về cơ bản bạn chỉ định mã để đánh giá. Tôi nghĩ this comment có một ví dụ tốt, nhờ đó mà bạn tạo ra các chức năng, và sau đó là một chuỗi nhỏ để đánh giá nó cho phép bạn để vượt qua các thông số bổ sung:

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

điều này thật hoàn hảo! Tôi ước tôi đọc điều này trước khi tôi sử dụng một lớp học lớn để xử lý nó ... Tôi đoán tôi sẽ thay đổi nó sang phiên bản đơn giản này. Cảm ơn bạn! –

+0

Hoặc bạn thực sự có thể sử dụng http://php.net/manual/en/function.preg-replace-callback.php. Tôi không thích ý tưởng đưa mã vào chuỗi. – mpen

+1

@Mark - Carson đặc biệt nói rằng 'preg_replace_callback()' không hoạt động đối với anh ta, bởi vì bạn không thể chuyển các tham số phụ vào hàm gọi lại. Sử dụng 'preg_replace()' với tùy chọn 'e' là công việc xung quanh. Cũng lưu ý rằng 'preg_replace_callback()' sử dụng mã được đánh giá, vì vậy nó chỉ là bản chất của tình huống. – zombat

1

Không vsprintf phù hợp với nhu cầu của bạn?

+0

Tôi không nghĩ như vậy, không phải không có tiêu diệt tất cả mọi thứ tôi có đã được –

2

bạn cũng có thể xem pdo, zend_db và mdb2. điều tốt là họ đã đặt tên các tham số và trình điều khiển có thể tạo các câu lệnh chuẩn bị đúng (hoặc mô phỏng các câu lệnh đã chuẩn bị) trên nhiều công cụ lưu trữ.

ví dụ, Zend_Db sẽ làm một số phân tích cú pháp sql cơ bản để xử lý các trường hợp cạnh, giống như nói khi một regex nhúng trong một truy vấn là một lớp nhân vật với một dấu hai chấm ...

+0

Phải, tôi chưa chọn sử dụng thư viện vì tôi muốn tự mình giải quyết vấn đề này, xem xét sự nhỏ bé của dự án (nó thực sự rất nhỏ) –

Các vấn đề liên quan