WordPress升级到3.5以上后wpdb::prepare() 报错的解决办法

2014-04-09 17:38 阅读 312 次 评论关闭

WordPress 3.5 正式发布, 这个版本包括大量更新. 启用了最新的响应式布局默认主题 Twenty Twelve; 改版了 Admin 界面, 更加简洁而且针对移动设备进行了优化;  但是... WordPress 秉承一贯的作风, 也偷偷改了一些内部方法, 现在 wpdb::prepare() 必须填入第二个参数, 否则报错如下.

Warning: Missing argument 2 for wpdb::prepare(), called in xxx.php on line 75 and defined in /www/wp-includes/wp-db.php on line 990

 

wpdb::prepare() 的第二个参数

从技术上 WordPress 这样修改 prepare 并没有错, 因为这是用来组装 SQL 语句的方法, 按常理来说必须有带变量的字符串作为第一个参数和第二个作为变量的参数, 这是为了避免 SQL 注入所引起的安全问题. 但是 WordPress 从 2.2 或者更早版本允许了忽略第二个参数的写法, 现在突然令第二个参数成为必填, 必然导致很多主题和插件不能正常使用.

解决办法

在更新主题之前, 我先在这里说说解决办法, 让用户们自己可以先解决一下, 相信还有其他主题或者插件可能也会有类似问题, 希望对大家有帮助.

  1. 我们需要先定位出现问题的文件和代码. PHP 的代码报错很精准的, 打开报错提醒中的文件 (前一个文件, 不是 wp-db.php), 找到代码 $wpdb->prepare.
  2. 为该方法添加一个空串作为第二个参数, 比如: $wpdb->prepare('xxx'); 改为 $wpdb->prepare('xxx', ''); 即可.

总结

WordPress 也不是第一次偷偷修改方法调用方式了, WordPress 2.7 的时候也要求 comments_template 必须输入第二个方法, 但是当时是为了扩展功能, 这次我真的不解. 除了安全考虑, WordPress 也可能有意淘汰一些不积极更新的主题, 我的主题明明向后兼容做得很好的, 实在太没节操了.



版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:WordPress升级到3.5以上后wpdb::prepare() 报错的解决办法 | 猎微网

评论已关闭!