当我使用ODBC查询DB2数据库时,我遇到了一个奇怪的PDO问题。我使用的是使用DB2 Express-C V9.7编译的PHP 5.3.8。结果集始终为每列返回双值。这是代码:
$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.
我在这里做错了什么?
答案 0 :(得分:1)
这是PDO的定义行为。 fetch()
或fetchAll()
返回的数组(每行)包含按表名称和表中的顺序索引的数据。
如果您不想要数字索引结果,可以在调用fetch中添加PDO::FETCH_ASSOC
常量:
$stmt->fetch(PDO::FETCH_ASSOC); //Just column names and values
//OR
$stmt->fetchAll(PDO::FETCH_ASSOC);
第一个参数(PHP.net调用fetch样式)的默认值为PDO::FETCH_BOTH
,它返回PDO::FETCH_ASSOC
和PDO::FETCH_NUM
。 fetch() doc page上的这些返回样式可以找到更多。
对于下表和查询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);
答案 1 :(得分:0)
您可以通过将参数传递给fetchall()
来定义“获取样式”。
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);