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
);