PDO ODBC возвращает значение NULL для значения столбца, но odbc_conect не

По какой-то странной причине мой PDO продолжает возвращать NULL, когда должен возвращать строку / целое число. Я пытался использовать odbc_conect и работает нормально.

Контекст:

  • CentOS 7
  • PHP 7.1.13
  • unixODBC 2.3.1 (x86_64. 11.el7)
  • Драйвер ODCB: 64-битная версия SAP HANA ODBC v2.2.36.1512099132

Когда это происходит? До сих пор я обнаружил несколько:

  • Функция возвращает: SELECT id,GEO.ST_Asgeojson() FROM DEV.GEOMETRIES
  • Используя CAST: SELECT id, CAST(GEO.ST_AsText() AS VARCHAR) FROM DEV.GEOMETRIES или же SELECT CAST(1 AS INTEGER) AS "int" FROM DUMMY
  • Любой столбец BLOB-объектов: SELECT id,GEO FROM DEV.GEOMETRIES
  • Типы дат: SELECT insertdate FROM DEV.GEOMETRIES

Я также пытался использовать PDOStatement :: bindColumn заставить типы данных, но не удалось

Где код:

<?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();
}

Выход:

############# 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,
)

Я не уверен, что это проблема с диском, потому что он работает с odbc_* функции, может быть, это ошибка PDO.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]