Обращение к бд по событию
Добрый день гуру программирования.
Столкнулся со следующей проблемой : 1. Выполняю "живой" поиск в mysql при нахождении необходимого нажимаю на данное поле в выпадающем списке и оно записывается в input, тут все хорошо. 2. После записи значения должен происходить новое обращение к бд и вывод уточняющих полей по записи. Добился подобного с перезагрузкой страницы, но пытаюсь реализовать через ajax и тут поплыл. Вот код: index.html <html> <head> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <style> .search{ position:relative; } .search_result{ background: #FFF; border: 1px #ccc solid; width: 100px; border-radius: 4px; max-height:100px; overflow-y:scroll; display:none; } .search_result li{ list-style: none; padding: 5px 10px; margin: 0 0 0 -40px; color: #0896D3; border-bottom: 1px #ccc solid; cursor: pointer; transition:0.3s; } .search_result li:hover{ background: #F9FF00; } </style> </head> <body> <input type="text" name="referal" placeholder="Судно" class="who" autocomplete="off"> <ul class="search_result"></ul> <p> <input type="text" name="Tsud" placeholder="Тип судна" class="who1" autocomplete="off" id = 'a'> <p> <input type="text" name="ImoSud" placeholder="IMO" class="who2"> <p> <input type="text" name="GTSud" placeholder="GT" class="who3"> <p> <input type="text" name="FlagSud" placeholder="Flag" class="who4"> </p></p></p></p> </body> </html> <script type="text/javascript"> $(function(){ $('.who').bind("change keyup input click", function() { if(this.value.length >= 3){ $.ajax({ type: 'post', url: "search.php", data: {'referal':this.value,'dt':'1'}, response: 'text', success: function(data){ $(".search_result").html(data).fadeIn(); } }) } }) $(".search_result").hover(function(){ $(".who").blur(); }) выбранный результат в input $(".search_result").on("click", "li", function(){ s_user = $(this).text(); $(".who").val(s_user); $(".search_result").fadeOut(); $.ajax({ type: 'post', url: "search.php", data: {'vvvvv':s_user,'dt':'2'}, response: 'text', success: function(data){ $("#a").html(data.a); $(".who1").val($(".type.")).text(); $(".who2").val($(".Flag.")); $(".who3").val($(".imo.")); $(".who4").val($(".GT.")); } }) }) }) </script> search.php <?php global $tutorial_db; $db_referal = new mysqli(); $db_referal->connect($dbhost, $dbuser, $dbpass, $dbname); $db_referal->set_charset("utf8"); if ($db_referal->connect_errno) { printf("Connect failed: %s\n", $db_referal->connect_error); exit(); } $search_string = $_POST['referal']; $search_string = $db_referal->real_escape_string($search_string); if (strlen($search_string) >= 1 && $search_string !== ' ') { $query = 'SELECT * FROM cydno2 WHERE Name LIKE "%'.$search_string.'%" OR IMO LIKE "%'.$search_string.'% LIMIT 10"'; $search_string = $db_referal->real_escape_string($search_string); $result = $db_referal->query($query); if ($_POST['dt'] == '1') { echo "<script type=\"text/javascript\"> alert(\" №1 \");</script>"; while ($row = $result -> fetch_array()) { // $row->set_charset("cp1251"); $str = $row['Name']; $str = iconv('UTF-8','CP1251' ,$str); echo "\n<li>".$str."</li>"; } } if ($_POST['dt'] == '2') { echo "<script type=\"text/javascript\"> alert(\" №2 \");</script>"; $search_str = $_POST['vvvvv']; $search_str = iconv('CP1251','UTF-8' ,$search_str); $query2 = "SELECT typesydno.Naumenovanie as type , Flag2.Name as flag, cydno2.IMO as imo, cydno2.GT as gt FROM `cydno2`, typesydno, Flag2 WHERE (cydno2.Name = '".$search_str."') AND (cydno2.Type = typesydno.Kod) and (cydno2.Flag = Flag2.Kod)"; $search_str = $db_referal->real_escape_string($search_str); $result2 = $db_referal->query($query2); while ($row = $result2 -> fetch_array()) { $type = $row['type']; } } } ?> И вот тут весь затык. :help: :help: :help: Тема первая, прошу не судить сильно за оформление. |
$('.who').bind("change keyup input click" - зачем такой винегрет да еще с click?
LIKE использует два символа как спецсимволы, а значит вхождения для этого оператора нужно экранировать. $db_referal->set_charset("utf8"); и $str = iconv('UTF-8','CP1251' ,$str); $search_str = iconv('CP1251','UTF-8' ,$search_str); таких безобразий быть не должно. echo "\n<li>".$str."</li>"; - и зачем выводить этот мусор клиенту? И потом, запрашивается в базе всего одно поле, почему тогда не exit('<li>' . implode('</li><li>', $result->fetch_all()) . '</li>'); Кстати, почему не проверяется возвращает ли что-то запрос? Вот так можно писать: while ( $row = $result2->fetch_array() ) но вот так $result2 -> fetch_array(), это уже далеко за гранью "небрежно". Цитата:
|
Запрос отрабатывает.
Проблемам в том что не заполняются input-ы class="who1", class="who2", class="who3", class="who4". Перебирал многое и переписывал, экспериментировал... В писаном примере поле lass="who1" - пустое, а остальные [object Object] - ну тут шли эксперименты. Просьба подсказать как вывести правильно? |
Второй запрос возвращает ответ не понятно какой, и при этом данные запроса имеют алиасы type, flag, ... и попытка не понятно с чего вдруг вставить данные ответа как $(".who1").val($(".type.")).text(); И причем тут в первом .text()?
|
Задумывался принцип следующий:
1) Выводится через живой "поиск" список значений. 2) По нажатию на элемент живого поиска (элемент списка) данный элемент заноситься в <input class="who"> 3) Происходит еще один запрос к бд с параметром введенным в <input class="who"> 4) полученные значение из запроса записываются в другие input-ы. т.е. <input class="who1"> равен $row['type'] <input class="who2"> равен $row['flag'] <input class="who1"> равен $row['imo'] <input class="who1"> равен $row['gt']. Вопрос в этом и стоит. Как возможно это реализовать? |
Цитата:
С другой стороны, если ответ сервера должен быть размещен в четыре поля ввода как их значения, то запрос к базе гарантированно должен возвращать одну запись. Хотя запрос $query2, не является таковой гарантией, допустим что это условие выполняется и серверу достаточно вернуть результат запроса как JSON: exit(json_encode($result2->fetch_assoc())); Обязательно fetch_assoc. Учтите, что JSON будет работать корректно только с данными в UTF кодировке (Ajax также), в противном случае текст отличный от английского передан не будет. Ранее было сказано - убрать бардак с кодировками. С учетом того, что запрос использует алиасы, клиент получит объект (после преобразования json, второй Ajax запрос должен иметь dataType: 'json') со свойствами type, flag, imo и gt. Если полям ввода, в которые как их значения нужно поместить ответ сервера, дать идентификаторы связанные с этими свойствами объекта, то есть: <input class="who1" id="type"> <input class="who2" id="flag"> <input class="who1" id="imo"> <input class="who1" id="gt"> то обходом в цикле полученного объекта поместить данные в поля согласно связи id_поля = свойство_объекта: success: function(data) { $.each(data, function(i, d) { $('#'+i).val(d) }) } PS. Вот это echo "<script type=\"text/javascript\"> alert(\" №2 \");</script>"; обязательно выбросить, иначе на клиенте будет ошибка при работе с JSON форматом. Да и даже как "отладчик" такое не годится в таком качестве, используйте отладчик браузера для контроля. |
Контент "search.php" Битрикс24 напоминает...
А если по делу, то это очень странная "конструкция": $(".who1").val($(".type.")).text(); $(".who2").val($(".Flag.")); $(".who3").val($(".imo.")); $(".who4").val($(".GT.")); JQ вообще поддерживает подобные селекторы ".Flag."? К инпуту метод "text" бессмысленно применять. search.php уязвим для SQL-инъекций, строка №50 должна быть до формирования запроса, который присваивается переменной "query2". |
Часовой пояс GMT +3, время: 16:34. |