Как использовать метод where в FluentPDO

Хочу сделать выгрузку заявок из БД по полю с названием (короче, обычный поиск). Но в названии присутствуют символы, такие как точка и двоеточие. Например: "БОТ:Заявка.20.01". Из-за этого выдается ошибка: Uncaught Exception: Objects returned by Envms\FluentPDO\Queries\Select::getIterator() must be traversable or implement interface Iterator

Как сделать так, чтобы запрос работал с подобными символами? Сразу скажу, замена символов через replace и прочее мне не подходит.

$clients = $this->db->from(Feedback::getTable());
if (!empty($search['search'])) {
  $clients->where($search['column'].' LIKE "%'.$string.'%"');
}
 $clients->limit($pagination['limit'])
  ->offset($pagination['offset'])
  ->orderBy('id DESC')
  ->fetchAll();

ошибка

Fatal error: Uncaught Exception: Objects returned by Envms\FluentPDO\Queries\Select::getIterator() must be traversable or implement interface Iterator in E:\OldPC\OpenServer\domains\crm_logistic\vendor\twig\twig\src\Environment.php(358) : eval()'d code:136 Stack trace: #0 E:\OldPC\OpenServer\domains\crm_logistic\vendor\twig\twig\src\Template.php(173): __TwigTemplate_c3ac69549356e7965f8a8a75880e45b7d155fe59f92d2b13c1bdbfd8899c2173->block_body() #1 E:\OldPC\OpenServer\domains\crm_logistic\vendor\twig\twig\src\Environment.php(358) : eval()'d code(117): Twig\Template->displayBlock() #2 E:\OldPC\OpenServer\domains\crm_logistic\vendor\twig\twig\src\Template.php(396): __TwigTemplate_4dd3dc12226d1b6cca662d543b3a03a3070b876e8e1e83936952ed63d409fa93->doDisplay() #3 E:\OldPC\OpenServer\domains\crm_logistic\vendor\twig\twig\src\Template.php(369): Twig\Template->displayWithErrorHandling() #4 E:\OldPC\OpenServer\domains\crm_logistic\vendor\twig\twig\src\Environment.php(358) : eval()'d code(43): Twig\Template->display() #5 E:\OldPC\Open in E:\OldPC\OpenServer\domains\crm_logistic\templates\view\panel\feedback.html.twig on line 56

Дамп объекта

object(Envms\FluentPDO\Queries\Select)#43 (16) { ["fromTable":"Envms\FluentPDO\Queries\Select":private]=> string(8) "feedback" ["fromAlias":"Envms\FluentPDO\Queries\Select":private]=> string(8) "feedback" ["validMethods":"Envms\FluentPDO\Queries\Common":private]=> array(15) { [0]=> string(7) "comment" [1]=> string(4) "from" [2]=> string(8) "fullJoin" [3]=> string(5) "group" [4]=> string(7) "groupBy" [5]=> string(6) "having" [6]=> string(9) "innerJoin" [7]=> string(4) "join" [8]=> string(8) "leftJoin" [9]=> string(5) "limit" [10]=> string(6) "offset" [11]=> string(5) "order" [12]=> string(7) "orderBy" [13]=> string(9) "outerJoin" [14]=> string(9) "rightJoin" } ["joins":protected]=> array(2) { [0]=> string(8) "feedback" [1]=> string(8) "Тест" } ["isSmartJoinEnabled":protected]=> bool(true) ["totalTime":"Envms\FluentPDO\Queries\Base":private]=> NULL ["executionTime":"Envms\FluentPDO\Queries\Base":private]=> NULL ["object":"Envms\FluentPDO\Queries\Base":private]=> bool(false) ["fluent":protected]=> object(Envms\FluentPDO\Query)#41 (9) { ["pdo":protected]=> object(PDO)#40 (0) { } ["structure":protected]=> object(Envms\FluentPDO\Structure)#42 (2) { ["primaryKey":"Envms\FluentPDO\Structure":private]=> string(2) "id" ["foreignKey":"Envms\FluentPDO\Structure":private]=> string(5) "%s_id" } ["debug"]=> bool(false) ["convertRead"]=> bool(false) ["convertWrite"]=> bool(false) ["exceptionOnError"]=> bool(false) ["table":protected]=> string(8) "feedback" ["prefix":protected]=> string(0) "" ["separator":protected]=> string(0) "" } ["result":protected]=> bool(false) ["clauses":protected]=> array(10) { ["SELECT"]=> string(2) ", " ["FROM"]=> NULL ["JOIN"]=> array(2) { [0]=> RECURSION [1]=> string(13) "getClauseJoin" } ["WHERE"]=> array(2) { [0]=> RECURSION [1]=> string(14) "getClauseWhere" } ["GROUP BY"]=> string(1) "," ["HAVING"]=> string(5) " AND " ["ORDER BY"]=> string(2) ", " ["LIMIT"]=> NULL ["OFFSET"]=> NULL [" --"]=> string(3) " --" } ["statements":protected]=> array(10) { ["SELECT"]=> array(1) { [0]=> string(10) "feedback.*" } ["FROM"]=> string(8) "feedback" ["JOIN"]=> array(1) { [0]=> string(57) " LEFT JOIN Тест ON Тест.feedback_id = feedback.id" } ["WHERE"]=> array(1) { [0]=> array(2) { [0]=> string(3) "AND" [1]=> string(30) "timetable LIKE "%Тест.22%"" } } ["GROUP BY"]=> array(0) { } ["HAVING"]=> array(0) { } ["ORDER BY"]=> array(1) { [0]=> string(7) "id DESC" } ["LIMIT"]=> int(20) ["OFFSET"]=> int(0) [" --"]=> array(0) { } } ["parameters":protected]=> array(10) { ["SELECT"]=> array(0) { } ["FROM"]=> NULL ["JOIN"]=> array(0) { } ["WHERE"]=> array(0) { } ["GROUP BY"]=> array(0) { } ["HAVING"]=> array(0) { } ["ORDER BY"]=> array(0) { } ["LIMIT"]=> array(0) { } ["OFFSET"]=> array(0) { } [" --"]=> array(0) { } } ["regex":protected]=> object(Envms\FluentPDO\Regex)#44 (0) { } ["message":protected]=> string(90) "SQLSTATE: 42S02 - Driver Code: 1146 - Message: Table 'crm_logistic.тест' doesn't exist" ["currentFetchMode":protected]=> int(2) }


Ответы (1 шт):

Автор решения: Ипатьев

В первую очередь я бы порекомендовал вообще не использовать это древнее и кривое поделие.

Но если уж приходится, то тогда надо ознакомиться хотя бы c самыми базовыми операциями. В частности, синтаксисом метода where().

Как можно увидеть в первом же примере на сайте проекта, данные в этот метод должны передаваться через плейсхолдеры. Как это и должно быть при любом взаимодействии с базой данных.

То есть эта строка должна выглядеть как

$clients->where('column LIKE ?' ,"%$string%");

и в этом случае запрос хотя бы не будет выдавать ошибок синтаксиса на пустом месте.

причем в первом параметре не должно быть никаких переменных. тем более приходящих с клиента

→ Ссылка