Axiu Blog
仅剩的精力全奉献给了搜索引擎。如下是翻译的一篇文章,因为帮朋友解决了下这个问题,也算做个笔记……~正文开始。 如果你是代码盲,只是单纯的不想看到这个提示的话,就修改php.ini或者.htaccess等等,把这提示去掉。修改wp-config.php这个文件就行,加入如下代码行: `@``ini_set``(``'display_errors'``, 0
一些不升级会死星人迫不及待的把wordpress升级到最新的3.5了,然后惊喜地看这看那之余,可能会闪亮亮的看到博客出现了一条奇怪的warning(警告):Missing argument 2 for wpdb::prepare()……之后仅剩的精力全奉献给了搜索引擎。如下是翻译的一篇文章,因为帮朋友解决了下这个问题,也算做个笔记……~正文开始。 如果你是代码盲,只是单纯的不想看到这个提示的话,
一些不升级会死星人迫不及待的把wordpress升级到最新的3.5了,然后惊喜地看这看那之余,可能会闪亮亮的看到博客出现了一条奇怪的warning(警告):Missing argument 2 for wpdb::prepare()……之后仅剩的精力全奉献给了搜索引擎。如下是翻译的一篇文章,因为帮朋友解决了下这个问题,也算做个笔记……~正文开始。 如果你是代码盲,只是单纯的不想看到这个提示的话,
WP3.5警告:Missing argument 2 for wpdb::prepare
Max

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

Comments