За последние 24 часа нас посетили 36569 программистов и 7751 робот. Сейчас ищут 1886 программистов ...

Выборка с поиском через LIKE, прошу помощи

Тема в разделе "PHP для новичков", создана пользователем JonyFront, 5 июн 2016.

  1. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Добрый день! Очень нуждаюсь в вашей помощи, суть: Я написал выборку из базы данных с поиском через LIKE -
    PHP:
    1. $sql =  "SELECT * FROM post WHERE `title` LIKE '%" . $word . "%' AND (`category` LIKE '%" . $word3 . "%' AND `fields` LIKE '%" . $word2 . "%') LIMIT 10";
    Сейчас она ищет если переданы все 3 параметра и если есть запись в бд в который совпадают все 3 поля post то отображает результат, то бишь работает связанно со всеми 3 параметрами что в выборке и никак иначе, но уже борюсь довольно долго и не пойму как реализовать следующее : Если я передал только $word то отображает результат поиска из $word(без привязанности к 2м остальным), если же я выбрал и $word и $word2 то отображает связанный результат и ищет конкретную запись в бд где есть и $word и $word2, и аналогично с word3. Чтобы была возможность искать и по 1 параметру( на выбор) и по нескольким сразу(связанно). Заранее спасибо за помощь!
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    может я что-то не так понял, но вроде как логично, что нужно в РНР смотреть сколько передано параметров и каких и уже исходя из этого формировать запрос, вот и все.
     
    JonyFront нравится это.
  3. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Подскажите пожалуйста как хотя бы примерно это реализовать, не понимаю...
    Вот полный код обработки
    PHP:
    1. <?php
    2. //получаем данные через $_POST
    3. if (isset($_POST['search'])) {
    4.     // подключаемся к базе
    5.     include('db.php');
    6.     $db = new db();
    7.      $word = mysql_real_escape_string($_POST['search']);
    8.     $word2 = mysql_real_escape_string($_POST['fsearh']);
    9.     $word3 = mysql_real_escape_string($_POST['fsearh2']);
    10.    
    11.     // Строим запрос
    12.     $sql =  "SELECT * FROM post WHERE `title` LIKE '%" . $word . "%' AND (`category` LIKE '%" . $word3 . "%' AND `xfields` LIKE '%" . $word2 . "%') LIMIT 10";
    13.     // Получаем результаты
    14.     $row = $db->select_list($sql);
    15.     if(count($row)) {
    16.         $end_result = '';
    17.         foreach($row as $r) {
    18.             $result         = $r['title'];
    19.             $bold           = '<span class="found">' . $word . '</span>';
    20.             $end_result     .= '<li>' . str_ireplace($word, $bold, $result) . '</li>';
    21.         }
    22.         echo $end_result;
    23.     } else {
    24.         echo '<li>По вашему запросу ничего не найдено</li>';
    25.     }
    26. }
    27. ?>
    А вот скрипт который отправляет из формы на ajax параметры запроса

    Код (Javascript):
    1. <script type="text/javascript">
    2.  
    3. $(function() {
    4.  
    5.   $(".search_button").click(function() {
    6.   // получаем то, что написал пользователь
    7.   var searchString  = $("#search_box").val();
    8.   var citysearhc  = $("#selss").val();
    9.   var categorysear  = $("#catsea").val();
    10.   // если searchString не пустая
    11.   if(citysearhc) {
    12.   // делаем ajax запрос
    13.   $.ajax({
    14.   type: "POST",
    15.   url: "/search.php",
    16.   data: {search: searchString, xfsearh: citysearhc, xfsearh2: categorysear },
    17.   beforeSend: function(html) { // запустится до вызова запроса
    18.   $("#results").html('');
    19.   $("#searchresults").show();
    20.             $(".word").html(citysearhc);
    21.   },
    22.   success: function(html){ // запустится после получения результатов
    23.   $("#results").show();
    24.   $("#results").append(html);
    25.   }
    26.   });
    27.   }
    28.   return false;
    29.   });
    30. });
    31. </script>
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    во-первых mysql_ уже не актуально, уже давно все перешли на mysqli_
    во-вторых, что тут сложного
    PHP:
    1. $temp = array();
    2.  
    3. // через  mysql_real_escape_string сам пропустишь
    4. if (isset($_POST['search'])) {
    5.     $temp[] = "`title` LIKE '%" . $_POST['search'] . "%'";
    6. }
    7. if (isset($_POST['fsearh'])) {
    8.     $temp[] = "`category` LIKE '%" . $_POST['fsearh'] . "%'";
    9. }
    10. if (isset($_POST['fsearh2'])) {
    11.     $temp[] = "`xfields` LIKE '%" . $_POST['fsearh2'] . "%'";
    12. }
    13.  
    14. $sql = "SELECT * FROM post WHERE " . implode(' AND ', $temp) . ' LIMIT 10';
    тут только скобки я не понял для чего, они вроде как не нужны, потому что везде AND, ну и mysql_real_escape_string сам давай.
    и я код не тестировал, тоже сам давай.
    --- Добавлено ---
    или можно вообще так:
    PHP:
    1. $temp = [];
    2. $keys = ['search' => 'title', 'fsearh' => 'category', 'fsearh2' => 'xfields'];
    3. foreach($keys as $key => $value) {
    4.     if( isset($_POST[ $key ]) ) {
    5.         $temp[] = "`" . $value . "` LIKE '%" . mysql_real_escape_string($_POST[$key]) . "%'";
    6.     }
    7. }
    8. $sql = "SELECT * FROM post WHERE " . implode(' AND ', $temp) . ' LIMIT 10';
     
    JonyFront нравится это.
  5. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Спасибо большое, очень помогли, первый вариант работает . А какой лучше, 1й или 2-й ?
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    хах, они одинаковые (делают одно и то же), только второй покороче и там выполняется mysql_real_escape_string
    --- Добавлено ---
    и еще, там бы еще наверное надо бы проверять, не пустое ли значение, т.е.
    PHP:
    1. $temp = [];
    2. $keys = ['search' => 'title', 'fsearh' => 'category', 'fsearh2' => 'xfields'];
    3. foreach($keys as $key => $value) {
    4.     if( isset($_POST[ $key ]) AND !empty($_POST[ $key ]) ) {
    5.         $temp[] = "`" . $value . "` LIKE '%" . mysql_real_escape_string($_POST[$key]) . "%'";
    6.     }
    7. }
    8. $sql = "SELECT * FROM post WHERE " . implode(' AND ', $temp) . ' LIMIT 10';
     
    denis01 и JonyFront нравится это.
  7. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Понял, спасибо!)
    --- Добавлено ---
    Прошу в последнем помощи, нашел скрипт http://ajaxs.ru/lesson/ajax/127-dinamicheskaja_podgruzka_dannyh_na_stranicu.html динамической подгрузки данных на страницу и пытаюсь внедрить его в данную выборку, сделал так:

    Код сортировки данных из бд на ajax:
    Код (Javascript):
    1. <script type="text/javascript">
    2.  
    3. $(function() {
    4.  
    5.   $(".search_button").click(function() {
    6.   // получаем то, что написал пользователь
    7.   var searchString  = $("#search_box").val();
    8.   var citysearhc  = $("#selss").val();
    9.   var categorysear  = $("#catsea").val();
    10.   // если searchString не пустая
    11.  
    12.   // делаем ajax запрос
    13.   $.ajax({
    14.   type: "POST",
    15.   url: "/search.php",
    16.   data: {search: searchString, xfsearh: citysearhc, xfsearh2: categorysear },
    17.   beforeSend: function(html) { // запустится до вызова запроса
    18.   $("#results").html('');
    19.   $("#searchresults").show();
    20.             $(".word").html(citysearhc);
    21.   },
    22.   success: function(html){ // запустится после получения результатов
    23.  
    24.            $("#results").hide("fast").append(html).show("slow");
    25.        
    26.   }
    27.   });
    28.  
    29.   return false;
    30.   });
    31. });
    32. </script>
    Код динамической подгрузки данных на страницу:
    Код (Javascript):
    1.  <script type="text/javascript">
    2. $(document).ready(function(){
    3.    $("#imgLoad").hide();  //Скрываем прелоадер
    4. });
    5. var num = 2; //чтобы знать с какой записи вытаскивать данные
    6. $(function() {
    7.    $("#load div").click(function(){ //Выполняем если по кнопке кликнули
    8.    $("#imgLoad").show(); //Показываем прелоадер
    9.    $.ajax({
    10.           url: "/search.php",
    11.           type: "POST",
    12.           data: {"num": num},
    13.           cache: false,
    14.           success: function(response){
    15.               if(response == 0){  // смотрим ответ от сервера и выполняем соответствующее действие
    16.                  alert("Больше нет записей");
    17.                  $("#imgLoad").hide();
    18.               }else{
    19.                  $("#results").append(response);
    20.                  num = num + 2;
    21.                  $("#imgLoad").hide();
    22.               }
    23.            }
    24.         });
    25.     });
    26. });
    27. </script>
    И сам код обработки данных:
    PHP:
    1. <?php
    2.   include('db.php');
    3.     $db = new db();
    4.  
    5. //получаем данные через $_POST
    6. if (isset($_POST['search'])) {
    7. $num = $_POST['num'];
    8.     // никогда не доверяйте входящим данным! Фильтруйте всё!
    9.      $word = mysql_real_escape_string($_POST['search']);
    10.     $word2 = mysql_real_escape_string($_POST['xfsearh']);
    11.     $word3 = mysql_real_escape_string($_POST['xfsearh2']);
    12. $temp = array();
    13. // через  mysql_real_escape_string сам пропустишь
    14. if (isset($_POST['search'])) {
    15.     $temp[] = "title LIKE '%" . $_POST['search'] . "%'";
    16. }
    17. if ($_POST['xfsearh2'] == "0") {
    18.  
    19. } else {
    20.    
    21.      $temp[] = "category LIKE '%" . $_POST['xfsearh2'] . "%'";
    22. }
    23. if ($_POST['xfsearh'] == "0") {
    24.  
    25. } else {
    26.    
    27.       $temp[] = "xfields LIKE '%" . $_POST['xfsearh'] . "%'";
    28. }
    29.  
    30. $sql = "SELECT * FROM dle_post WHERE " . implode(' AND ', $temp) . ' LIMIT '.$num.', 3';
    31.     // Получаем результаты
    32.     $row = $db->select_list($sql);
    33.     if(count($row)) {
    34.         $end_result = '';
    35.        
    36.         foreach($row as $r) {
    37.             $content = $r['short_story'];
    38.             preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $content, $regexResult);
    39. $firstImgScr = array_pop($regexResult);
    40.            
    41.             $end_result     .= <<<HTML
    42.            
    43. <div class="item" data-afs-id="{$r['id']}" data-afs-template="fullstory">
    44.                         <img src="{$firstImgScr}" alt="" data-afs-id="{$r['id']}" data-afs-template="fullstory"/>
    45.                         <p><a data-afs-id="{$r['id']}" data-afs-template="fullstory">{$r['title']}</a></p>
    46.                 </div>
    47. HTML;
    48.         }
    49.         echo $end_result;
    50.     } else {
    51.         echo '<li>По вашему запросу ничего не найдено</li>';
    52.     }
    53. }
    54.  
    55. ?>
    В итоге данные не сортируються - пишет что нет данных по такому запросу в бд, и подгрузка тоже не работает - пишет что нет записей для подгрузки, если удаляю $num из запросы по выборке то сортировка работает... Подскажите пожалуйста как все это запустить в рабочий режим? может в 1 нужно объеденить 2 js скрипта?
    --- Добавлено ---
    Пробовал только что менять в коде обработки
    PHP:
    1. if (isset($_POST['search'])) на if (isset($_POST['search']) or isset($_POST['num']))
    и добавил вот такую проверку

    PHP:
    1. $num = $_POST['num'];
    2. if(isset($num)){
    3. $limirs = "{$num},2";
    4. } else {
    5. $limirs = "2";
    6. }
    7. $sql = "SELECT * FROM post WHERE " . implode(" AND ", $temp) . " LIMIT {$limirs}";
    , данные подгружает, но дублирует их после нажатия на кнопку Загрузить еще и почему-то сортирует уже не так, а как-то неправильно совсем...Подскажите пожалуйста, где рыть и как...Заранее спасибо!
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    надо всё перепроверить, делов то, называется отладка или debug.
    Вот для начала два подхода
    http://phpfaq.ru/debug
    https://netbeans.org/kb/docs/php/debugging_ru.html

    Смысл в том чтобы муторно перепроверить всю программу, где какие данные и думать, правильно и логично ли всё происходит.
     
  9. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Дело в том что и так оно не логично происходит, нужно как-то объеденить 2 запроса в 1 и 2 скрипта в 1, но как - я без понятия, уже много перепробовал разных мне вариантов
    --- Добавлено ---
    То бишь я пытаюсь сделать так: нажал кнопку Сортировать и отобразилось 5 записей из бд по моей сортировке через like, но записей может быть и 20, но чтобы отобразилось только 5 на первом экране, затем по клику на кнопку Загрузить еще появилось еще 5 по этому же условии выборки, то бишь на экране уже 10 записей по тому что я выбрал, поняли суть?
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    вот это и нужно выяснить, ты же знаешь как должно быть, и когда ты будешь делать отладку, то на каком-то шаге, ты обнаружишь что что-то пошло не так как надо.
    какие два запроса? напиши их SQL текст, без PHP.

    да, всё понятно, самое простое решение, это использовать LIMIT, почитай в документации по MySQL как им пользоваться.
    Первая страница LIMIT 0, 5 (с нулевого запроса показать максимум пять строк результат)
    Вторая LIMIT 5, 10
    Третья LIMIT 10, 15
     
  11. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    То бишь я пытаюсь сделать так: нажал кнопку Сортировать и отобразилось 5 записей из бд по моей сортировке через like, но записей может быть и 20, но чтобы отобразилось только 5 на первом экране, затем по клику на кнопку Загрузить еще появилось еще 5 по этому же условии выборки, то бишь на эжк
    Про LIMIT я знаю, я так и делаю, но не могу сам решить как связать 2 js скрипта и выборку, чтобы все вместе работало и можно было подгружать записи по клику и по этому и прошу помощи
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Надо просто в js добавить переменную page и её значение подставлять в LIMIT $page * 5 - 5, $page * 5 примерно так, если страница 3 то получиться 3 * 5 - 5 = 10 и 3 * 5 = 15 выйдет LIMIT 10, 15.
    в javascript эту page после получения результата увеличивай на один.

    У тебя нет во втором js скрипте этих данных data:{search: searchString, xfsearh: citysearhc, xfsearh2: categorysear },
    их нужно повторно отправлять при клике на "загрузить ещё" + добавь page и LIMIT
     
  13. JonyFront

    JonyFront Активный пользователь

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    это я понял, а как подключить подгрузку записей в первом основном скрипте? вот что и не получается у меня, там есть уже по клику $(".search_button").click(function() { на кнопку идет отправка переменных на обработку, а как сюда же дописать чтобы по клику на другую кнопку шла 2-й переменная на количество страниц и подгружались следующие записи, этого я и не пойму как сделать...
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    просто храни где-то номер страницы, например в data атрибуте у .search_button путь там по умолчанию будет 1, при успешной загрузки меняй её на 2, и когда в следующий раз нажмут кнопку там уже будет вторая страница.