【问题标题】:Wordpress wpdb->update multiple "WHERE" ID'sWordpress wpdb->更新多个“WHERE”ID
【发布时间】:2020-11-19 18:31:11
【问题描述】:

这里是PHP菜鸟:

我需要使用$wpdb->update 来用当前日期时间更新我所有具有“NULL”值的数据库行。

这是我直接插入 PHPMyAdmin 时工作的 MySQL

UPDATE `mytable`
SET `expired` = CURRENT_TIMESTAMP()
WHERE (`id` > 1 AND `expired` IS NULL)

使用$wpdb 我发现我需要像这样获取所有需要过期的ID:

$get_ids = $wpdb->get_results("
    SELECT id
    FROM $database
    WHERE (`id` > 1 AND `expired` IS NULL)
");

所以现在我有一个 ID 数组,我的想法是像这样将它们放在 $wpdb->update 中

foreach($get_ids as $key => $value){
    $data = array('expired' => $currentTime);
    $where = array('id' => $value);

    $wpdb->update(
        $database,
        $data,
        $where,
    );

    print_r( $where );
}

print_r 返回

 "Array
(
    [id] => stdClass Object
        (
            [id] => 34
        )

)
Array
(
    [id] => stdClass Object
        (
            [id] => 38
        )

)

但是reading the docs 我相信它需要更像这样

array(
'id' => $value
)

另外,这是我的错误日志中的PHP错误

[30-Jul-2020 03:42:50 UTC] PHP 注意:调用了 wpdb::prepare 错误。不支持的值类型(对象)。请 请参阅Debugging in WordPress 了解更多信息。 (这条信息 在版本 4.8.2 中添加。)在 /Applications/MAMP/htdocs/myproject/wp-includes/functions.php 上线 5167

[2020 年 7 月 30 日 03:42:50 UTC] PHP 警告:mysqli_real_escape_string() 期望参数 2 是字符串,对象在 /Applications/MAMP/htdocs/myproject/wp-includes/wp-db.php 在第 1158 行

[30-Jul-2020 03:42:50 UTC] PHP 注意:调用了 wpdb::prepare 错误。不支持的值类型(对象)。请 请参阅Debugging in WordPress 了解更多信息。 (这条信息 在版本 4.8.2 中添加。)在 /Applications/MAMP/htdocs/myproject/wp-includes/functions.php 上线 5167

[2020 年 7 月 30 日 03:42:50 UTC] PHP 警告:mysqli_real_escape_string() 期望参数 2 是字符串,对象在 /Applications/MAMP/htdocs/myproject/wp-includes/wp-db.php 在第 1158 行

很抱歉,这很长,但我想清楚并展示我已经尝试过的内容,并清楚地了解我正在做的事情。

【问题讨论】:

  • 如果您显示的 UPDATE 查询已经完成了您想要的操作 - 那么您为什么现在执行 SELECT,而不是仅通过 $wpdb->query() 执行该 UPDATE 查询...?
  • 由于升级到 PHP 7 的某些原因,Wordpress 不允许我使用 $wpdb->query()。我以前是,升级后我回来检查它完全坏了。
  • 那么肯定是用错了,因为在 PHP 7 下它通常仍然可以正常工作。

标签: php mysql wordpress php-7


【解决方案1】:

您需要$wpdb->get_col() 而不是$wpdb->get_results()。同样的事情,但 get_col 返回一个简单的值数组(因为我们知道您只返回一列),而 get_results 返回一个对象数组,因为您可能会获得多列。

或者你可以这样做:

$where = array('id' => $value->id);
// - or -
$where = (array) $value;

但在这种情况下使用:

$get_ids = $wpdb->get_col("
    SELECT id
    FROM $database
    WHERE (`id` > 1 AND `expired` IS NULL)
");

是正确的做法。

见:https://codex.wordpress.org/Class_Reference/wpdb

我相信您的 mysql 准备错误是由于您将错误的值传递给 where 子句,并且无法正确解析准备函数。

【讨论】:

  • 谢谢! $wpdb->get_col() 是关键。
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 2013-09-07
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多