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. wordpress域名被TC盯上了, 我升级了好多次都不成功, 最后手动升级

    2012年12月14日
    • @牧风 TC越来越BT了,我有空去手动升个级

      @venmax 2012年12月14日
  2. 哟西,WP用PDO了

    2012年12月14日
  3. 不能插入图片呀[img=http://imgs.xkcd.com/comics/exploits_of_a_mom.png][/img]

    2012年12月14日
    • @Leniy 不许插不许插~~

      @venmax 2012年12月14日
    • @axiu 你是怎么限制<img>标签的?

      2012年12月14日
  4. prepare是基本的防护,只是wp这个错误实在是 :arrow:

    2012年12月14日
  5. :?: 已经成功升级3.5

    2012年12月14日
  6. 很懒,没有升级呢

    2012年12月14日
  7. 更新控已经忍不住了,第一时间自动更新

    2012年12月14日
    • @Bee君 没出问题吗蜜蜂君?

      @venmax 2012年12月14日
    • @axiu 我暂时还没有发现有什么问题喔

      2012年12月15日
  8. 还好我没有亮闪闪

    2012年12月14日
  9. 不升级会死星人~哈哈,笑趴啦~

    2012年12月14日
  10. 哈哈。干脆把搜索去掉了。

    2012年12月15日
  11. 暂时还没有升级,等稳定了再。。呵呵

    2012年12月15日
  12. 还没有升级,想自动升级来着,网速不行, :twisted:

    2012年12月15日
  13. 刚升级,没此压力。

    2012年12月16日
  14. 升级十几次,多了几十MB临时文件才升级成功。3.5貌似让不少博客出错了。

    2012年12月16日
  15. 升级到3.5,表示毫无压力! :!:

    2012年12月17日

新世纪娱乐城进行回复 取消回复

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

*

:razz: