用于职位搜索功能问题的SQL

时间:2011-03-15 15:07:07

标签: php mysql sql string

字符串有一个文本输入,选择输入的位置, 搜索时,它会使用此查询查询数据库。 我正在使用PHP来构造字符串

$sql = "SELECT * 
          FROM job_request 
         WHERE job_province = '$location' 
           AND job_title LIKE '%$string%' 
            OR job_description LIKE '%$string%' 
            OR job_skills LIKE '%$string%' 
            OR job_experience LIKE '%$string%'"

当我得到结果时,它会显示来自其他位置的与位置输入字符串不匹配的作业? 为什么? 它将显示其中包含该字符串的所有作业,我不希望这样。

5 个答案:

答案 0 :(得分:4)

使用括号进行正确的表达式解释:

SELECT * 
  FROM job_request 
 WHERE job_province = '$location' 
   AND (   job_title LIKE '%$string%' 
        OR job_description LIKE '%$string%' 
        OR job_skills LIKE '%$string%' 
        OR job_experience LIKE '%$string%')

坦率地说,您应该考虑使用Full Text Search functionality进行job_ *字段搜索。

答案 1 :(得分:2)

当您有A AND B OR C OR D OR E时,它会被解释为(A AND B) OR C OR D OR E。看起来好像你真的想要A AND (B OR C OR D OR E)

答案 2 :(得分:1)

您需要括起“OR”

  $sql = "SELECT * 
     FROM job_request 
     WHERE job_province = '$location' 
       AND (job_title LIKE '%$string%' 
        OR job_description LIKE '%$string%' 
        OR job_skills LIKE '%$string%' 
        OR job_experience LIKE '%$string%')"

并阅读“SQL注入”

答案 3 :(得分:1)

因为您是从job_province = value OR job_description = string

搜索的

从简短描述中可以看出,您的OR语句需要分组:

$sql = "SELECT * 
          FROM job_request 
         WHERE job_province = '$location' 
           AND (job_title LIKE '%$string%' 
            OR  job_description LIKE '%$string%' 
            OR  job_skills LIKE '%$string%' 
            OR  job_experience LIKE '%$string%')"

答案 4 :(得分:1)

您需要使用括号。现在你说:

WHERE job_province = 'x' AND job_title LIKE '%y%' OR job_description LIKE '%y%' ...

OR语句导致查询通过。如果将所有OR语句包装在括号中,则表示省和任何一个LIKE语句都必须匹配:

WHERE job_province = 'x' AND (job_title LIKE '%y%' OR job_description LIKE '%y%' ...)

旁注:您的代码可能容易受到SQL注入攻击。确保您至少使用mysql_real_escape_string()转义变量。理想情况下,您应该使用PDO and prepared statements。类似的东西:

$statement = $dbh->prepare('
    SELECT *
    FROM job_request
    WHERE job_province = :location
        AND (job_title LIKE :search OR
             job_description LIKE :search OR
             job_skills LIKE :search OR
             job_experience LIKE :search)');
$statement->execute(array(
    ':location' => $location,
    ':search' => "%$search%"
));
$rows = $statement->fetchAll();