X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Фильтрация посредством LIKE c несколькими условиями
lesli007
lesli007
Topic Starter сообщение 21.8.2012, 17:16; Ответить: lesli007
Сообщение #1


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

Делаю фильтрацию строк таблицы по названию, агентству, году, месяцу и региону. Пользователь может что-то ввести, а может не вводить данные
Присутствует постраничная навигация. Поэтому 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 "По вашему запросу ничего не найдено";}
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 21.8.2012, 18:02; Ответить: matroskin8
Сообщение #2


Ошибка: 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 используется немного в других случаях.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 21.8.2012, 18:53; Ответить: lesli007
Сообщение #3


[member=matroskin8], сейчас все попробую. Что за поиск есть?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 21.8.2012, 18:54; Ответить: matroskin8
Сообщение #4


Вроде понятно написал:
полнотекстовый поиск
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 21.8.2012, 19:13; Ответить: lesli007
Сообщение #5


Сейчас пока организую на лайках. Потом если что поменяю. [member=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. Нужно какое то условие при незаполненности полей формы или в запросе что то менять
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 21.8.2012, 22:09; Ответить: matroskin8
Сообщение #6


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

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

А еще необходимо сделать очень жесткий поиск. То есть все 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

Надеюсь, доступно объяснил... это я к тому, что запрос верный... ну а не ищет ничего потому, что критериям поиска не удовлетворяет ни одна строка из таблицы.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 22.8.2012, 1:41; Ответить: lesli007
Сообщение #7


[member=matroskin8],
[img]http://s2.ipicture.ru/uploads/20120822/8RorUwEz.jpg[/img]
Смысл в фильтрации. Пользователь может выбрать все пукты, или же что то одно. Но если что то не за полнено - в POST летит пустота и при использовании AND не находится ничего
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 22.8.2012, 8:17; Ответить: matroskin8
Сообщение #8


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

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) FizzPartners - Gambling Партнерка с индивидуальными условиями, прямой рекламодатель.
1 AaronFizzPartners 1600 23.7.2021, 18:14
автор: AaronFizzPartners
Открытая тема (нет новых ответов) PlayCash - гемблинг, беттинг партнерка с жирными условиями
9 Playcash 2597 31.5.2021, 12:11
автор: Playcash
Открытая тема (нет новых ответов) Adspect — клоакинг, фильтрация ботов, антифрод
На базе JS fingerprinting и машинного обучения
2 Adspect 3238 13.8.2020, 14:32
автор: Adspect
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыПечальный обзор Like.co/in/
1 k0ttee 50509 17.12.2019, 18:49
автор: k0ttee
Открытая тема (нет новых ответов) [Mobytize.com] - вкусные офферы со сладкими условиями - Make Money & Have Fun!
26 Mobytizecom 3909 5.4.2019, 17:53
автор: Mobytizecom


 



RSS Текстовая версия Сейчас: 20.4.2024, 14:49
Дизайн