Запрос PDO возвращает каждое поле дважды в наборе результатов - PullRequest
1 голос
/ 09 мая 2019

У меня самая странная проблема, которую я не могу решить. У меня есть простой запрос MySQL, который возвращает каждое поле в результатах дважды. Первый с ключом, названным именем поля, а второй целое число.

Таблица выглядит так:

id int(11)
user_id int(11)
first_name varchar(255)
last_name varchar(255)
country_code varchar(3)
mobile varchar(255)
email varchar(255)
profile_img var_char(255)
timestamp timestamp

Мой код выглядит так:

$db = new PDO('mysql:host=localhost;dbname=proj', 'dev', '<password>');
$sql = "SELECT * FROM contact";
$stmt = $db->prepare($sql);
$stmt->execute();
$contacts = $stmt->fetchAll();
print_r($contacts));

И вывод:

Array
(  
[id] => 1  
[0] => 1  
[user_id] => 1  
[1] => 1  
[first_name] => joan  
[2] => joan  
[last_name] => smith  
[3] => smith  
[country_code] => AU  
[4] => AU  
[mobile] => 0400 222 333  
[5] => 0400 222 333  
[email] => joan@example.com  
[6] => joan@example.com  
[profile_img] =>   
[7] =>  
[timestamp] => 0000-00-00 00:00:00  
[8] => 0000-00-00 00:00:00  
)

Я использую MariaDB 15.1 и PHP 7.0 в виртуальной машине Debian 9.1.

1 Ответ

5 голосов
/ 09 мая 2019

Это потому, что вы не установили fetch_style параметр $stmt->fetchAll();.По умолчанию PDO извлекает результаты в виде массива с пронумерованными и ассоциативными ключами ( например, , "first_name" и 2).

Из документов :

fetch_style

Управляет содержимым возвращаемого массива, как описано в PDOStatement::fetch().По умолчанию используется значение PDO::ATTR_DEFAULT_FETCH_MODE (по умолчанию PDO::FETCH_BOTH)

Чтобы получить только ассоциативные индексы, передайте параметр PDO::FETCH_ASSOC, как в

$contacts = $stmt->fetchAll(PDO::FETCH_ASSOC);

.получить только пронумерованные индексы, передать параметр PDO::FETCH_NUM, как в

$contacts = $stmt->fetchAll(PDO::FETCH_NUM);

Полный набор параметров приведен в документации для PDOStatement::fetch.

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