Intereting Posts
CodeIgniter Validation в библиотеке не принимает обратный вызов Сравнение массива PHP и поиск совпадающих и несогласованных элементов php для получения всех понедельников в диапазоне дат Развертывание новой реликвии на кедрах Героку (PHP) Получить последний идентификатор вставки после подготовленной вставки с PDO ответ на предполетную ошибку недействителен (перенаправляется) Как сбросить автоматическое приращение при удалении пользователя laravel? Какова наиболее масштабируемая структура каталогов на основе PHP для большого сайта? .htaccess запретить файлы в подпапках Параметр от url с php и записать его в переменную js в условии if Безопасный вход с правильной аутентификацией в PHP Debug PDO mySql вставляет NULL в базу данных вместо пустой PHP. Загрузите веб-фотографию в альбом facebook через Graph API. Совокупные значения в запросах Doctrine_RawSql PHP. Есть ли возможность запуска GUI-программы через exec ()?

SQL LIKE% внутри массива

Я знаю, как выполнить запрос SQL LIKE% для одного значения:

SELECT * FROM users WHERE name LIKE %tom%; 

но как это сделать, если условия поиска для моего LIKE происходят из массива? Например, допустим, у нас есть такой массив:

 $words = array("Tom", "Smith", "Larry"); 

Как выполнить мой SQL LIKE% для поиска слов в моем массиве, например:

 SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]% 

БЕЗ размещения всего запроса внутри цикла foreach или чего-то еще

EDIT : Я забыл упомянуть, что я делаю это в cakePHP в условиях метода cakePHP find ('all'), так что это немного усложняет ситуацию.

благодаря

Solutions Collecting From Web of "SQL LIKE% внутри массива"

 $sql = array('0'); // Stop errors when $words is empty foreach($words as $word){ $sql[] = 'name LIKE %'.$word.'%' } $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

Изменить: код для CakePHP:

 foreach($words as $word){ $sql[] = array('Model.name LIKE' => '%'.$word.'%'); } $this->Model->find('all', array( 'conditions' => array( 'OR' => $sql ) )); 

Читайте на этом материале: http://book.cakephp.org/1.3/ru/view/1030/Complex-Find-Conditions

В случае стандартного SQL это будет:

 SELECT * FROM users WHERE name LIKE '%tom%' OR name LIKE '%smith%' OR name LIKE '%larry%'; 

Поскольку вы используете MySQL, вы можете использовать RLIKE (aka REGEXP )

 SELECT * FROM users WHERE name RLIKE 'tom|smith|larry'; 

Вы не можете. Это должно быть связанное field like %..% or field like %..% or ... A where ... in условии только извлекает совпадения строк, без поддержки подстановочных знаков.

попробуйте использовать REGEXP

 SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry'; 

Я просто взял код 472084.

 $sql = array('0'); // Stop errors when $words is empty foreach($words as $word){ $sql[] = 'name LIKE %'.$word.'%' } $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

Для себя, я должен был изменить его, потому что он возвратил мне ошибку SQL. Я отправляю его людям, которые будут читать эту тему.

 foreach($words as $word){ $sql[] = 'name LIKE \'%'.$word.'%\''; } $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

Разница между ними связана с цитатой, мой mysql DB сказал, что есть проблема! поэтому мне пришлось избегать цитаты из $sql[] = 'name LIKE %'.$word.'%' и теперь это отлично работает.

Blockquote

/ ** * Импланировать многомерный массив значений, группируя символы, когда они отличаются от блока "[]". * @param array $ array Массив для implode * @return string Вмещенный массив * / function hoArray2SqlLike ($ array) {if (! is_array ($ array)) возвращает $ array;

 $values = array(); $strings = array(); foreach ( $array as $value ) { foreach ( str_split( $value ) as $key => $char ) { if ( ! is_array( $values[ $key ] ) ) { if ( isset( $values[ $key ] ) ) { if ( $values[ $key ] != $char ) { $values[ $key ] = array( $values[ $key ] ); $values[ $key ][] = $char; } } else $values[ $key ] = $char; } elseif ( ! array_search( $char , $values[ $key ] ) ) $values[ $key ][] = $char; } } foreach ( $values as $value ) { if ( is_array( $value ) ) $value = '['.implode( '', $value ).']'; $strings[] = $value; } return implode( '', $strings ); 

}

В этом коде мы не можем получить двойные кавычки в sql-запросе

 $sql = array('0'); // Stop errors when $words is empty foreach($words as $word){ $sql[] = 'name LIKE %'.$word.'%' } $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%; // error in double quotes and % is out side of Double quotes . 

Или вы также можете использовать значение, разделенное запятыми:

 $name = array(Tom, Smith, Larry); $sql="SELECT * FROM person"; extract($_POST); if ($name!=NULL){ $exp_arr= array_map('trim', explode(",",$name)); echo var_export($exp_arr); //die; foreach($exp_arr as $val){ $arr = "'%{$val}%'"; $new_arr[] = 'name like '.$arr; } $new_arr = implode(" OR ", $new_arr); echo $sql.=" where ".$new_arr; } else {$sql.="";} 

Echo sql-запрос:

 SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';