У меня есть таблица пользователей, и я хочу иметь возможность фильтровать таблицу по столбцу электронной почты, чтобы я мог видеть всех пользователей с учетными записями «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
)
Его (по-видимому, не так) «умный строитель соединений», вероятно, видит .
и думает, что это относится к другой таблице. Возможно, вы захотите сообщить об ошибке автору.
Тем не мение, вы уязвимы для внедрения SQL конкатенация ввода непосредственно в запрос, как это. Решение этого, вероятно, также решит вашу проблему с присоединением. Быстро просматривая документация, синтаксис привязки параметров выглядит так:
$fpdo->from('users')
->where('users.email LIKE ?', '%' . trim($_GET['email']) . '%')
->fetchAll();
Других решений пока нет …