使用 LIKE 和绑定值的 PDO 准备语句未找到任何结果 [重复]

Posted

技术标签:

【中文标题】使用 LIKE 和绑定值的 PDO 准备语句未找到任何结果 [重复]【英文标题】:PDO Prepared Statement using LIKE and Binded Values is Finding No Results [duplicate] 【发布时间】:2022-01-19 03:08:25 【问题描述】:

我正在尝试使用 PDO 准备语句来搜索 mysql 数据库...

try
    
    // Prepare PDO Statement
        $stmt = $readdb->prepare("SELECT * FROM athletes WHERE :search LIKE :term");

    // Bind
        $stmt->bindValue(':search', $search);
        $stmt->bindValue(':term', '%' . $term . '%');

    // Execute
        $stmt->execute();
    

...这不会产生错误,但也不会返回任何结果。

为了比较起见,如果我通过直接将变量插入语句来绕过绑定,它确实工作...

try
    
    // Prepare PDO Statement
        $stmt = $readdb->prepare("SELECT * FROM athletes WHERE $search LIKE '%$term%' ");

    // Execute
        $stmt->execute();
    

...但这显然是一个很大的安全漏洞。

我几乎可以肯定这是我正在犯的某种语法错误,但在花了两个多小时后,我希望新的眼睛可能会有所帮助。

我在这里遗漏了什么明显的东西吗?非常感谢,堆栈!

【问题讨论】:

您不能将列名绑定为参数。检查此问题以获取更多信息info 感谢@Faesal,但我不确定我是否遵循。你的意思是它实际上是我声明的:search 部分不正确,因为它引用了某个数据库列?编辑:是的,是的,你做到了。我刚测试过。感谢您让我走上正确的道路,这让我发疯了! 【参考方案1】:

为了其他有类似问题的人可能会偶然发现此线程,我将根据@Faesal 的评论在下面粘贴我的最终解决方案,“您不能将列名绑定为参数。”

try
    
    // Prepare PDO Statement
        $stmt = $readdb->prepare("SELECT * FROM athletes WHERE $search LIKE :term");

    // Bind
        $stmt->bindValue(':term', '%' . $term . '%');

    // Execute
        $stmt->execute();
    

$search 需要进行消毒。

再次感谢您的帮助!

【讨论】:

$stmt = $readdb->prepare("SELECT * FROM athletes WHERE $pdo->quote($search) LIKE :term"); 你试过这个 $pdo->quote($search) 东西吗?即使您设法正确地将 quote() 应用于 $search,a) 以这种方式编写也不起作用,而 b) 无论如何都不起作用,这仅仅是因为 quote 与 bindValue 所做的工作完全相同。您需要的是一个白名单过滤,如您被引导到的正确答案中所示,它“为他人着想”提供无与伦比的更好 @ShaunoftheDead 另外,请注意,如果您必须为列名使用变量,通常意味着您的数据库设置不佳。如果可能的话,你几乎应该避免这种情况。如果您绝对必须这样做,如果列来自客户端(例如来自用户端的下拉菜单或输入框),那么您应该验证他们使用的列是否确实有效。客户端可以操纵这些输入并返回他们想要的任何东西。如果它是从服务器提供的,则问题不大。 谢谢,@GrumpyCrouton!是的,实际上有一个进一步检查脚本,它排除了除少数所需值之外的所有内容,其他任何内容都立即拒绝出错。关于卫生的附加说明只是多余的。

以上是关于使用 LIKE 和绑定值的 PDO 准备语句未找到任何结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 准备语句——MySQL LIKE 查询

了解 PDO 准备好的语句和绑定参数

pdo 使用通配符准备语句

使用带占位符的 LIKE 准备语句 [重复]

mysql PDO如何绑定LIKE

Golang 中的跨数据库准备好的语句绑定(like 和 where in)