WP3.5警告:Missing argument 2 for wpdb::prepare

By
WP札记

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

0

Comments: 48

  1. 为什么我升级后插件无法更新了呢。

    2012年12月18日
  2. beta控,真心不升级会死星人的 :eek:

    2012年12月18日
  3. 我更新3.5时也出现这个问题,哪里少参数加上去就行了。

    2012年12月18日
  4. mg12也写文章说明了,我很少用到,所以……因为不懂sql

    2012年12月18日
  5. :???: 奇怪,为什么我没有看到提示?

    2012年12月19日
  6. 博主技术帝……我还在纠结我的PJblog呢!

    2012年12月21日
  7. 厉害啊

    2012年12月22日
  8. 我看现在不升级也没什么问题

    2012年12月24日
    • @集趣 现在确实没啥问题,但是难保以后出现奇怪的问题……

      @venmax 2012年12月26日
  9. 多谢帮我解决了这个问题。 :cool:

    2012年12月26日
  10. 不放第二个参数直接字符串赋值得了呗?还不伦不类的,我就不懂了。。

    2013年01月02日
  11. 我还在用久版本,懒得去更新 :arrow:

    2013年01月03日
  12. :smile: 可能是RP不错,更新了也没问题!

    2013年01月05日
  13. 我就是不升级会死星人,现在已升级到3.5.1版本了,谢天谢地,一切正常

    2013年01月31日

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

:razz: