我有一个用户表,我希望能够通过电子邮件列过滤该表,例如,我可以看到所有具有“ gmail.com”帐户的用户。
我当前的fpdo查询如下所示:
$filter_email = trim($_GET['email']);
$fpdo->from('users')
->where('users.email LIKE "%' . $filter_email . '%"')
->fetchAll();
当我将
$filter_email
设置为a @ b时,一切正常,并且FluentPDO生成此SQL语句:SELECT users.* FROM users
WHERE users.email LIKE "%a@b%"
但是,如果我搜索a @ b.c,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注入的影响,从而将输入直接连接到查询中。解决该问题也可能会解决您的加入问题。快速查看documentation,参数绑定语法看起来应该是这样的:
$fpdo->from('users')
->where('users.email LIKE ?', '%' . trim($_GET['email']) . '%')
->fetchAll();