Двойные значения возвращаются после SELECT с использованием PHP и PDO с DB2 через ODBC - PullRequest
0 голосов
/ 14 октября 2011

У меня странная проблема с PDO, когда я запрашиваю базу данных DB2 с использованием ODBC.Я использую PHP 5.3.8, скомпилированный с использованием DB2 Express-C V9.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.

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

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Это определенное поведение для 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'
));

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

$stmt->fetch();

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

$ stmt-> выборки (PDO :: FETCH_BOTH);

0 голосов
/ 14 октября 2011

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

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

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

...