Как остановить FluentPDO, неправильно выводя имя таблицы

У меня есть таблица пользователей, и я хочу иметь возможность фильтровать таблицу по столбцу электронной почты, чтобы я мог видеть всех пользователей с учетными записями «gmail.com», например.

Мой текущий запрос fpdo выглядит так:

$filter_email = trim($_GET['email']);
$fpdo->from('users')
->where('users.email LIKE "%' . $filter_email . '%"')
->fetchAll();

Когда я установил $filter_email в A @ б, все работает нормально, и FluentPDO генерирует этот оператор SQL:

SELECT users.* FROM users
WHERE users.email LIKE "%a@b%"

Но если я ищу [email protected] FluentPDO пытается найти таблицу b и ошибки

SELECT users.* FROM users
LEFT JOIN b ON b.id = users.b_id
WHERE users.email LIKE "%[email protected]%"

Я не знаю, как видит FluentPDO b.c в качестве таблицы, к которой можно присоединиться, или как ее остановить.

РЕШЕНИЕ

В основном благодаря deceze, а также aynber, вот рабочее решение:

$filter_email = '%'.trim($_GET['email']).'%';
$fpdo->from('users')
->where('users.email LIKE ?',$filter_email)
->fetchAll();

Мой фактический запрос проверяет три разных поля электронной почты, но использует три ? и добавление $filter_email три раза работает просто отлично

->where(
'(users.email1 LIKE ? OR users.email2 LIKE ? OR users.email1 LIKE ?)',
$filter_email,
$filter_email,
$filter_email
)

0

Решение

Его (по-видимому, не так) «умный строитель соединений», вероятно, видит . и думает, что это относится к другой таблице. Возможно, вы захотите сообщить об ошибке автору.

Тем не мение, вы уязвимы для внедрения SQL конкатенация ввода непосредственно в запрос, как это. Решение этого, вероятно, также решит вашу проблему с присоединением. Быстро просматривая документация, синтаксис привязки параметров выглядит так:

$fpdo->from('users')
->where('users.email LIKE ?', '%' . trim($_GET['email']) . '%')
->fetchAll();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]