警告:缺少wpdb :: prepare()的参数2,

时间:2012-12-19 15:16:42

标签: php wordpress

两天前我升级到 Wordpress 3.5 。我没有使用很多插件,GoDaddy向我保证我的插件工作正常。但是,我第一次在我的博客帖子上收到此错误消息。

你能帮我解决这个问题吗?

  

警告:缺少wpdb :: prepare()的参数2,在第91行的/home/content/52/8331652/html/wp-content/themes/chateau-2.0/functions.php中调用,并在/ home中定义第990行/content/52/8331652/html/wp-includes/wp-db.php

Here是帖子顶部屏幕右侧出现此问题的网页之一。

感谢您提供的任何见解。

5 个答案:

答案 0 :(得分:9)

WordPress 3.5进行了一些重大更改,以降低某些安全风险,例如SQL Injection。由于插件开发人员正在发送完整的查询而不是分离出参数,因此wpdb::prepare方法被不安全地使用。这意味着“准备好”的语句没有准备好,实际上是直接将参数传递给查询,这是一个安全禁忌。从3.5开始,这个方法现在有三个参数。

要解决您的问题,请编辑您的php.ini文件,找到error_reporting的行并将其更改为以下内容...

error_reporting(E_ALL & ~(E_NOTICE|E_WARNING));

重新启动服务器。

这样可以防止报告所有次要的脚本错误。

或者,将错误发送到日志文件。在php.ini中,找到这一行(取消注释),并将其更改为...

error_log "/path/to/php-error.log"

这样可以防止错误显示在您的网站上。相反,它们将写入只有您可以看到的日志。

如果此错误困扰您,您可能会尝试让流氓插件使用虚拟值。我们可以看到wpdb::prepare方法有三个参数......

$wpdb->query( 
    $wpdb->prepare( 
        "
            DELETE FROM $wpdb->postmeta
            WHERE post_id = %d
            AND meta_key = %s
        ",
        13, 'stack overflow' 
    )
);

通过使受影响的插件发送null作为方法中的第二个和第三个参数,它将完全解决问题。

答案 1 :(得分:4)

在wp-config.php中添加以下行:

@ini_set('display_errors', 0);

您的主题/插件无法正常访问新的WordPress API。它仍然可以工作,但会生成错误警告。查看longer explanation

答案 2 :(得分:1)

在functions.php中,在查询后添加“”作为参数。

答案 3 :(得分:0)

我也遇到了同样的问题。 我在wp-config.php文件中添加了这段代码。

@ini_set('display_errors', 0);

然后我很高兴,再没有警告信息。

答案 4 :(得分:0)

这是因为

必须使用参数执行

$ wpdb->准备

你没有参数吗?

然后,另一种选择:

添加WHERE以进行查询:

SELECT TA.id, TA.num, TA.grp , AG.AvgNum
FROM ( SELECT grp, AVG(num) AS AvgNum
       FROM TableName
       GROUP BY grp ) AG
JOIN  TableName TA ON TA.grp = AG.grp 

Magic Key = WHERE%d 必须为true

并包含一个真正的参数:

$sql = "SELECT * FROM TB_YOUR_TABLE WHERE %d AND ...";

1 对于mysql

是正确的

希望它有所帮助!