Добрый день! Очень нуждаюсь в вашей помощи, суть: Я написал выборку из базы данных с поиском через LIKE - PHP: $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 параметру( на выбор) и по нескольким сразу(связанно). Заранее спасибо за помощь!
может я что-то не так понял, но вроде как логично, что нужно в РНР смотреть сколько передано параметров и каких и уже исходя из этого формировать запрос, вот и все.
Подскажите пожалуйста как хотя бы примерно это реализовать, не понимаю... Вот полный код обработки PHP: <?php //получаем данные через $_POST if (isset($_POST['search'])) { // подключаемся к базе include('db.php'); $db = new db(); $word = mysql_real_escape_string($_POST['search']); $word2 = mysql_real_escape_string($_POST['fsearh']); $word3 = mysql_real_escape_string($_POST['fsearh2']); // Строим запрос $sql = "SELECT * FROM post WHERE `title` LIKE '%" . $word . "%' AND (`category` LIKE '%" . $word3 . "%' AND `xfields` LIKE '%" . $word2 . "%') LIMIT 10"; // Получаем результаты $row = $db->select_list($sql); if(count($row)) { $end_result = ''; foreach($row as $r) { $result = $r['title']; $bold = '<span class="found">' . $word . '</span>'; $end_result .= '<li>' . str_ireplace($word, $bold, $result) . '</li>'; } echo $end_result; } else { echo '<li>По вашему запросу ничего не найдено</li>'; } } ?> А вот скрипт который отправляет из формы на ajax параметры запроса Код (Javascript): <script type="text/javascript"> $(function() { $(".search_button").click(function() { // получаем то, что написал пользователь var searchString = $("#search_box").val(); var citysearhc = $("#selss").val(); var categorysear = $("#catsea").val(); // если searchString не пустая if(citysearhc) { // делаем ajax запрос $.ajax({ type: "POST", url: "/search.php", data: {search: searchString, xfsearh: citysearhc, xfsearh2: categorysear }, beforeSend: function(html) { // запустится до вызова запроса $("#results").html(''); $("#searchresults").show(); $(".word").html(citysearhc); }, success: function(html){ // запустится после получения результатов $("#results").show(); $("#results").append(html); } }); } return false; }); }); </script>
во-первых mysql_ уже не актуально, уже давно все перешли на mysqli_ во-вторых, что тут сложного PHP: $temp = array(); // через mysql_real_escape_string сам пропустишь if (isset($_POST['search'])) { $temp[] = "`title` LIKE '%" . $_POST['search'] . "%'"; } if (isset($_POST['fsearh'])) { $temp[] = "`category` LIKE '%" . $_POST['fsearh'] . "%'"; } if (isset($_POST['fsearh2'])) { $temp[] = "`xfields` LIKE '%" . $_POST['fsearh2'] . "%'"; } $sql = "SELECT * FROM post WHERE " . implode(' AND ', $temp) . ' LIMIT 10'; тут только скобки я не понял для чего, они вроде как не нужны, потому что везде AND, ну и mysql_real_escape_string сам давай. и я код не тестировал, тоже сам давай. --- Добавлено --- или можно вообще так: PHP: $temp = []; $keys = ['search' => 'title', 'fsearh' => 'category', 'fsearh2' => 'xfields']; foreach($keys as $key => $value) { if( isset($_POST[ $key ]) ) { $temp[] = "`" . $value . "` LIKE '%" . mysql_real_escape_string($_POST[$key]) . "%'"; } } $sql = "SELECT * FROM post WHERE " . implode(' AND ', $temp) . ' LIMIT 10';
хах, они одинаковые (делают одно и то же), только второй покороче и там выполняется mysql_real_escape_string --- Добавлено --- и еще, там бы еще наверное надо бы проверять, не пустое ли значение, т.е. PHP: $temp = []; $keys = ['search' => 'title', 'fsearh' => 'category', 'fsearh2' => 'xfields']; foreach($keys as $key => $value) { if( isset($_POST[ $key ]) AND !empty($_POST[ $key ]) ) { $temp[] = "`" . $value . "` LIKE '%" . mysql_real_escape_string($_POST[$key]) . "%'"; } } $sql = "SELECT * FROM post WHERE " . implode(' AND ', $temp) . ' LIMIT 10';
Понял, спасибо!) --- Добавлено --- Прошу в последнем помощи, нашел скрипт http://ajaxs.ru/lesson/ajax/127-dinamicheskaja_podgruzka_dannyh_na_stranicu.html динамической подгрузки данных на страницу и пытаюсь внедрить его в данную выборку, сделал так: Код сортировки данных из бд на ajax: Код (Javascript): <script type="text/javascript"> $(function() { $(".search_button").click(function() { // получаем то, что написал пользователь var searchString = $("#search_box").val(); var citysearhc = $("#selss").val(); var categorysear = $("#catsea").val(); // если searchString не пустая // делаем ajax запрос $.ajax({ type: "POST", url: "/search.php", data: {search: searchString, xfsearh: citysearhc, xfsearh2: categorysear }, beforeSend: function(html) { // запустится до вызова запроса $("#results").html(''); $("#searchresults").show(); $(".word").html(citysearhc); }, success: function(html){ // запустится после получения результатов $("#results").hide("fast").append(html).show("slow"); } }); return false; }); }); </script> Код динамической подгрузки данных на страницу: Код (Javascript): <script type="text/javascript"> $(document).ready(function(){ $("#imgLoad").hide(); //Скрываем прелоадер }); var num = 2; //чтобы знать с какой записи вытаскивать данные $(function() { $("#load div").click(function(){ //Выполняем если по кнопке кликнули $("#imgLoad").show(); //Показываем прелоадер $.ajax({ url: "/search.php", type: "POST", data: {"num": num}, cache: false, success: function(response){ if(response == 0){ // смотрим ответ от сервера и выполняем соответствующее действие alert("Больше нет записей"); $("#imgLoad").hide(); }else{ $("#results").append(response); num = num + 2; $("#imgLoad").hide(); } } }); }); }); </script> И сам код обработки данных: PHP: <?php include('db.php'); $db = new db(); //получаем данные через $_POST if (isset($_POST['search'])) { $num = $_POST['num']; // никогда не доверяйте входящим данным! Фильтруйте всё! $word = mysql_real_escape_string($_POST['search']); $word2 = mysql_real_escape_string($_POST['xfsearh']); $word3 = mysql_real_escape_string($_POST['xfsearh2']); $temp = array(); // через mysql_real_escape_string сам пропустишь if (isset($_POST['search'])) { $temp[] = "title LIKE '%" . $_POST['search'] . "%'"; } if ($_POST['xfsearh2'] == "0") { } else { $temp[] = "category LIKE '%" . $_POST['xfsearh2'] . "%'"; } if ($_POST['xfsearh'] == "0") { } else { $temp[] = "xfields LIKE '%" . $_POST['xfsearh'] . "%'"; } $sql = "SELECT * FROM dle_post WHERE " . implode(' AND ', $temp) . ' LIMIT '.$num.', 3'; // Получаем результаты $row = $db->select_list($sql); if(count($row)) { $end_result = ''; foreach($row as $r) { $content = $r['short_story']; preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $content, $regexResult); $firstImgScr = array_pop($regexResult); $end_result .= <<<HTML <div class="item" data-afs-id="{$r['id']}" data-afs-template="fullstory"> <img src="{$firstImgScr}" alt="" data-afs-id="{$r['id']}" data-afs-template="fullstory"/> <p><a data-afs-id="{$r['id']}" data-afs-template="fullstory">{$r['title']}</a></p> </div> HTML; } echo $end_result; } else { echo '<li>По вашему запросу ничего не найдено</li>'; } } ?> В итоге данные не сортируються - пишет что нет данных по такому запросу в бд, и подгрузка тоже не работает - пишет что нет записей для подгрузки, если удаляю $num из запросы по выборке то сортировка работает... Подскажите пожалуйста как все это запустить в рабочий режим? может в 1 нужно объеденить 2 js скрипта? --- Добавлено --- Пробовал только что менять в коде обработки PHP: if (isset($_POST['search'])) на if (isset($_POST['search']) or isset($_POST['num'])) и добавил вот такую проверку PHP: $num = $_POST['num']; if(isset($num)){ $limirs = "{$num},2"; } else { $limirs = "2"; } $sql = "SELECT * FROM post WHERE " . implode(" AND ", $temp) . " LIMIT {$limirs}"; , данные подгружает, но дублирует их после нажатия на кнопку Загрузить еще и почему-то сортирует уже не так, а как-то неправильно совсем...Подскажите пожалуйста, где рыть и как...Заранее спасибо!
надо всё перепроверить, делов то, называется отладка или debug. Вот для начала два подхода http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html Смысл в том чтобы муторно перепроверить всю программу, где какие данные и думать, правильно и логично ли всё происходит.
Дело в том что и так оно не логично происходит, нужно как-то объеденить 2 запроса в 1 и 2 скрипта в 1, но как - я без понятия, уже много перепробовал разных мне вариантов --- Добавлено --- То бишь я пытаюсь сделать так: нажал кнопку Сортировать и отобразилось 5 записей из бд по моей сортировке через like, но записей может быть и 20, но чтобы отобразилось только 5 на первом экране, затем по клику на кнопку Загрузить еще появилось еще 5 по этому же условии выборки, то бишь на экране уже 10 записей по тому что я выбрал, поняли суть?
вот это и нужно выяснить, ты же знаешь как должно быть, и когда ты будешь делать отладку, то на каком-то шаге, ты обнаружишь что что-то пошло не так как надо. какие два запроса? напиши их SQL текст, без PHP. да, всё понятно, самое простое решение, это использовать LIMIT, почитай в документации по MySQL как им пользоваться. Первая страница LIMIT 0, 5 (с нулевого запроса показать максимум пять строк результат) Вторая LIMIT 5, 10 Третья LIMIT 10, 15
То бишь я пытаюсь сделать так: нажал кнопку Сортировать и отобразилось 5 записей из бд по моей сортировке через like, но записей может быть и 20, но чтобы отобразилось только 5 на первом экране, затем по клику на кнопку Загрузить еще появилось еще 5 по этому же условии выборки, то бишь на эжк Про LIMIT я знаю, я так и делаю, но не могу сам решить как связать 2 js скрипта и выборку, чтобы все вместе работало и можно было подгружать записи по клику и по этому и прошу помощи
Надо просто в 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
это я понял, а как подключить подгрузку записей в первом основном скрипте? вот что и не получается у меня, там есть уже по клику $(".search_button").click(function() { на кнопку идет отправка переменных на обработку, а как сюда же дописать чтобы по клику на другую кнопку шла 2-й переменная на количество страниц и подгружались следующие записи, этого я и не пойму как сделать...
просто храни где-то номер страницы, например в data атрибуте у .search_button путь там по умолчанию будет 1, при успешной загрузки меняй её на 2, и когда в следующий раз нажмут кнопку там уже будет вторая страница.