使用PHP和PDO以及DB2 over ODBC在SELECT之后返回双值

时间:2011-10-13 23:52:47

标签: php odbc pdo db2

当我使用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.

我在这里做错了什么?

2 个答案:

答案 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_ASSOCPDO::FETCH_NUMfetch() 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);

见这里:http://www.php.net/manual/en/pdostatement.fetch.php