Двойные значения, возвращаемые после ВЫБОРА с использованием PHP и PDO с DB2 через ODBC

#php #odbc #pdo #db2

#php #odbc #pdo #db2

Вопрос:

У меня странная проблема с PDO при запросе базы данных DB2 с использованием ODBC. Я использую PHP 5.3.8, скомпилированный с использованием DB2 Express-C версии 9.7. Результирующий набор всегда возвращает двойные значения для каждого столбца. Вот код:

 $pdo = new PDO("odbc:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=xxxx; HOSTNAME=x.y.z.a;PORT=xxxxx;CurrentSchema=xxx;", "username", "password");

$sql = 'select * from cust_div where cust_no = '.$params.';';

$stmt = $pdo->prepare($sql);
$stmt->execute();

$result = $stmt->fetchAll();

$stmt->closeCursor();
  

var_dump($result) всегда возвращает двойные значения:

 array(1) {
  [0]=>
  array(52) {
    ["CUST_NO"]=>
    string(9) "226622249"
    [0]=>
    string(9) "226622249"
    ["DIV_ID"]=>
    string(1) "P"
    [1]=>
    string(1) "P"

    etc.
  

Что я здесь делаю не так?

Ответ №1:

Это определенное поведение для PDO. Массив (для каждой строки), возвращаемый fetch() или fetchAll() содержит данные, проиндексированные по имени столбца и порядку в таблице.

Если вам не нужны результаты с числовым индексом, вы можете добавить PDO::FETCH_ASSOC константу в свой вызов для извлечения:

 $stmt->fetch(PDO::FETCH_ASSOC); //Just column names and values
//OR
$stmt->fetchAll(PDO::FETCH_ASSOC);
  

Значение по умолчанию для этого первого параметра (который PHP.net вызывает стиль выборки) PDO::FETCH_BOTH , который возвращает оба PDO::FETCH_ASSOC и PDO::FETCH_NUM . Подробнее об этих стилях возврата можно найти на странице документа fetch().

Для приведенной ниже таблицы и запроса SELECT * FROM cust :

  -- ---- 
|id|name|
 -- ---- 
|0 |John|
 -- ---- 
|1 |Jill|
 -- ---- 
  

Вызов $stmt->fetchAll(PDO::FETCH_ASSOC); вернет:

 array(0=>array(
    'id' => 0,
    'name' => 'John'
), 1=>array(
    'id' => 1,
    'name' => 'Jill'
));
  

При вызове $stmt->fetch(PDO::FETCH_NUM); будет возвращен:

 array(0=>array(
    0 => 0,
    1 => 'John'
), 1=>array(
    0 => 1,
    1 => 'Jill'
));
  

Функция default ( PDO::FETCH_BOTH ), с которой вы столкнулись, возвращает комбинацию их обоих. Поскольку это значение по умолчанию, оно используется, когда стиль не передается:

 $stmt->fetch();
  

Или когда это явно указано:

$stmt-> выборка(PDO::FETCH_BOT);

Комментарии:

1. Пожалуйста, уточните. Вы говорите, что PDO возвращает ключ => значение и значение?

2. @eriben В зависимости от флага он может возвращать: column_name => value , column_number => value или их комбинацию (см. Мои правки).

Ответ №2:

Вы можете определить «стиль выборки», передав аргумент в fetchall() .

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

Смотрите здесь: http://www.php.net/manual/en/pdostatement .fetch.php