PDO с нулевой индексацией при использовании целочисленных ключей с FETCH_KEY_PAIR - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь использовать параметр PDO::FETCH_KEY_PAIR в PDO fetchAll(), чтобы иметь возможность выводить массив, где каждый ключ является первичным ключом, а значение - это другое поле каждой строки, возвращаемое оператором SELECT.

Так, например:

$stmt = $this->db->prepare('SELECT country_id, name FROM _country');
$stmt->execute();
$data = $stmt->fetchAll(\PDO::FETCH_KEY_PAIR);

, где country_id - INT (10), а name - VARCHAR.Затем $data обрабатывается в другом сценарии:

foreach( $data as $key => $value ){
        echo $key . "|" . $value;
    }

Результат оператора SELECT:

 ------------------------
 |country_id | name     |
 ------------------------
 | 18        | India    |
 | 26        | Germany  |
 | 129       | Sweden   |
 ------------------------

Однако, когда возвращается массив, ключи индексируются нулем, только с использованиемимя столбца в качестве значения.

Ожидаемый вывод (с использованием echo print_r($data))

Array ( [18] => India [26] => Germany [129] => Sweden)

Фактический вывод

Array ( [0] => India [1] => Germany [2] => Sweden)

Любопытно, когда я переключаю столбцы:

SELECT name, country_id FROM _country;

он отлично работает, возвращая каждое название страны в качестве ключа с целым числом первичного ключа в качестве значения.

Array ( [India] => 18 [Germany] => 26 [Sweden] => 129)

Я думал, что попробую поиграться с атрибутами PDO::ATTR_STRINGIFY_FETCHES и PDO::ATTR_EMULATE_PREPARES, но безрезультатно.

Я бегу: - php 5.5.9 -mysql server 5.6.16 - pdo_mysql mysqlnd 5.0.11-dev

1 Ответ

0 голосов
/ 10 июня 2018

Попробуйте выбрать способ получения результата:

$stmt = $this->db->prepare('SELECT country_id, name FROM _country');
$stmt->execute();
$data = array_map('key_value', $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC));

function key_value($value){
    return $value[0]['name'];
}

PDO::FETCH_GROUP|PDO::FETCH_ASSOC возвращает массив массивов.Затем я сопоставил полученный массив с функцией и сгенерировал только желаемый результат, который должен быть на вашем конце:

Array ( [18] => India [26] => Germany [129] => Sweden)

Я действительно пытался сгенерировать ваш результат, используя \PDO::FETCH_KEY_PAIRпараметр, но он работал просто отлично.Я не знаю, в чем проблема!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...