#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