我对$wpdb->prepare感到非常困惑。我想用它来清理用户输入,但结果是它破坏了查询。我无法想象它是如何工作的,但我无法找出我做错了什么。请耐心点,给我指出解决方案。下面的代码只是一个简单的示例,用于演示,目的是明确出现了什么问题以及如何出错。Later there will be user input 正在馈送此查询。
当我省略了“准备并使用sprintf”时,这个示例很有效:
global $wpdb;
$mydb = new \\wpdb( "My_Login" ,"My_PW" , "My_Custom_DB" ,"localhost"); //wpdb instance for my custom db
$tablename = "books";
$sort_direction = "DESC";
$limit = 5;
$sqlquery = sprintf( "SELECT * FROM %s ORDER BY datum %s LIMIT %d", $tablename, $sort_direction, $limit );
$res = $mydb->get_results( $sqlquery );
echo "<br>".$sqlquery."<br>";
var_dump($res);
var\\u dump()的输出是包含预期结果的正确数组。
$sqlquery的输出为:
SELECT * FROM books ORDER BY datum DESC LIMIT 5
这是正确的SQL。
现在我将使用prepare(这是唯一更改的行):
global $wpdb;
$mydb = new \\wpdb( "My_Login" ,"My_PW" , "My_Custom_DB" ,"localhost"); //wpdb instance for my custom db
$tablename = "books";
$sort_direction = "DESC";
$limit = 5;
$sqlquery = $mydb->prepare( "SELECT * FROM %s ORDER BY datum %s LIMIT %d", $tablename, $sort_direction, $limit );
$res = $mydb->get_results( $sqlquery );
echo "<br>".$sqlquery."<br>";
var_dump($res);
var\\u dump()的输出为
NULL$sqlquery的输出为:
SELECT * FROM \'books\' ORDER BY datum \'DESC\' LIMIT 5
显然,表名和描述不应该用引号括起来。在我看来,这就是它失败的原因。我仔细检查了一下,这与实例化$wpdb无关。当我使用$wpdb时,转义结果是相同的。
发生了什么事,或者我做错了什么?请帮帮我。