WordPress.org

Make WordPress Core

Changeset 43934


Ignore:
Timestamp:
11/22/2018 03:58:19 AM (12 months ago)
Author:
pento
Message:

WPDB: Check that $wpdb->last_result is countable before counting with it.

wpdb::get_col() iterates over $wpdb->last_result, which can be a non-countable value, should the preceeding query have failed.

Props spacedmonkey, desrosj.
See #45299.

Location:
branches/5.0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/5.0/src/wp-includes/wp-db.php

    r42550 r43934  
    24572457        $new_array = array();
    24582458        // Extract the column values
    2459         for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) {
    2460             $new_array[$i] = $this->get_var( null, $x, $i );
     2459        if ( $this->last_result ) {
     2460            for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) {
     2461                $new_array[ $i ] = $this->get_var( null, $x, $i );
     2462            }
    24612463        }
    24622464        return $new_array;
     
    24982500            // Return an array of row objects with keys from column 1
    24992501            // (Duplicates are discarded)
    2500             foreach ( $this->last_result as $row ) {
    2501                 $var_by_ref = get_object_vars( $row );
    2502                 $key = array_shift( $var_by_ref );
    2503                 if ( ! isset( $new_array[ $key ] ) )
    2504                     $new_array[ $key ] = $row;
     2502            if ( $this->last_result ) {
     2503                foreach ( $this->last_result as $row ) {
     2504                    $var_by_ref = get_object_vars( $row );
     2505                    $key = array_shift( $var_by_ref );
     2506                    if ( ! isset( $new_array[ $key ] ) ) {
     2507                        $new_array[ $key ] = $row;
     2508                    }
     2509                }
    25052510            }
    25062511            return $new_array;
  • branches/5.0/tests/phpunit/tests/db.php

    r42229 r43934  
    157157     * @param $data string The haystack, raw.
    158158     * @param $like string The like phrase, raw.
    159         * @param $result string The expected comparison result; '1' = true, '0' = false
     159    * @param $result string The expected comparison result; '1' = true, '0' = false
    160160     */
    161161    function test_like_query( $data, $like, $result ) {
     
    558558        $this->assertInternalType( 'object', $row );
    559559        $this->assertEquals( 'Walter Sobchak', $row->display_name );
     560    }
     561
     562    /**
     563     * Test the `get_col()` method.
     564     *
     565     * @param string|null        $query       The query to run.
     566     * @param string|array       $expected    The expected resulting value.
     567     * @param arrray|string|null $last_result The value to assign to `$wpdb->last_result`.
     568     * @param int|string         $column      The column index to retrieve.
     569     *
     570     * @dataProvider data_test_get_col
     571     *
     572     * @ticket 45299
     573     */
     574    function test_get_col( $query, $expected, $last_result, $column ) {
     575        global $wpdb;
     576
     577        $wpdb->last_result = $last_result;
     578
     579        $result = $wpdb->get_col( $query, $column );
     580
     581        if ( $query ) {
     582            $this->assertSame( $query, $wpdb->last_query );
     583        }
     584
     585        if ( is_array( $expected ) ) {
     586            $this->assertSame( $expected, $result );
     587        } else {
     588            $this->assertContains( $expected, $result );
     589        }
     590    }
     591
     592    /**
     593     * Data provider for testing `get_col()`.
     594     *
     595     * @return array {
     596     *     Arguments for testing `get_col()`.
     597     *
     598     *     @type string|null        $query       The query to run.
     599     *     @type string|array       $expected    The resulting expected value.
     600     *     @type arrray|string|null $last_result The value to assign to `$wpdb->last_result`.
     601     *     @type int|string         $column      The column index to retrieve.
     602     */
     603    function data_test_get_col() {
     604        global $wpdb;
     605
     606        return array(
     607            array(
     608                "SELECT display_name FROM $wpdb->users",
     609                'admin',
     610                array(),
     611                0,
     612            ),
     613            array(
     614                "SELECT user_login, user_email FROM $wpdb->users",
     615                'admin',
     616                array(),
     617                0,
     618            ),
     619            array(
     620                "SELECT user_login, user_email FROM $wpdb->users",
     621                'admin@example.org',
     622                array(),
     623                1,
     624            ),
     625            array(
     626                "SELECT user_login, user_email FROM $wpdb->users",
     627                'admin@example.org',
     628                array(),
     629                '1',
     630            ),
     631            array(
     632                "SELECT user_login, user_email FROM $wpdb->users",
     633                array( null ),
     634                array(),
     635                3,
     636            ),
     637            array(
     638                '',
     639                array(),
     640                null,
     641                0,
     642            ),
     643            array(
     644                null,
     645                array(),
     646                '',
     647                0
     648            ),
     649        );
    560650    }
    561651
Note: See TracChangeset for help on using the changeset viewer.