Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Фильтрация посредством LIKE c несколькими условиями

#1 lesli007

lesli007
  • Пользователь
  • 108 сообщений
  • Репутация: -4
-2

Отправлено 21 Август 2012 - 16:16

Здравствуйте!

Делаю фильтрацию строк таблицы по названию, агентству, году, месяцу и региону. Пользователь может что-то ввести, а может не вводить данные
Присутствует постраничная навигация. Поэтому 2 раза провожу запрос к БД для подсчета строк и для вытаскивания информации. Что интересно - если убрать WHERE title LIKE '$title' OR region LIKE '$region' OR agenstvo LIKE '$agenstvo' OR month LIKE '$month' OR year LIKE '$year из запроса для подсчета строк - скрипт работает и выдает - Ничего не найдено по вашему запросу. Если же в обоих запросах оставить это условие - то скрипт работает только если нашлось совпадение по какому либо условию поиска

Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-2, 2' at line 1

Вопрос 1: Как заставить все это дело работать правильно?
Вопрос 2: Как сделать жесткость в выборке? Сейчас подразумевается мягкий поиск при любом сопадении. А допустим пользователю нужен ноябрь 2012 а ему выдают все что есть по ноябрям и 2012 году

Принимаю пост запрос
if (isset($_POST['title']))	  {$title = $_POST['title']; }
  if (isset($_POST['region']))	  {$region = $_POST['region']; }
  if (isset($_POST['agenstvo']))	  {$agenstvo = $_POST['agenstvo']; }
  if (isset($_POST['month']))	  {$month = $_POST['month']; }
  if (isset($_POST['year']))	  {$year = $_POST['year']; }

Начало кода постраничной навигацией
$result77 = mysql_query("SELECT str FROM options", $db);
   $myrow77 = mysql_fetch_array($result77);
   $num = $myrow77["str"];
   // Извлекаем из URL текущую страницу
   @$page = $_GET['page'];
   // Определяем общее число сообщений в базе данных
   $result00 = mysql_query("SELECT COUNT(*) FROM tender WHERE title LIKE '$title' OR region LIKE '$region' OR agenstvo LIKE '$agenstvo' OR month LIKE '$month' OR year LIKE '$year'");
   $temp = mysql_fetch_array($result00);
   $posts = $temp[0];
   // Находим общее число страниц
   $total = (($posts - 1) / $num) + 1;
   $total =  intval($total);
   // Определяем начало сообщений для текущей страницы
   $page = intval($page);
   // Если значение $page меньше единицы или отрицательно
   // переходим на первую страницу
   // А если слишком большое, то переходим на последнюю
   if(empty($page) or $page < 0) $page = 1;
	 if($page > $total) $page = $total;
   // Вычисляем начиная с какого номера
   // следует выводить сообщения
   $start = $page * $num - $num;
   // Выбираем $num сообщений начиная с номера $start
Запрос для вытаскивания информации
$result = mysql_query("SELECT * FROM tender WHERE title LIKE '$title' OR region LIKE '$region' OR agenstvo LIKE '$agenstvo' OR month LIKE '$month' OR year LIKE '$year' ORDER BY date1 DESC LIMIT $start, $num",$db);
  if (!$result)
  {
  echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору1. <br> <strong>Код ошибки:</strong></p>";
  exit(mysql_error());
  }

  if (mysql_num_rows($result) > 0)

  {
  $myrow = mysql_fetch_array($result);
  }
  else {echo "По вашему запросу ничего не найдено";}

 

 

  • -1

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Август 2012 - 17:02

Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-2, 2' at line 1

В запрос с LIMIT попадает недопустимое значение... подозреваю, что отрицательное число либо ноль. Чтобы избежать этой ошибки пробуем вот в этот участок:
// Находим общее число страниц
   $total = (($posts - 1) / $num) + 1;
   $total =  intval($total);
добавить условие:
// Находим общее число страниц
   $total = (($posts - 1) / $num) + 1;
   $total =  intval($total);
if($total <= 0) $total = 1;
А вообще мне больше импонирует гораздо более понятная формула получения кол-ва страниц:
$total = ceil($posts/ $num);
if(!$total) $total = 1;

Как сделать жесткость в выборке? Сейчас подразумевается мягкий поиск при любом сопадении. А допустим пользователю нужен ноябрь 2012 а ему выдают все что есть по ноябрям и 2012 году

переписать вот эту часть запроса:
...OR month LIKE '$month' OR year LIKE '$year'
таким образом:
...OR (month LIKE '$month' AND year LIKE '$year')
А вообще, конечно, жесть :) На относительно больших объемах данных Вы своими лайками сервер просто положите. Есть полнотекстовый поиск, который отработает мгновенно и гораздо больше будет уместен в Вашем случае... а LIKE используется немного в других случаях.
  • 0


#3 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 21 Август 2012 - 17:53

matroskin8, сейчас все попробую. Что за поиск есть?
  • 0

#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Август 2012 - 17:54

Вроде понятно написал:

полнотекстовый поиск


  • 0


#5 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 21 Август 2012 - 18:13

Сейчас пока организую на лайках. Потом если что поменяю. matroskin8, Ваше решение помогло избавиться от ошибки. Большое спасибо! Скажите, пожалуйста, в чем может быт причина не поиска. Вот код
$result = mysql_query("SELECT * FROM tender WHERE title LIKE '$title' OR region LIKE '$region' OR agenstvo LIKE '$agenstvo' OR (month LIKE '$month' AND year LIKE '$year') ORDER BY date1 DESC LIMIT $start, $num",$db);
  if (!$result)
  {
  echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору1. <br> <strong>Код ошибки:</strong></p>";
  exit(mysql_error());
  }
 
  if (mysql_num_rows($result) > 0)
 
  {
  $myrow = mysql_fetch_array($result);
  }
  else {echo "По вашему запросу ничего не найдено";}

Однако при незаполнении полей форм не происходит поиск. Типа ничего не найдено. А еще необходимо сделать очень жесткий поиск. То есть все AND вместо OR. Но в таком случае вообще не работает поиск. Видимо что то не так при ловле запросов POST. Нужно какое то условие при незаполненности полей формы или в запросе что то менять
  • 0

#6 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Август 2012 - 21:09

Однако при незаполнении полей форм не происходит поиск.

Логично, если нет данных для поиска - то ничего искать и не должно... или я чего-то упускаю?

А еще необходимо сделать очень жесткий поиск. То есть все AND вместо OR. Но в таком случае вообще не работает поиск.

Нужно понимать, что оператор AND требует обязательного соответствия того, что ищем, с тем, где ищем... всех составляющих предиката (условия) с соответствующими значениями полей. Например, в таблице имеются значения в полях №1-3: значение поля 1, значение поля 2, значение поля 3.
В таком случае этот запрос:
WHERE field1='значение поля 1' AND field2='значение поля 2' AND field3='значение поля 3';
выберет такую строку.
Но если хотя бы одно из значений не совпадет с запросом, то такой ряд выбран не будет... например в таком случае:
WHERE field1='значение поля 1' AND field2='значение поля 2' AND field3='значение поля 5'; -- в последнем условии стоит 5 вместо 3
Надеюсь, доступно объяснил... это я к тому, что запрос верный... ну а не ищет ничего потому, что критериям поиска не удовлетворяет ни одна строка из таблицы.
  • 0


#7 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 22 Август 2012 - 00:41

matroskin8,
Изображение
Смысл в фильтрации. Пользователь может выбрать все пукты, или же что то одно. Но если что то не за полнено - в POST летит пустота и при использовании AND не находится ничего
  • 0

#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 22 Август 2012 - 07:17

Если что-то не обязательно к заполнению, то для этого что-то AND использовать бессмысленно... а иначе - требуйте и проверяйте заполнение всех обязательных полей перед формированием заявки к БД.
  • 1


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru