字符串有一个文本输入,选择输入的位置, 搜索时,它会使用此查询查询数据库。 我正在使用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%'"
当我得到结果时,它会显示来自其他位置的与位置输入字符串不匹配的作业? 为什么? 它将显示其中包含该字符串的所有作业,我不希望这样。
答案 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();