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

时间:2016-02-19 15:00:25

标签: php mysql fluentpdo

我有一个用户表,我希望能够通过电子邮件列过滤该表,因此我可以看到所有用户使用' 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
)

1 个答案:

答案 0 :(得分:1)

它(显然不那么)"智能连接构建器"可能会看到.并认为它与另一个表有关。您可能想要向作者提交错误。

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

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