【问题标题】:Dual values returned after SELECT using PHP and PDO with DB2 over ODBCSELECT 使用 PHP 和 PDO 以及 DB2 over ODBC 后返回的双重值
【发布时间】:2011-12-07 09:14:42
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

    标签: php odbc pdo db2


    【解决方案1】:

    这是为 PDO 定义的行为。 fetch() 或fetchAll() 返回的数组(每行)包含按列名和表中顺序索引的数据。

    如果您不想要数字索引的结果,您可以将 PDO::FETCH_ASSOC 常量添加到您的 fetch 调用中:

    $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->fetch(PDO::FETCH_BOTH);

    【讨论】:

    • 请详细说明。您是说 PDO 返回 key=>value 和 value?
    • @eriben 根据可以返回的标志:column_name => value、column_number => value 或两者的组合(请参阅我的编辑)。
    【解决方案2】:

    您可以通过将参数传递给fetchall() 来定义“获取样式”。

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2020-01-15
      • 2016-06-30
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多