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