如何阻止 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();
我有 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();