搜索多列的全局搜索字段

时间:2015-11-16 18:14:42

标签: php mysql ajax

我有一个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

现在,我可以通过搜索1965Mercedes 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';

如何修改我的查询以匹配多个列

2 个答案:

答案 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_namebody_type。其他int字段将作为一个整体进行比较(只是一个提示:在您的示例中,您已将机箱设置为' 111.014'。对于整数字段,这是不可能的......) E.g。

 ... WHERE CAST(chassis as CHAR) LIKE '%111%'

请注意,非常慢。