1

这很奇怪。我刚升级到 WordPress 3.7.1,突然开始报错

PHP Warning:  array_pop() expects parameter 1 to be array, null given in (...)

这是相关的代码:

$User = array_pop($RM->DB->get_results($RM->DB->prepare(
    'SELECT 
        `user_id` AS `ID`,
        `api_key` AS `key`
    FROM
        `rm_users` 
    WHERE
        user_id = %d'
    , $user_value)));

这里我使用 WordPress 的 $wpdb 对象来查询自定义表。奇怪的是,如果我将其更改为:

$Users = $RM->DB->get_results($RM->DB->prepare(
    'SELECT 
        `user_id` AS `ID`,
        `api_key` AS `key`
    FROM
        `rm_users` 
    WHERE
        user_id = %d'
    , $user_value));
$User = array_pop($Users);

它工作得很好。如果 array_pop 接收到一个 null 参数,那么它代表 $Users 将为 null 并且会导致相同的错误,但它不是 null 并且不会导致错误。在我使用 WordPress 的“get_results”方法和“array_pop”的任何地方都是一样的。

这是一个合法的 php 错误,还是有一些我不知道的深层机制会阻止 array_pop 直接获取方法的输出?

4

1 回答 1

1

据我所知,它似乎不是 WP 错误,我不确定为什么它从 3.7.1 才开始。

我在 3.7.1 上使用您提供的两种方法在自定义表上运行了以下命令,并且都按预期返回了一个 stdClass 对象。

// Get one out with pop
print_r(array_pop($this->_wpdb->get_results($this->_wpdb->prepare(
    'SELECT
        CONCAT(user.firstname," ",user.surname) AS name,
        user.email,
        user.mobile,
        user.userType
    FROM user
    WHERE userId=%d
    LIMIT 1;',
    $userId))));

// get one out with 2-step
$users = $this->_wpdb->get_results($this->_wpdb->prepare(
    'SELECT
        CONCAT(user.firstname," ",user.surname) AS name,
        user.email,
        user.mobile,
        user.userType
    FROM user
    WHERE userId=%d
    LIMIT 1;',
    $userId));
print_r(array_pop($users));

与其使用 pop,不如使用get_row 方法

$User = $RM->DB->get_row($RM->DB->prepare(
    'SELECT 
        `user_id` AS `ID`,
        `api_key` AS `key`
    FROM
        `rm_users` 
    WHERE
        user_id = %s'
    , $user_value));

或者,如果您希望将结果作为关联数组而不是 stdClass:

$User = $RM->DB->get_row($RM->DB->prepare(
    'SELECT 
        `user_id` AS `ID`,
        `api_key` AS `key`
    FROM
        `rm_users` 
    WHERE
        user_id = %s'
    , $user_value), ARRAY_A);
于 2013-11-12T18:03:25.127 回答