我有一个用户表,我希望能够通过电子邮件列过滤该表,例如,我可以看到所有具有“ 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();

08-04 10:50