Javascript.RU

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

AJAX живой поиск и запись в массив с обработкой
нашёл код живого поиск:

index.php

<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="content-type" content="text/html">
    <meta charset="utf-8">
	<title>Поиск</title>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="js/search.js"></script>
    <link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>

    <input type="text" name="referal" placeholder="Введите фамилию" value="" class="who"  autocomplete="off">
    <ul class="search_result"></ul>

</body>
</html>


style.css

Код:
.search{
    position:relative;
}

.search_result{
    background: #FFF;
    border: 1px #ccc solid;
    width: 350px;
    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;
}
search.php

<?php

define("DB_HOST","localhost");
define("DB_NAME","rtss"); //Имя базы
define("DB_USER","rtss"); //Пользователь
define("DB_PASSWORD","12345"); //Пароль

$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$mysqli -> query("SET NAMES 'utf8'") or die ("Ошибка соединения с базой!");

if(!empty($_POST["referal"])){ //Принимаем данные

    $referal = trim(strip_tags(stripcslashes(htmlspecialchars($_POST["referal"]))));

    $db_referal = $mysqli -> query("SELECT * from passport WHERE surname LIKE '%$referal%'")
    or die('Ошибка №'.__LINE__.'<br>Обратитесь к администратору сайта пожалуйста, сообщив номер ошибки.');

    while ($row = $db_referal -> fetch_array()) {
        echo "\n<li>".$row["surname"].' '.$row["name"].' '.$row["middle_name"].' ('.$row["birth_year"].')';"</li>";
    }
}
?>


search.js

$(function(){
    
    //Живой поиск
    $('.who').bind("change keyup input click", function() {
        if(this.value.length >= 2){
            $.ajax({
                type: 'post',
                url: "search.php", //Путь к обработчику
                data: {'referal':this.value},
                response: 'text',
                success: function(data){
                    $(".search_result").html(data).fadeIn(); //Выводим полученые данные в списке
                }
            })
        }
    })
    
    $(".search_result").hover(function(){
        $(".who").blur(); //Убираем фокус с input
    })
    
    //При выборе результата поиска, прячем список и заносим выбранный результат в input
    $(".search_result").on("click", "li", function(){
        s_user = $(this).text();
        $(".who").val(s_user).attr('disabled', 'disabled'); //деактивируем input, если нужно
        $(".search_result").fadeOut();
    })

})



А теперь в чём суть вопроса\проблемы.
Этот живой поиск часть того, что нужно.
Есть таблица passport, содержащая паспортные данные человека.
Поиск проходит по фамилии, выводит ФИО+дату рождения.
Есть таблица участником мероприятия (похода) - hike_member. В таблицу нужно добавлять участников из таблицы passport по id_passport.
И сразу же для участника каждого нужно добавить его роль в походе (из таблицы справочника выпадающий списком запросов к базе - hike_post). Выводить такой выпадающий список я умею.

Я думал, что в поле осуществляется поиск живой участника. При выборе фамилии она заносится в поисковое поле и сама строчка блокируется. В скрытое поле заносится id_passport. И правее в выпадающем списке (кооторый появляется после выбора фамилии) выбирается роль (id_hike_post уже есть в самом выпадающем списке).

<?php
$query = "SELECT * FROM hike_post"; //заносим в переменную текст запроса
$result = $connection->query($query); //заносим в переменную результат запроса
if (!$result) die($connection->error) & mysqli_close() & exit(); //если ошибка, то выводим текст ошибки, закрываем соединение с базой и завершаем выполнение
$myrow = $result->fetch_array(MYSQLI_ASSOC); //извлекаем из переменной result первую строчку данных в виде массива
echo "<select name = 'hike_post'>";
do {
echo "<option value = '".$myrow['id_hike_post']."'>".$myrow['hike_post']."</option>"; //из переменной myrow извлекаем нужное поле d цикле и формируем значения выпадающего списка
} while ($myrow = $result->fetch_array(MYSQLI_ASSOC)); //цикл до тех пор, пока в переменной result есть строчки
echo "</select>";?>



После передать все значения (Кнопка Отправить) методом POST на обработчик, который занесёт эти данные (id_passport из скрытого поля и id_hike_post из выпадающего списка) в базу.

После отправки обработчик возвращает на страницу поиска (или поиск и обработчик на одной странице оставить..). И добавляется новый участник похода.

Скрин кусочка базы:

Image 6.jpg

Помогите, пожалуйста, как это лучше реализовать. Может другой схемой как-то... Просто я в javascript не разбираюсь совсем...

Help, словом.

P.S. Сначала была идея с массивом. Но передумал. Мне бы хоть с этим разобраться...
Ответить с цитированием
  #2 (permalink)  
Старый 18.08.2015, 18:03
Новичок на форуме
Отправить личное сообщение для vitamin Посмотреть профиль Найти все сообщения от vitamin
 
Регистрация: 06.09.2012
Сообщений: 5

Совет не совсем по теме, но близко к тому. Если хотите реализовать качественный живой поиск, то не рекомендую полагаться на mysql и конструкции вроде

SELECT * from passport WHERE surname LIKE '%$referal%'


Рекомендую познакомиться и начинать как можно скорее использовать более подходящие инструменты вроде Sphinx или Apache Solr. Я лично нахожу Apache Solr более удобным. Ну и совет сразу же использовать его в cloud или кластерном режиме, а не режиме standalone. А поиск по мускулю с помощью LIKE - это от лукавого, пора уже серьезные вещи использовать. Ну и еще совет, вообще не рекомендую mysql использовать. К сожалению книжные полки в магазинах завалены книгами а-ля PHP + MySQl, Оптимизация MySQL и т.д. Говорю к сожалению, потому что на крупных проектах убедился, что хуже MySQL трудно представить другую базу данных. В конце концов, если использование реляционной базы принципиально, то пока база исходников не разрослась и количество селектов и прочих конструкций со всякими мускульными примочками не разрослось, лучше как можно скорее перейдите на PostgreSQL. Ну и не забывайте про кэширование. Нет смысла каждый раз делать LIKE 'блаблабла', если с момента последнего редактирования данных уже куча пользователей делали подобный запрос к базе. Для этого можете использовать например Redis, выбрав в качестве ключа наименование таблицы и закодированное поисковое слово. Удачи!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск ссылок в div и записываем данные в массив dima85 jQuery 3 14.06.2015 21:40
Отправить массив клиенту в ответ на ajax ascherbakov AJAX и COMET 14 03.12.2014 01:12
Живой поиск JQUERY + AJAX + PHP + MYSQL dimi007 AJAX и COMET 2 22.07.2014 13:50
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Массив AJAX + JSON RCuPeR AJAX и COMET 4 09.02.2011 12:34