$wpdb->Prepare不创建我可以多次执行的预准备语句吗?

时间:2011-06-20 作者:JM at Work

我在想语法

$sql = $wpdb->prepare( \'query\' [, value_parameter, value_parameter ... ] )
看起来(从prepare中的语法-值来看),它只是简单地转义值,而不是创建一个prepared语句,当我多次执行它时,它会给我带来性能上的好处,不同的参数会吗?

在第二次查看时,由于值是可选的,所以我可以在准备后设置它们?我该怎么做?

2 个回复
最合适的回答,由SO网友:Hameedullah Khan 整理而成

$wpdb-prepare 工作原理如下sprintfvsprintf. 第一个参数始终是格式字符串。

唯一可接受的格式说明符是%s%d. 其他我从未测试过的,但可能会导致按照Codex分析错误。您必须转义文字% 在查询中使用%, e、 g:%%

如果你像这样使用它sprintf 只有在运行时之前知道参数的数量,才可能做到这一点。参数的数量应该与格式字符串中的格式说明符的数量相匹配。

E.g: $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}_votes WHERE post_id = %d AND username = %s", $post_id, $username );

如果直到运行时才知道参数的数量,那么必须像vsprintf. 在这种情况下,第一个参数将是格式说明符,但第二个参数将是数组。

E.g: $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}_votes WHERE post_id = %d AND username = %s", array( $post_id, $username ) );

$wpdb->prepare 将返回一个SQL查询字符串,您可以任意多次执行该字符串。

对于上述示例,结果查询将为:SELECT * FROM wp_votes WHERE post_id = 747 AND username = \'cooluser\'

SO网友:user49582

我想不用说,开发人员希望“准备好的”声明意味着"prepared" in the database!

有人在一个子问题中问到,这句话是否可以反复使用。wpdb->prepare实际上并没有“准备”语句。它只清理输入。你可以在:wordpress/wp includes/wp db中看到这一点。php。查找prepare函数,您会发现它只是创建了一个普通的未准备好的查询:

$query = array_shift($args);
$query = str_replace("\'%s\'", \'%s\', $query);
$query = str_replace(\'"%s"\', \'%s\', $query);
$query = str_replace(\'%s\', "\'%s\'", $query); // quote the strings
array_walk($args, array(&$this, \'escape_by_ref\'));
return @vsprintf($query, $args); 
基本上,wpdb->prepare函数应该被称为“sanitize”或“clean”之类的函数。将其称为“prepare”对任何了解SQL的人来说都是一种误导。

结束

相关推荐

GET PHP FATAL Error on Globalized$wpdb:调用非对象上的成员函数INSERT()-我没有线索。怎么办呢?

我正在尝试利用这个功能。我不明白为什么我仍然会遇到PHP错误。我所能理解的是,由于某种原因,模板无法访问$wpdb。我不知道函数中需要放置哪一行。包含此函数的php(在主题文件夹中)文件。请帮帮我!!function submitWeightUpdate( $userid, $weight ) { global $wpdb; $result = $wpdb->insert( \'wp_weights\', array( \'user_id\' => $