1

我有一个搜索表单,可以按名称搜索:

if($v=$_POST['Name']){
     $sql.=" AND CONCAT(' ',Name) LIKE '% $v%'";
     }
if($v=$_POST['PriceU']){
     $sql.=" AND Price BETWEEN '$_POST[PriceF]' AND '$_POST[PriceU]'";
     }
if($v=$_POST['RateU']) {
    $sql.=" AND Rate BETWEEN '$_POST[RateF]' AND '$_POST[RateU]'";
    }
if($v=$_POST['Cat']) {
    $sql.=" AND Category='$_POST[Cat]' ";
}

$resm=mysql_query ("SELECT * from members WHERE Level='$_GET[level]' $sql  Order By Name"); 

只是为了理解,我呼应了“$resm”。当我使用 Toyota 名称进行搜索时,生成的查询如下:

SELECT * FROM members
WHERE Level='2' AND
      CONCAT(' ',Name) LIKE '% Toyota%'
ORDER BY Name.

但是我的问题是CONCAT(' ',Name)这里有什么用?我认为即使没有CONCAT. 那是

if($v=$_POST['Name']){
  $sql.=" AND (' ',Name) LIKE '% $v%'";

那么生成的SQL就是

SELECT * from members WHERE Level='2' AND Name LIKE '% Toyota%' Order By Name

但这不会输出任何东西。这是为什么?这个查询有什么问题,有什么影响CONCAT

4

2 回答 2

4

CONCAT(' ', Name)在列值前添加一个空格。结合

LIKE '% Toyota%'

这可以防止在单词中间找到Toyota,但允许在字段开头找到它。

于 2013-07-28T15:12:17.557 回答
0

CONCAT()接受两个或多个字符串作为参数,并通过将它们彼此附加来组合它们。例如,CONCAT('hel', 'lo')返回hello. 您正在做的是检查Name列是否与关键字匹配,如果它们都以空格开头。目前尚不清楚为什么,但我的猜测是试图阻止仅匹配单词的一部分,例如KiaNokia. 这种方法确实有一个弱点,因为它最终仍然会匹配带有额外字母的单词 - 搜索Audi会返回Audioslave等等。

于 2013-07-28T15:16:23.197 回答