У меня есть таблица пользователей, и я хочу, чтобы иметь возможность фильтровать таблицу по столбцу электронной почты, поэтому я могу видеть всех пользователей с учетными записями «gmail.com», для пример.Как остановить FluentPDO неправильно вывести имя таблицы
Мой текущий запрос fpdo выглядит следующим образом:
$filter_email = trim($_GET['email']);
$fpdo->from('users')
->where('users.email LIKE "%' . $filter_email . '%"')
->fetchAll();
Когда я установил $filter_email
в в @ б, все работает отлично, и FluentPDO генерирует этот SQL заявление:
SELECT users.* FROM users
WHERE users.email LIKE "%[email protected]%"
Но если Я ищу a @ bc 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, вы должны . ** Не знакомы с FluentPDO. Я не могу сказать вам, как это сделать, но этот код как никогда не должен доходить до производства в любом случае. – deceze
@HankyPanky MySQL на самом деле не заботится о одиночных и двойных кавычках, если вы согласны. По-видимому, другие базы данных. Однако привязка параметров будет правильно указывать. – aynber
@aynber Если вы используете привязку привязки к базе данных, она не будет приводить ее вообще, поскольку она никогда не интерполируется в строку запроса, а отправляется как отдельное значение. – deceze