使用 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 准备语句未找到任何结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章