Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.05.2017, 02:59
Новичок на форуме
Отправить личное сообщение для Лев Посмотреть профиль Найти все сообщения от Лев
 
Регистрация: 17.03.2016
Сообщений: 3

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



И вот тут весь затык.

Тема первая, прошу не судить сильно за оформление.
Ответить с цитированием
  #2 (permalink)  
Старый 03.05.2017, 03:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

$('.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(), это уже далеко за гранью "небрежно".

Сообщение от Лев
И вот тут весь затык
В чем?
Ответить с цитированием
  #3 (permalink)  
Старый 03.05.2017, 04:07
Новичок на форуме
Отправить личное сообщение для Лев Посмотреть профиль Найти все сообщения от Лев
 
Регистрация: 17.03.2016
Сообщений: 3

Запрос отрабатывает.
Проблемам в том что не заполняются input-ы class="who1", class="who2", class="who3", class="who4".
Перебирал многое и переписывал, экспериментировал...
В писаном примере поле lass="who1" - пустое, а остальные [object Object] - ну тут шли эксперименты.
Просьба подсказать как вывести правильно?
Ответить с цитированием
  #4 (permalink)  
Старый 03.05.2017, 04:29
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Второй запрос возвращает ответ не понятно какой, и при этом данные запроса имеют алиасы type, flag, ... и попытка не понятно с чего вдруг вставить данные ответа как $(".who1").val($(".type.")).text(); И причем тут в первом .text()?
Ответить с цитированием
  #5 (permalink)  
Старый 03.05.2017, 06:09
Новичок на форуме
Отправить личное сообщение для Лев Посмотреть профиль Найти все сообщения от Лев
 
Регистрация: 17.03.2016
Сообщений: 3

Задумывался принцип следующий:
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'].

Вопрос в этом и стоит.
Как возможно это реализовать?
Ответить с цитированием
  #6 (permalink)  
Старый 03.05.2017, 06:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Лев
Как возможно это реализовать?
Я же писал, что второй запрос у вас ничего не возвращает, а если и возвращает, но не написано просто, то что?

С другой стороны, если ответ сервера должен быть размещен в четыре поля ввода как их значения, то запрос к базе гарантированно должен возвращать одну запись. Хотя запрос $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 форматом. Да и даже как "отладчик" такое не годится в таком качестве, используйте отладчик браузера для контроля.

Последний раз редактировалось laimas, 03.05.2017 в 07:21.
Ответить с цитированием
  #7 (permalink)  
Старый 05.05.2017, 14:13
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Контент "search.php" Битрикс24 напоминает...

А если по делу, то это очень странная "конструкция":
$(".who1").val($(".type.")).text();
                            $(".who2").val($(".Flag."));
                            $(".who3").val($(".imo."));
                            $(".who4").val($(".GT."));

JQ вообще поддерживает подобные селекторы ".Flag."?
К инпуту метод "text" бессмысленно применять.

search.php уязвим для SQL-инъекций, строка №50 должна быть до формирования запроса, который присваивается переменной "query2".
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перестает работать обращение к идентификаотру ghosttim Элементы интерфейса 2 15.09.2016 15:49
вывести окно по событию cyklop_77 Библиотеки/Тулкиты/Фреймворки 0 22.12.2013 08:20
По событию onmouseover задваевается онимация strengerst Events/DOM/Window 6 31.12.2012 16:27
Как реализовать обращение к объекту, конкретнее см внутри kichSman jQuery 4 15.08.2012 18:06
Ошибка при добавлении обработчика к событию Riim Events/DOM/Window 32 19.01.2010 14:17