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 に答える