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) {
//обработка ошибок
}
|