Array_pop + WordPress 3.7.1“get_results”=错误?

时间:2013-11-12 17:30:51

标签: php arrays wordpress pop wpdb

这很奇怪。我刚刚升级到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直接获取方法输出的深层机制?

1 个答案:

答案 0 :(得分: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));

使用get_row method

,而不是使用pop
$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);