Je sais comment effectuer une requête SQL LIKE% pour une valeur unique comme ceci:
SELECT * FROM users WHERE name LIKE %tom%;
mais comment puis-je faire si les termes de recherche de mon LIKE proviennent d'un tableau? Par exemple, disons que nous avons un tableau comme celui-ci:
$words = array("Tom", "Smith", "Larry");
Comment puis-je utiliser SQL LIKE% pour rechercher les mots dans mon tableau comme:
SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%
SANS mettre toute la requête dans une boucle foreach ou quelque chose
EDIT: J'ai oublié de mentionner que je le fais dans cakePHP dans les conditions de la méthode cakePHP find ('all'), ce qui complique un peu les choses.
Merci
$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);
Edit: code pour CakePHP:
foreach($words as $Word){
$sql[] = array('Model.name LIKE' => '%'.$Word.'%');
}
$this->Model->find('all', array(
'conditions' => array(
'OR' => $sql
)
));
Lire sur ce sujet: http://book.cakephp.org/1.3/fr/view/1030/Complex-Find-Conditions
En cas de SQL standard, ce serait:
SELECT * FROM users WHERE name LIKE '%tom%'
OR name LIKE '%smith%'
OR name LIKE '%larry%';
Puisque vous utilisez MySQL, vous pouvez utiliser RLIKE
(a.k.a. REGEXP
)
SELECT * FROM users WHERE name RLIKE 'tom|smith|larry';
Tu ne peux pas. Il faudra que ce soit un field like %..% or field like %..% or ...
enchaîné. Une clause where ... in
n'extrait que des correspondances de chaîne, sans prise en charge des caractères génériques.
essayez d'utiliser REGEXP
SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
Blockquote
/** * Implode un tableau multidimensionnel de valeurs, regroupant les caractères lorsque différent avec le bloc "[]" . * @param array $ array Le tableau à imploser * @return string Le tableau implosé */ function hoArray2SqlLike ($ array) { if (! is_array ($ array)) renvoie $ 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 );
}
Dans ce code, nous ne pouvons pas obtenir de guillemets doubles dans une requête 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 .
Ou vous pouvez également utiliser une valeur séparée par des virgules: -
$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 requête comme ceci: -
SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';
je viens de prendre le code de 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);
Pour mon compte, j'ai dû le modifier car il m'a renvoyé une erreur SQL . Je le poste pour les personnes qui vont lire le fil.
foreach($words as $Word){
$sql[] = 'name LIKE \'%'.$Word.'%\'';
}
$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
La différence entre eux concerne les devis, ma base de données mysql dit qu’il ya un problème! donc je devais échapper à la citation de $sql[] = 'name LIKE %'.$Word.'%'
.__ et maintenant ça marche parfaitement.