【debug】wordpress提示Missing argument 2 for wpdb::prepare()报错问题修复

逍遥乐最近一直在全面开启php错误提示以及wordpress Debug模式,真对逍遥乐自用主题进行规范化和修复一些不安全的隐患!逍遥乐发现很多从其它地方转过来的代码都有各种各样的问题,很多代码都是互相抄,但是一拿到php7或者wordpress最新版本就会有各种问题!国内很多写主题的作者甚至国内一些大神写的主题和插件都有类似的问题!最常规的是大家很多人说的没效果,有些生效了却带来了新的安全隐患!逍遥乐会在接下来的一段时间给大家一一分享最近遇到的各种问题,给大家提供解决方案!好了废话不多说了切入正题!

从WordPress 3.5开始wordpress修改了 wpdb:: 方法,必须填入wpdb::的第二个参数!如果没有传,就会报错:

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:眼不见心不烦:
这是最简单的一种方法,屏蔽这个警告信息,在你博客下的wp-config.php中填入如下代码,如果已存在修改成下面的

@ini_set('display_errors', 0);

我们直接屏蔽掉错误提示,但是带来的后果就是错误依旧存在,只是不提示罢了!不安全不提倡,不过可以临时用用。
2:针对错误提示简单解决
我们需要先定位出现问题的文件和代码. PHP 的代码报错很精准的, 打开报错提醒中的文件 (前一个文件, 不是 wp-db.php), 找到代码

$wpdb->prepare

.为该方法添加一个空串作为第二个参数, 比如:
$wpdb->prepare('xxx');
改为
$wpdb->prepare('xxx', '');
即可.
但是这样也是治标不治本,只是针对错误的应对措施。
3、完全修复问题
正如上面说的需要第二个参数,但是第二种方法虽然给了第二个参数但是却没有因为所以的给出解决办法。
问题代码:

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

解决后的代码:

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

将第二个参数添加上去,来传递值,使用prepare无非是想SQL更为安全。所以大家如果遇到这个问题,不妨试试上面的方法。如果你的SQL里面参数多,可以类似下面的这种来写。

$wpdb->prepare( "SELECT * FROM table WHERE ID = %d AND name = %s", $id, $name );

OK!一切解决!这个世界清净了!
总结

WordPress不停的版本迭代有些方法已经被替换,有些方法已经放弃了,虽然依旧能用,但是不免不安全,希望大家在每次大版本升级的时候,都去检查一下主题是否已经过时了!否则依旧是留下隐患!