Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.05.2015, 15:08
Новичок на форуме
Отправить личное сообщение для arti0mka Посмотреть профиль Найти все сообщения от arti0mka
 
Регистрация: 14.05.2015
Сообщений: 4

атозаполнение с мультивыбором json
Заранее прошу прощения, наверняка буду блестать глупостями, но вопрос все же задам. Возможно кто то сможет посоветовать что то. Уже второй день маюсь не могу найти autocomplete с мульти выбором при этом чтоб данные передавались от php обработчика ajax+json, который в свою очередь выдергивает значения из базы. Возможно есть у кого какие варианты?
Ответить с цитированием
  #2 (permalink)  
Старый 14.05.2015, 15:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,214

Сообщение от arti0mka
второй день маюсь не могу найти autocomplete с мульти выбором
Т.е. делать сам не собираешься?
Ответить с цитированием
  #3 (permalink)  
Старый 14.05.2015, 20:59
Новичок на форуме
Отправить личное сообщение для arti0mka Посмотреть профиль Найти все сообщения от arti0mka
 
Регистрация: 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) );
}
<?
Ответить с цитированием
  #4 (permalink)  
Старый 14.05.2015, 21:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Определите глобально установки 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']);, а потом необработанное в запрос, так нельзя с точки зрения безопасности и возможной некорректной выборки.

Мультивыбор имеется ввиду выбрать в базе все записи соответствующие нескольким значениям выбранным в списке?
Ответить с цитированием
  #5 (permalink)  
Старый 14.05.2015, 22:25
Новичок на форуме
Отправить личное сообщение для arti0mka Посмотреть профиль Найти все сообщения от arti0mka
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 15.05.2015, 08:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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.
Ответить с цитированием
  #7 (permalink)  
Старый 15.05.2015, 09:02
Новичок на форуме
Отправить личное сообщение для arti0mka Посмотреть профиль Найти все сообщения от arti0mka
 
Регистрация: 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) {
    //обработка ошибок
}
огромное спасибо!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БД JSON вывод через jQuery Infinity178 jQuery 13 09.03.2015 21:32
Не могу распарсить JSON. gorenie jQuery 3 29.11.2013 22:26
Проблемы с jqGrid и JSON massacra_panda Библиотеки/Тулкиты/Фреймворки 1 08.10.2012 16:44
JSON или JSONP для запросов на другой сервер? Метод GET, для длинных сообщений? Kotakota jQuery 5 23.08.2011 23:12
jQuery. Обработка ошибок и JSON. mma_mma jQuery 3 19.07.2010 12:10