Я вижу здесь проблему:
$sWhere .= $aColumns[$i]." LIKE '%".$db_con->quote($_GET['sSearch_'.$i])."%' ";
Функция PDO::quote()
имеет выход, отличный от устаревшей устаревшей функции mysql_real_escape_string()
.
Предположим, ваша строка "O'Reilly" и вам нужен экранированный символ апострофа.
mysql_real_escape_string("O'Reilly")
вернет:
O\'Reilly
Принимая во внимание, $db_con->quote("O'Reilly")
вернется:
'O\'Reilly'
Функция quote () добавляет разделители строк в начало и конец строки. Это заставляет его работать так же, как встроенная функция MySQL QUOTE ()
Итак, когда вы используете PDO::quote()
так, как вы делаете:
$sWhere .= $aColumns[$i]." LIKE '%".$db_con->quote($_GET['sSearch_'.$i])."%' ";
Полученное предложение SQL выглядит так:
... WHERE mycolumn LIKE '%'search'%' ...
Это не сработает. Вы должны это быть:
... WHERE mycolumn LIKE '%search%' ...
Одним из решений является добавление подстановочных знаков %
и затем цитирование результата:
$sWhere .= $aColumns[$i]." LIKE ".$db_con->quote('%'.$_GET['sSearch_'.$i].'%') ;
Теперь используется PDO::quote()
добавление разделителей строк.
Кстати, я обнаружил, что все конкатенации строк .
делают PHP ужасным. Трудно написать код, трудно прочитать и отладить его. Я предпочитаю использовать переменные прямо внутри строки. И не бойтесь выполнять работу в две строки кода. Не всегда лучшая вещь для читабельности кода - слишком много в одну строку.
$pattern = $db_con->quote("%{$_GET["sSearch_$i"]}%");
$sWhere .= "{$aColumns[$i]} LIKE {$pattern}";
Но есть и другой способ, который проще и безопаснее.
Используйте параметры запроса вместо экранирования / цитирования.
$params[] = "%{$_GET["sSearch_$i"]}%";
$sWhere .= "{$aColumns[$i]} LIKE ?";
Потом позже ...
$stmt = $db_con->prepare($sQuery);
$stmt->execute($params);
while ($row = $stmt->fetchAll()) {
...
}
Использование параметров проще, чем экранирование / цитирование. Вам не нужно возиться с вопросом, правильно ли сбалансированы ваши кавычки, потому что заполнитель параметра ?
не нуждается в разделителях строк вокруг него.
Если вы изучаете PDO, я предлагаю почитать:
Оба важны и полезны. Справочные документы не так хороши для изучения, но они полезны после того, как вы выполните урок, чтобы напомнить себе о синтаксисе, аргументах, возвращаемых значениях и т. Д. Я сделал много кодов PDO, но я часто открываю справочные документы.