Warning: Missing argument 2 for wpdb::prepare()

Warning: Missing argument 2 for wpdb::prepare()这样的报错信息,在看到这个信息的时候,你一定会以为是在更新的过程中哪里出了错,但请注意的是:这与你的更新及与你当前使用的主题完全没有关系!这是3.5版本中为了安全而做的一个改动,是为了避免SQL注入所引起的安全问题!

在你的主题footer.php文件中会有类似如下的代码:

$post_datetimes = $wpdb->get_row($wpdb->prepare(“SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > 1970″));

在3.5版本之前,这样的写法是没有任何问题的,如:

prepare(“SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > 1970″));

但是在3.5,上面的写法就是错的,正确的写法应当是:

prepare(“SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > %d”,’1970′));

看到上面的区别了吗?在SQL语句中,where条件变为了动态参数绑定形式:

post_date_gmt > %d”,’1970′

这种写法在系统的安全性方面要更好!

再给个普遍点的例子,这样写法是正确的:

$wpdb->prepare( "SELECT * FROM table WHERE id = %d"$id );

转自:http://www.zihou.me/html/2012/12/12/8079.html

0 条评论
发表一条评论

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。