dongling5411 2018-02-08 12:03
浏览 107

PDO ODBC为列值返回null,但odbc_conect不返回

For some weird reason, my PDO keeps returning NULL when it should return a string/integer. I've tried to use the odbc_conect and it works fine.

Context:

  • CentOS 7
  • PHP 7.1.13
  • unixODBC 2.3.1 (x86_64 . 11.el7)
  • ODCB Driver: SAP HANA ODBC v2.2.36.1512099132 64 bits

When it's happening? Until now, I detected few:

  • Function returns: SELECT id,GEO.ST_Asgeojson() FROM DEV.GEOMETRIES
  • Using CAST: SELECT id, CAST(GEO.ST_AsText() AS VARCHAR) FROM DEV.GEOMETRIES or SELECT CAST(1 AS INTEGER) AS "int" FROM DUMMY
  • Any blob column : SELECT id,GEO FROM DEV.GEOMETRIES
  • Date Types: SELECT insertdate FROM DEV.GEOMETRIES

I also tried to use PDOStatement::bindColumn to force data types but was unsuccessful

Where the code :

<?php
try{
    ini_set('memory_limit','256M'); //odbc_fetch_array is hungry
    // $sql = 'SELECT  NOW()  AS  "now"  FROM  DUMMY';
     $sql = "SELECT id,GEO.ST_Asgeojson(),GEO.ST_AsText(),insertdate  FROM DEV.geometries limit 1";
     //$sql = "SELECT *  FROM DEV.geometries limit 1";
    // $sql = "SELECT  CAST(GEO.ST_AsText() AS VARCHAR) from geometries";
    // $sql = "SELECT  CAST(10 AS VARCHAR) from DUMMY";
    // $sql = "SELECT  CAST(10 AS INTEGER) from DUMMY";

    echo "SQL: ",$sql,PHP_EOL;

    $DSN = "DRIVER=HANADB;UID=DEV;PWD=DEV@pwd;SERVERNODE=192.168.1.163:39013;DATABASENAME=SYSTEMDB";
    $options = [
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_CASE =>\PDO::CASE_LOWER, //Compatibility with mysql case
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES, true //With or without 
    ];
    echo "############# Using PDO:ODBC:",PHP_EOL;
    $DB =  new \PDO("odbc:".$DSN,'DEV','DEV@pwd',$options);

    echo "Driver: ",$DB->getAttribute(\PDO::ATTR_CLIENT_VERSION),PHP_EOL;
        echo "Using Prepared Statement:",PHP_EOL;


    $stmt = $DB->prepare($sql);
    // bindColumn Also doesn't work
    //$stmt->bindColumn('id', $id, \PDO::PARAM_INT);
    //$stmt->bindColumn('geojson', $geometry, \PDO::PARAM_STR); 
    $stmt->execute();

    /*while ($row = $stmt->fetch(\PDO::FETCH_BOUND)) {
         var_dump($row);
         var_dump($id, $geometry);
     }*/


    //var_dump($ret,$stmt);
    var_export($stmt->fetchAll());

    $stmt->closeCursor();
    echo PHP_EOL,"Using Query:",PHP_EOL;
    $qR = $DB->query($sql);
    foreach($qR as $row){
        var_export($row);
    }
    echo PHP_EOL,PHP_EOL,"#############  Using odbc_*( ) Functions",PHP_EOL;
    $conn = odbc_connect($DSN,'DEV','DEV@pwd');
    $rs = odbc_exec($conn,$sql);
      while($row = odbc_fetch_array($rs)){
          var_export($row);
      } 
}catch(\Exception $e){  
    echo $e->getMessage(),PHP_EOL,$e->getTraceAsString();
}

Output:

############# Using PDO:ODBC:
Using Prepared Statement:
array (
  0 =>
  array (
    'id' => '363491',
    'geojson' => NULL,
    'geotext' => NULL,
    '__dateinsert' => NULL,
    'info' => NULL,
  ),
)
Using Query:
array (
  'id' => '363491',
  'geojson' => NULL,
  'geotext' => NULL,
  'insertdate' => NULL,
  'info' => NULL,
)

#############  Using odbc_*( ) Functions
array (
  'id' => '363491',
  'geojson' => '{"type": "Point", "coordinates": [16.352878, 48.225628]}',
  'geotext' => 'POINT (16.352878 48.225628)',
  'insertdate  ' => '2018-02-06 15:08:19.414000000',
  'info' => NULL,
)

I'm not sure if it's a Drive problem because it works with odbc_* functions, maybe it's a PDO BUG.

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
    • ¥20 易康econgnition精度验证
    • ¥15 msix packaging tool打包问题
    • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
    • ¥15 python的qt5界面
    • ¥15 无线电能传输系统MATLAB仿真问题
    • ¥50 如何用脚本实现输入法的热键设置
    • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
    • ¥30 深度学习,前后端连接
    • ¥15 孟德尔随机化结果不一致