14.05.2015, 15:08
|
Новичок на форуме
|
|
Регистрация: 14.05.2015
Сообщений: 4
|
|
атозаполнение с мультивыбором json
Заранее прошу прощения, наверняка буду блестать глупостями, но вопрос все же задам. Возможно кто то сможет посоветовать что то. Уже второй день маюсь не могу найти autocomplete с мульти выбором при этом чтоб данные передавались от php обработчика ajax+json, который в свою очередь выдергивает значения из базы. Возможно есть у кого какие варианты?
|
|
14.05.2015, 15:31
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от arti0mka
|
второй день маюсь не могу найти autocomplete с мульти выбором
|
Т.е. делать сам не собираешься?
|
|
14.05.2015, 20:59
|
Новичок на форуме
|
|
Регистрация: 14.05.2015
Сообщений: 4
|
|
Сообщение от ksa
|
Т.е. делать сам не собираешься?
|
ума не хватает к сожалению даже адаптировать уже имеющееся....
к примеру есть вариант
<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) );
}
<?
|
|
14.05.2015, 21:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Определите глобально установки 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']);, а потом необработанное в запрос, так нельзя с точки зрения безопасности и возможной некорректной выборки.
Мультивыбор имеется ввиду выбрать в базе все записи соответствующие нескольким значениям выбранным в списке?
|
|
14.05.2015, 22:25
|
Новичок на форуме
|
|
Регистрация: 14.05.2015
Сообщений: 4
|
|
Сообщение от laimas
|
Определите глобально установки 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']);, а потом необработанное в запрос, так нельзя с точки зрения безопасности и возможной некорректной выборки.
Мультивыбор имеется ввиду выбрать в базе все записи соответствующие нескольким значениям выбранным в списке?
|
Огромное спасибо за разъяснения и проявленный интерес к вопросу, в моей интерпретации мультивыбор - это означает, что из базы выдергиваются все значения подходящие под переданный параметр, но в элементе текстареа их будет несколько, а вернее несколько десятков, а может даже сотен. Оптимально если не использовать разделители, только пробел(в большенстве найденных примеров используется как разделитель ", ").
более наглядно вот так:
Последний раз редактировалось arti0mka, 14.05.2015 в 22:28.
|
|
15.05.2015, 08:15
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
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) {
//обработка ошибок
}
Последний раз редактировалось laimas, 15.05.2015 в 08:22.
|
|
15.05.2015, 09:02
|
Новичок на форуме
|
|
Регистрация: 14.05.2015
Сообщений: 4
|
|
Сообщение от laimas
|
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) {
//обработка ошибок
}
|
огромное спасибо!
|
|
|
|