атозаполнение с мультивыбором json
Заранее прошу прощения, наверняка буду блестать глупостями, но вопрос все же задам. Возможно кто то сможет посоветовать что то. Уже второй день маюсь не могу найти autocomplete с мульти выбором при этом чтоб данные передавались от php обработчика ajax+json, который в свою очередь выдергивает значения из базы. Возможно есть у кого какие варианты?:thanks:
|
Цитата:
|
Цитата:
к примеру есть вариант <script type="text/javascript"> var urls = [ "facebook.com", "google.com", "twitter.com", "amirharel.com", "amazon.com", "microsoft.com", "quora.com", "walla.co.il", "ebay.com", "gowala.com", "myspace.com", "youtube.com" ]; function initURLTextarea(){ $("#outter textarea").autocomplete({ wordCount:1, mode: "outter", on: { query: function(text,cb){ var words = []; for( var i=0; i<urls.length; i++ ){ if( urls[i].toLowerCase().indexOf(text.toLowerCase()) == 0 ) words.push(urls[i]); } cb(words); } } }); } var countries = []; function initContriesTextarea(){ $.ajax("countries.txt",{ success: function(data, textStatus, jqXHR){ countries = data.replace(/\r/g, "" ).split("\n"); $("#contries textarea").autocomplete({ wordCount:1, on: { query: function(text,cb){ var words = []; for( var i=0; i<countries.length; i++ ){ if( countries[i].toLowerCase().indexOf(text.toLowerCase()) == 0 ) words.push(countries[i]); if( words.length > 5 ) break; } cb(words); } } }); } }); } $(document).ready(function(){ initContriesTextarea(); initURLTextarea(); }); при этом для одного элемента текстареа массив уже готов(формируется не через json) во втором вытягивается из текстового файла. И делема такова, как адаптировать скрипт работающий с текстовым фалом, или с массивом, чтоб можно было получить информацию ajax в json формате... Из этого обработчика: <?php header('Content-Type: text/html; charset=utf-8'); $db = new mysqli('мой_сервер_баз','мой_логин','пароль','имя_базы'); $db->query("SET NAMES UTF8"); if(isset($_GET['q'])){ $content = trim($_GET['term']); $query = $db->query("SELECT `notice` FROM `users_notice` WHERE `notice` LIKE '%".strval(strip_tags($content))."%' ORDER BY `notice`"); $result = array(); while($row = $query->fetch_object()){ $result[] = $row->notice; } exit( json_encode($result) ); } <? |
Определите глобально установки PDO:
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_CASE => PDO::CASE_LOWER .... и т.д. Запрос в данном случае лучше сразу вернуть как все строки результата: $result = $db->query("SELECT `notice` FROM `users_notice` WHERE `notice` LIKE '%".strval(strip_tags($content))."%' ORDER BY `notice`")->fetchAll(); //$result = array() и while не нужен, сразу после выборки exit( json_encode($result) ); Но так $content = trim($_GET['term']);, а потом необработанное в запрос, так нельзя с точки зрения безопасности и возможной некорректной выборки. Мультивыбор имеется ввиду выбрать в базе все записи соответствующие нескольким значениям выбранным в списке? |
Цитата:
более наглядно вот так: ![]() |
LIKE, это не лучшее для поиска, тем более, что в этот оператор не подставить просто так плейсхолдер PDO, без изврата не обойтись. Поэтому желательно бы пересмотреть условия выборки. Но, если как есть, то, во-первых задать нужно глобально конфигурацию PDO, чтобы не повторять параметры. Выполнять запросы в try ... catch (а вообще исключения обрабатывать глобально), по крайней мере при подключении к базе, иначе при ошибке параметры подключения вывалятся прямо в браузер пользователя.
LIKE использует символы _ и % как управляющие, а значит надо экранировать такие в параметрах. А сами параметры нужно экранировать, а не лепить типа strval(strip_tags($content)), в противном случае, это путь к инъекции. И чтобы ее исключить, нужно использовать подготовленный в PDO запрос. И получается так, если $_GET['term'], это стока параметров для поиска разделенная запятой, то: //сперва подготовить массив параметров поиска $a = array_diff(array_map(function($v) { return addCslashes(trim($v), '%_'); }, explode(',', $_GET['term'])), array('')); //формируем строку запроса $sql = 'SELECT notice FROM users_notice WHERE notice LIKE CONCAT("%", '.implode(', "%") OR notice LIKE CONCAT("%", ', array_fill(0, count($a), '?')).', "%") ORDER BY notice'; //параметры подключения и конфигурация - хранить в подключаемом файле define('DSH', 'mysql:host=localhost;dbname=base_name'); //конфигурация PDO $options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_CASE => PDO::CASE_LOWER ); //выполнение try { $db = new PDO(DSH, $user, $pass, $options); //подготавливаем запрос $q = $db->prepare($sql); //выполняем $q->execute($a); //получаем результат exit(json_encode($q->fetchAll())); } catch (PDOException $e) { //обработка ошибок } |
Цитата:
|
Часовой пояс GMT +3, время: 13:00. |