我有一个mysql查询,它只是查看mysql以查找LIKE
字符串并显示结果。
在同一个mysql查询中,我有2个LIKE
。
1始终是单个字符串,另一个可以是单个字符串,有时多个字符串用逗号分隔。
当我使用我的代码时,即使我拥有mysql数据库中的所有字段,并且列中也包含所有搜索字符串,我根本得不到任何结果。
这是我的代码:
$area = 'London';
$res = 'santandar, HSBC, RBS, ';
$sql = "SELECT * FROM banks WHERE location LIKE '%$area%' AND name LIKE '%$res'";
我也尝试过使用preg_match并且它没有返回任何内容:
$sql = "SELECT * FROM banks WHERE location LIKE '%$area%' AND name LIKE '".preg_match($res)."'";
如果我删除了第二个LIKE,我的代码如下所示,它可以正常工作:
sql = "SELECT * FROM banks WHERE location LIKE '%$area%'";
因此,当我尝试使用逗号分隔的字符串进行搜索时,问题就开始了。
有人可以就此问题提出建议吗?
编辑:
PHP varibles是POSTS,因此它们可以是每个帖子中的任何内容。
他们是这样的:$area = $_POST['area'];
$res = $_POST['res'];
答案 0 :(得分:2)
你应该使用OR
条件:
$res_array = explode(',' $res)
$num_elem= count($res_array) // with this value you can build dinamically the query
"SELECT * FROM banks WHERE location LIKE '%$area%'
AND ( name LIKE concat('%', $res_array[0]),
OR LIKE concat('%', $res_array[1])
OR LIKE concat('%', $res_array[2]) ";
答案 1 :(得分:1)
您需要将其分成LIKE
个OR
,例如:
...WHERE location LIKE '%{$area}' AND (name LIKE '%{$name1}%' OR name LIKE '%{$name2}' OR ...)
你可以用一些PHP逻辑简单地编写这个:
function build_like_or( $values, $field_name ) {
// Create an array from the comma-separated values
$names = explode( ',', $values );
// Trim all the elements to remove whitespaces
$names = array_map( 'trim', $names );
// Remove empty elements
$names = array_filter( $names );
$where = array();
// Loop over each, placing the "LIKE" clause into an array
foreach( (array)$names AS $name ) {
$where[] = "{$field_name} LIKE '%{$name}%'";
}
// Glue up the LIKE clauses.
$where = '(' . implode(' OR ', $where) . ')';
// Results will be something like:
// $where = "(name LIKE '%santadar%' OR name LIKE '%HSBC%')"
return $where;
}
用法:
$area = 'London';
$res = 'santandar, HSBC, RBS, ';
$name_where = build_like_or( $res, 'name');
$sql = "SELECT * FROM banks WHERE location LIKE '%$area%' AND {$name_where}";
// echo $sql outputs "SELECT * FROM banks WHERE location LIKE 'London' AND (name LIKE '%santadar%' OR name LIKE '%HSBC%' OR name LIKE '%RBS%')