2017-02-13 1 views
9

Я создаю расширенный поиск и хотел проходной мои запросы, добавив их в массив следующим образом:Как избежать вещей в 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"' 
]; 

так на поиске я делаю что-то вроде ..

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

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

но проблема в том, что я ничего не избегаю. Нехорошо. Как я могу использовать одну и ту же структуру, но также избегать вещей.

ответ

6

Literal предикат предназначен для случаев, когда нет заполнителей. Вместо этого следует использовать предикат 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 = "?"' 
]; 

значение Зенд-форма уже должно быть расшифровано, так urldecode не нужен

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

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

Я не использовал Зенд-дб в довольно долгое время, не забудьте проверить, что этот код на самом деле создавая требуемый запрос.

+0

Я думаю, что это ближе .. но я получаю. SQLSTATE [HY093]: Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов Я связываю один параметр для каждого утверждения, поэтому не уверен, почему это происходит. – hamobi

+0

вам нужно избавиться от котировок вокруг? .. и вам нужно добавить% вокруг подобных значений. – hamobi

+0

@hamobi Я не помню, как заполнители были процитированы, имеет смысл. Кроме того, в качестве примечания, заполнители могут быть в двух формах: positional ('?') И named (': placeholder_name'). Если вы используете именованные заполнители, вам необходимо предоставить ассоциативный массив для значений (второй аргумент), где ключевое совпадение с именем заполнителя, с именем placeholder может появляться несколько раз – Xerkus

0

Вам не нужно использовать urldecode; он должен был быть расшифрован, прежде чем вы сюда попадете. Похоже, NEST может быть слишком причудливым для этой ситуации.

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 будет лучше, чем addslashes, но вы должны иметь объект подключения MySQL; у тебя есть это?

+0

Нет У меня нет доступа к соединению db .. Вам нужно сделать это по-zendy-способу – hamobi

Смежные вопросы