一些不升级会死星人迫不及待的把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/