内部阵列
SQL LIKE%我知道如何执行LIKE%查询的SQL的一个值,像这样:内部阵列
SELECT * FROM users WHERE name LIKE %tom%;
,但如果我喜欢搜索词来自于一个数组我该怎么做呢?例如,假设我们有一个这样的数组:
$words = array("Tom", "Smith", "Larry");
如何执行我的SQL LIKE%在我的数组一样来搜索的话:
SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%
,而无需把整个查询中foreach循环或东西
编辑:我忘了提,我在CakePHP CakePHP的的找到条件(“所有”)方法中做这个,所以有点复杂的事情。
谢谢
$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/en/view/1030/Complex-Find-Conditions
我的想法确切。很好的答案! 只需要小心,当有一个空数组,这将导致SQL错误... – 2012-02-23 15:37:39
我认为'OR 0'会做得很好...;) – 2012-02-23 15:45:04
这将工作,但我怎么做这个蛋糕里面PHP发现('all')功能(请参阅编辑) – user765368 2012-02-23 15:45:48
你不能。它必须是链接field like %..% or field like %..% or ...
。 A where ... in
子句只提取字符串匹配,不支持通配符。
在标准SQL的情况下,这将是:
SELECT * FROM users WHERE name LIKE '%tom%'
OR name LIKE '%smith%'
OR name LIKE '%larry%';
由于您使用的是MySQL可以使用RLIKE
(a.k.a. REGEXP
)
SELECT * FROM users WHERE name RLIKE 'tom|smith|larry';
'RLIKE'碰巧是一个绝对伟大的解决方案,谢谢! ! ;) – 2012-12-05 17:24:15
我刚上任的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.'%'
逃脱报价,现在它的工作完美。
块引用
/** * 内爆值的多维数组,分组字符当与 “[]” 块不同。 * @参数数组$阵列内爆 * @返回字符串数组内爆* / 功能hoArray2SqlLike($阵列)的阵列 { 如果(!is_array($ array))return $ 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.="";}
回声sql查询是这样的: -
SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';
你的问题对于[tag:like-operator]标签至少有5票。我可否请求你建议[标签:sql-like]作为[同义词](http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit 2013-04-02 18:41:14