我正在尝试编写基于以下搜索的搜索mysql查询。 搜索查询字符串:“(foo和bar)或(blah1和blah2)”
用户将输入如上所述的查询字符串,它可能是单个块或多个块。
我想要做的是将字符串拆分为括号块,然后单独解析它们,然后将其与OR
或AND
语句合并。
所以我的最终查询看起来像
Select
*
from
table
where
(field like 'foo%' AND field like 'bar%') OR
(field like 'blah1%' AND field like 'blah2%')
请帮忙。
答案 0 :(得分:0)
有几个问题。
您需要将查询字符串分解为单个元素,然后将其分解为单个值,然后构建查询。
您还需要通过转义或使用预准备语句来使输入安全。
使用mysqli来使用这样的预处理语句: -
$query_string = strtolower("(foo and bar) or (blah1 and blah2)");
$queries_sets = explode(' or ', $query_string);
$query_set = array();
$fields = array();
foreach($queries_sets AS $query_set_key=>$query_set_value)
{
$query_line = explode(' and ', trim($query_set_value, '()'));
if (count($query_line) == 2)
{
$query_set[] = "(field like ? AND field like ?)";
$fields[] = $query_line[0].'%';
$fields[] = $query_line[1].'%';
}
}
$stmt = $conn->prepare("SELECT * FROM table WHERE ".implode(' OR ', $query_set));
call_user_func_array(array($stmt, 'bind_param'), $fields);