2017-02-13 23 views
9

tôi là tạo ra một tìm kiếm nâng cao và muốn để lặp qua các truy vấn của tôi bằng cách thêm chúng vào một mảng như sau:Làm thế nào để thoát khỏi mọi thứ trong zend literal?

private $searchFields = [ 
    'as_first_name'     => 'users.first_name like "%VALUE%"', 
    'as_last_name'     => 'users.last_name like "%VALUE%"', 
    'as_payment_history_invoice_num' => 'users.user_id = (SELECT user_id from payment_history where payment_history.invoice_number = "VALUE" LIMIT 1)', 
    'as_building_num'    => 'property_units.building_number like "%VALUE%"', 
    'as_residents_email'    => 'users.email like "%VALUE%"', 
    'as_property_name'    => 'property.name like "%VALUE%"', 
    'as_phone_num'     => 'REPLACE(REPLACE(REPLACE(REPLACE(users.phone, " ", ""), "(", ""), ")", ""), "-", "") = "VALUE"', 
    'as_unit_num'     => 'property_units.unit_number = "VALUE"', 
    'as_account_status'    => 'user_status.status_name = "VALUE"' 
]; 

vân vân tìm kiếm tôi đang làm một cái gì đó giống như ..

if (array_key_exists($key, $this->searchFields)) { 

    $form->get($key)->setValue($val); 
    $where->NEST->literal(str_replace('VALUE', urldecode($val), $this->searchFields[$key]))->UNNEST; 
} 

nhưng vấn đề là tôi không thoát khỏi bất cứ thứ gì ở đó. Không tốt. Làm thế nào tôi có thể sử dụng cùng một cấu trúc mà còn là công cụ thoát.

Trả lời

6

Literal biến vị ngữ dành cho các trường hợp khi không có trình giữ chỗ. Thay vào đó, bạn nên sử dụng biến vị ngữ Expression.

private $searchFields = [ 
    'as_first_name'     => 'users.first_name like "?"', 
    'as_last_name'     => 'users.last_name like "?"', 
    'as_payment_history_invoice_num' => 'users.user_id = (SELECT user_id from payment_history where payment_history.invoice_number = "?" LIMIT 1)', 
    'as_building_num'    => 'property_units.building_number like "?"', 
    'as_residents_email'    => 'users.email like "?"', 
    'as_property_name'    => 'property.name like "?"', 
    'as_phone_num'     => 'REPLACE(REPLACE(REPLACE(REPLACE(users.phone, " ", ""), "(", ""), ")", ""), "-", "") = "?"', 
    'as_unit_num'     => 'property_units.unit_number = "?"', 
    'as_account_status'    => 'user_status.status_name = "?"' 
]; 

giá trị zend-form nên đã được giải mã, vì vậy urldecode là không cần thiết

if (array_key_exists($key, $this->searchFields)) { 

    $form->get($key)->setValue($val); 
    $where->NEST->expression($this->searchFields[$key], $val)->UNNEST; 
} 

Tôi không sử dụng zend-db trong một thời gian khá, hãy chắc chắn để kiểm tra xem mã này thực sự là tạo truy vấn bạn cần.

+0

Tôi nghĩ điều đó gần hơn .. nhưng tôi nhận được. SQLSTATE [HY093]: Số tham số không hợp lệ: số biến bị ràng buộc không khớp với số mã thông báo Tôi ràng buộc một tham số cho mỗi câu lệnh sao cho không chắc chắn tại sao điều đó xảy ra. – hamobi

+0

bạn phải loại bỏ các dấu ngoặc kép xung quanh? .. và bạn phải thêm% xung quanh các giá trị tương tự. – hamobi

+0

@hamobi Tôi không nhớ người giữ chỗ được trích dẫn, có ý nghĩa tho. Ngoài ra, như một lưu ý phụ, trình giữ chỗ có thể có hai dạng: vị trí ('?') Và được đặt tên (': placeholder_name'). Nếu bạn sử dụng trình giữ chỗ được đặt tên, bạn cần cung cấp mảng kết hợp cho các giá trị (đối số thứ hai), trong đó khóa khớp với tên trình giữ chỗ, trình giữ chỗ được đặt tên có thể xuất hiện nhiều lần – Xerkus

0

Bạn không cần phải sử dụng urldecode; nó cần phải được giải mã trước khi bạn đến đây. Nghe có vẻ như NEST có thể quá lạ mắt đối với tình huống này.

foreach (...) 
{ 
    $val = ...; // Get the raw value from the form field ($_POST[...] or whatever) 
    $mval = addslashes($val); 
    $sf = $this->searchFields[...]; 
    $msf = str_replace('VALUE', $mval, $sf); 
    ... $msf ... 
} 

mysqli_real_escape_str sẽ là tốt hơn so với addslashes, nhưng bạn cần phải có đối tượng kết nối mysql; bạn có không?

+0

Không, tôi không có quyền truy cập vào kết nối db .. Cần làm điều này theo cách zendy – hamobi

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