如何阻止 FluentPDO 错误地推断 table 名称

How to stop FluentPDO incorrectly inferring a table name

我有 table 个用户,我希望能够通过电子邮件列过滤 table,这样我就可以看到所有拥有 '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 会尝试找到 table b 和错误

SELECT users.* FROM users
LEFT JOIN b ON b.id = users.b_id
WHERE users.email LIKE "%a@b.c%"

我不知道 FluentPDO 如何将 b.c 视为 table 加入,或如何阻止它。

解决方案

主要感谢 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
)

它的(显然不是这样)"smart join builder" 可能看到 . 并认为它与另一个 table 相关。您可能想向作者提交错误。

但是,您很容易受到 SQL 注入 的攻击,将输入直接连接到查询中。解决这个问题也可能会解决您的加入问题。快速查看 documentation,参数绑定语法看起来应该是这样的:

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