SQL для проблемы с функцией поиска работы - PullRequest
0 голосов
/ 15 марта 2011

Есть текстовый ввод для строки и выберите ввод с местоположением, Когда они ищут, он запрашивает базу данных с этим запросом. Я использую 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 ]

4 голосов
/ 15 марта 2011

Используйте скобки для правильной интерпретации выражения:

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%')

Честно говоря, вы должны использовать Полнотекстовый поиск для поиска в поле job_ *.

2 голосов
/ 15 марта 2011

Если у вас есть 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 голос
/ 15 марта 2011

Вам нужно использовать круглые скобки.Прямо сейчас вы говорите:

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 и подготовленные операторы .Что-то вроде:

$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();
1 голос
/ 15 марта 2011

Поскольку вы ищете из job_province = значение ИЛИ 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 голос
/ 15 марта 2011

Вам нужно заключить в скобки "ИЛИ"

  $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-инъекции»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...