WP3.5警告:Missing argument 2 for wpdb::prepare
一些不升级会死星人迫不及待的把wordpress升级到最新的3.5了,然后惊喜地看这看那之余,可能会闪亮亮的看到博客出现了一条奇怪的warning(警告):Missing argument 2 for wpdb::prepare()……之后仅剩的精力全奉献给了搜索引擎。如下是翻译的一篇文章,因为帮朋友解决了下这个问题,也算做个笔记……~正文开始。
如果你是代码盲,只是单纯的不想看到这个提示的话,就修改php.ini或者.htaccess等等,把这提示去掉。修改wp-config.php这个文件就行,加入如下代码行:
@ ini_set ( 'display_errors' , 0); |
如果你仅仅想正常使用,到这里就可以了。如果你是折腾狂,必须找到根源的话,那么请继续看:
这个prepare函数是这么工作的:
$wpdb ->prepare( "SELECT * FROM table WHERE ID = %d AND name = %s" , $id , $name ); |
这里$id是一个整数,作为第二个参数进行传递的。对应与第一个占位符 %d。然后, $name (一个字符串) 作为第三个参数传递,对应与第二个占位符%s。这是为了确保你的sql语句是安全的,并且杜绝了某些little bobby tables.
问题是,很多人使用prepare的时候仅仅使用一个参数,像下面这样:
$wpdb ->prepare( "SELECT COUNT(*) FROM table" ); |
这里并不存在参数 (像上面的%d, %s,或者是%f)。这句碰巧能很好的工作,当然只是碰巧。但是prepare其实啥也没做。你应该把这句替换掉。
但是如下的语句就有问题了:
$wpdb ->prepare( "SELECT * FROM table WHERE id = $id" ); |
看到没?这查询不安全!你可能是想你“preparing”(准备) 了这个查询,但是实际上你没有 — 你把$id直接传进去了,没有提前prepared。在这里唇线的问题,则正是本文要说的$wpdb->prepare() 出问题的状况:得到了一个警告说少了参数。因为你不能仅仅依靠一个参数就进行prepare这个函数,这不科学!下面这样的写法才是正确的:
$wpdb ->prepare( "SELECT * FROM table WHERE id = %d" , $id ); |
所以,本文希望让所有用户或者开发者明白,他们的查询可能存在哪些安全隐患,并且希望知道这查询是如何运行的,并且做好恰当的”准备”(prepare)。
感谢原作者,原文来自:http://make.wordpress.org/core/2012/12/12/php-warning-missing-argument-2-for-wpdb-prepare/
为什么我升级后插件无法更新了呢。
@wmtimes 这个应该不是升级的问题吧
beta控,真心不升级会死星人的
@门软网 哈哈,升级愉快
我更新3.5时也出现这个问题,哪里少参数加上去就行了。
@乌帮图 知道点为什么也是应该的
mg12也写文章说明了,我很少用到,所以……因为不懂sql
@zwwooooo 现在好像很少用sql了
博主技术帝……我还在纠结我的PJblog呢!
厉害啊
我看现在不升级也没什么问题
@集趣 现在确实没啥问题,但是难保以后出现奇怪的问题……
多谢帮我解决了这个问题。
@Luciano 不客气
不放第二个参数直接字符串赋值得了呗?还不伦不类的,我就不懂了。。
@小草元 唉唉~~
我还在用久版本,懒得去更新
我就是不升级会死星人,现在已升级到3.5.1版本了,谢天谢地,一切正常