gpt4 book ai didi

php - 如何阻止 FluentPDO 错误地推断表名

转载 作者:行者123 更新时间:2023-11-29 11:42:41 24 4
gpt4 key购买 nike

我有一个用户表,我希望能够按电子邮件列过滤该表,以便我可以查看拥有“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
)

最佳答案

它的(显然不是这样)“智能连接构建器”可能会看到 . 并认为它与另一个表相关。您可能想向作者提交错误。

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

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

关于php - 如何阻止 FluentPDO 错误地推断表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35508298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com