我有一个用户表,我希望能够通过电子邮件列过滤该表,因此我可以看到所有用户使用' 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 "%a@b.c%"
我不知道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 :(得分:1)
它(显然不那么)"智能连接构建器"可能会看到.
并认为它与另一个表有关。您可能想要向作者提交错误。
然而,你很容易受到SQL注入攻击将输入直接连接到查询中。解决这个问题可能也会解决您的加入问题。快速查看documentation,参数绑定语法看起来应该是这样的:
$fpdo->from('users')
->where('users.email LIKE ?', '%' . trim($_GET['email']) . '%')
->fetchAll();