2011-03-15 41 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();