2016-02-19 2 views
0

У меня есть таблица пользователей, и я хочу, чтобы иметь возможность фильтровать таблицу по столбцу электронной почты, поэтому я могу видеть всех пользователей с учетными записями «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 
) 
+1

Это, вероятно, прекратить делать это, если вы прошли значение с помощью привязки параметра, ** который будет также предотвратить уязвимость инъекции SQL, вы должны . ** Не знакомы с FluentPDO. Я не могу сказать вам, как это сделать, но этот код как никогда не должен доходить до производства в любом случае. – deceze

+0

@HankyPanky MySQL на самом деле не заботится о одиночных и двойных кавычках, если вы согласны. По-видимому, другие базы данных. Однако привязка параметров будет правильно указывать. – aynber

+0

@aynber Если вы используете привязку привязки к базе данных, она не будет приводить ее вообще, поскольку она никогда не интерполируется в строку запроса, а отправляется как отдельное значение. – deceze

ответ

1

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

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

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

Правильный способ: '-> где (" users.email LIKE CONCAT ('%',?, '%') ")', И тот же подход можно использовать и с обычным 'PDO'. Никаких проблем никогда не возникнет. – Mjh

+0

Спасибо deceze. Я работал над некоторыми другими фильтрами, и понял, что могу использовать токен '?'. Тогда тревога SQL-инъекций озарила меня. –

+0

@Mjh Почему concat внутри SQL лучше, чем concat внутри PHP? – deceze

Смежные вопросы