微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WordPress 3.5 与 wpdb::prepare() 报错解决办法

wordpress 3.5 正式发布,这个版本包括大量更新. 启用了最新的响应式布局主题 Twenty Twelve; 改版了 Admin 界面,更加简洁而且针对移动设备进行了优化; Media 功能也得到极大的提高,现在更加没有理由使用其他图床服务了.

好话说完了,是时候 "但是" 了. 但是... 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() <a href=方法在 wordpress 3.5 中报错" width="600" src="https://files.jb51.cc/file_images/article/201212/2012122515144449.png" />

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

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

我发布的所有 wordpress 主题和最新评论插件 WP-RecentComments 都中枪了. 感谢 neoner 提醒,半个月前我更新 WP-RecentComments 解决了这个问题,但还没有时间改主题,因为主题审核太麻烦了.

解决办法

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

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

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐