WordPress wpdb->update multiple "WHERE" id



PHP菜鸟在这里:

我需要使用CCD_ 1来更新我的所有数据库行;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
)
)

但阅读文档,我认为它需要更像这个

array(
'id' => $value
)

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

〔2020年7月30日03:42:50 UTC〕PHP注意:调用了wpdb::prepare错误。不支持的值类型(对象(。请有关详细信息,请参阅WordPress中的调试。(此消息在版本4.8.2.中添加(/在线应用程序/MAMP/htdocs/myproject/wp-includes/functions.php5167

[2020年7月30日03:42:50 UTC]PHP警告:mysqli_real_escape_string((参数2应为字符串,中给定的对象/应用程序/MAMP/htdocs/myproject/wp-includes/wp-db.php在线1158

〔2020年7月30日03:42:50 UTC〕PHP通知:wpdb::prepare被调用错误。不支持的值类型(对象(。请有关详细信息,请参阅WordPress中的调试。(此消息在版本4.8.2.中添加(/在线应用程序/MAMP/htdocs/myproject/wp-includes/functions.php5167

[2020年7月30日03:42:50 UTC]PHP警告:mysqli_real_escape_string((参数2应为字符串,中给定的对象/应用程序/MAMP/htdocs/myproject/wp-includes/wp-db.php在线1158

很抱歉时间很长,但我想说清楚,展示我所做的努力,并清楚地描述我正在做的事情。

您需要$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

我相信您的mysqlprepare错误是由于您向where子句传递了错误的值,并且无法为prepare函数正确解析该值。

最新更新