我有一个MySQL表,其中包含以下列的车辆信息:
year (int)
model_name (varchar)
chassis (int)
engine (int)
body_type (text)
我有一个搜索框,我希望用户能够搜索特定的模型,然后通过AJAX显示结果。一切都按预期工作,只有一个障碍:它只显示与单个列匹配的结果。
例如,假设我在表格中有以下行:
year: 1965
model_name: Mercedes 220SEb
chassis: 111.014
engine: 127.982
body_type: Sedan
现在,我可以通过搜索1965
或Mercedes 220SEb
来显示此内容,但搜索1965 Mercedes 220SEb
并不会显示,这是什么我想。
这是查询(通过AJAX / $ .post传递为$ _POST [' search'])
$like_search = '"%' . $_POST['search'] . '%"';
$sql = 'SELECT * FROM ac_models WHERE year LIKE ' . $like_search . ' OR model_name LIKE ' . $like_search . ' OR chassis LIKE ' . $like_search . ' OR engine LIKE ' . $like_search . ' OR body_type LIKE ' . $like_search . ' ORDER BY year ASC';
如何修改我的查询以匹配多个列
答案 0 :(得分:1)
这应该做你想要的。我按每个空格分解搜索字符串,并搜索每个部分的每一列。每个单词都必须在任何列中。
$search = $_POST['search'];
if (preg_match('/[;"\']/', $search)) {
die('Possible SQL Injection');
}
// maybe strip . and , from numbers here
$sql_where = '';
foreach (explode(' ', $search) as $searchpart) {
$like_search = '%' . $searchpart . '%';
$sql_where .= ' AND (' .
'year LIKE ' . $like_search .
' OR model_name LIKE ' . $like_search .
' OR chassis LIKE ' . $like_search .
' OR engine LIKE ' . $like_search .
' OR body_type LIKE ' . $like_search .
')';
}
if ($sql_where == '') {
die('no search criteria given');
// to return everything: $sql_where = ' AND 1=1';
}
$sql_where = substr($sql_where, 5);
$sql = 'SELECT * FROM ac_models WHERE ' . $sql_where . ' ORDER BY year ASC';
答案 1 :(得分:0)
这取决于您如何设置字段。 LIKE
仅适用于字符串/字符,因此在使用前您必须CAST
。目前,您的代码仅适用于model_name
和body_type
。其他int
字段将作为一个整体进行比较(只是一个提示:在您的示例中,您已将机箱设置为' 111.014'。对于整数字段,这是不可能的......)
E.g。
... WHERE CAST(chassis as CHAR) LIKE '%111%'
请注意,非常慢。