Обращение к бд по событию
Добрый день гуру программирования.
Столкнулся со следующей проблемой : 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, время: 00:49. |