2011-03-15 100 views
0

存在字符串的文本输入并选择带有位置的输入, 搜索时,它使用此查询查询数据库。 我使用PHP构建字符串用于求职功能问题的SQL

$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

我真的希望你逃脱你的输入 – Belinda 2011-03-15 15:11:22

+0

等等,那些是PHP变量而不是查询参数?似乎是基于封闭的单引号的情况。注意SQL注入... – David 2011-03-15 15:11:31

+0

是的,认真的,看看如何在php中建立sql命令,你不希望有人提供$ string的值......';删除job_request; SELECT * FROM job_request WHERE job_description LIKE' – MatBailie 2011-03-15 15:36:17

回答

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

您需要括号的 “或” S

$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注入”

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)

1

因为你是从job_province = value或job_description =字符串

从简要说明搜索听起来像是你的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%')" 
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();