【发布时间】:2018-07-30 02:30:20
【问题描述】:
这开始于我试图弄清楚如何让某些东西发挥作用并且对我得到的输出感到困惑。当我测试以确保我清楚地写了这个问题时,我偶然发现了答案。现在这个问题变成了为什么它会这样,因为它让我非常困惑,让我相信这个问题与原来的完全不同。
我需要在我创建的 wordpress 数据库中查询一个自定义表。我需要几列并且可能有多行,所以我使用了$wpdb->get_results。但是,我知道防止 sql 注入非常重要,因此强烈建议将其与$wpdb->prepare 结合使用。在我看到的所有示例中,有几种方法似乎对其他人有用,例如:
$wpdb->get_results($wpdb->prepare(
"SELECT * FROM %s WHERE ADDRESS LIKE %%%s%%", $tableName, $address
));
或
$wpdb->get_results($wpdb->prepare(
"SELECT * FROM %s WHERE ADDRESS LIKE %s", $tableName, '%' . $address . '%'
));
但是,当我开发这个时,我使用了一个变量并打印到屏幕以进行调试,例如:
$theQuery = $wpdb->prepare(
"SELECT * FROM %s WHERE ADDRESS LIKE %s", $tableName, '%' . $address . '%'
);
printf(nl2br("theQuery: " . $theQuery . PHP_EOL));
当我查看结果时,我会收到:
theQuery: SELECT * FROM 'wp_table' WHERE ADDRESS LIKE '{38f7caa660e456637b3924006588169e1912b28c0a81d0a4ae0d77885704a425}11th ST{38f7caa660e456637b3924006588169e1912b28c0a81d0a4ae0d77885704a425}'
似乎$wpdb->prepare 语句导致 % 被转换为某种类型的 GUID。每次刷新页面时,GUID 的值都会发生变化,因此每次都会为 % 符号生成新的 GUID。这显然是它为 sql 注入提供安全性的方式的一部分,但由于我不知道它会以这种方式运行,也从未在文档中看到过,所以我认为这是我的问题。我尝试了很多组合,但总是无法检索到任何结果,我一直认为这是因为它与这些 GUID 行为不符。我最终发现实际问题是在准备语句中包含表名作为参数。它会导致查询在表名周围加上单引号,从而导致 MySQL 语法错误并且不返回任何结果。
为什么它会生成这些 GUID,并且在测试期间有没有办法将它们作为 % 打印到浏览器进行调试?
谢谢!
【问题讨论】:
标签: wordpress