2015-11-16 119 views
1

我有一个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 OR Mercedes 220SEb露面,但不露面通过搜索1965 Mercedes 220SEb,这是我想要的。

下面是该查询(通过AJAX/$。员额通过为$ _ POST [“搜索”])

$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'; 

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

回答

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'; 
+0

'$ sql_where = substr($ sql_where,5)'语句的用途是什么? – idealbrandon

+0

没关系,只是意识到它是删除第一个AND('从字符串。 – idealbrandon

+0

这是完美的,做了我所需要的 – idealbrandon

0

这取决于你如何设置你的领域。 LIKE仅适用于字符串/字符,因此您在使用前必须使用CAST。目前,您的代码仅适用于model_namebody_type。其他int字段将作为一个整体进行比较(只是一个提示:在您的示例中,您已将机箱设置为'111.014'。对于整数字段而言,这是不可能的......) E.g.

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

请注意,这是非常