По какой-то странной причине мой PDO продолжает возвращать NULL, когда должен возвращать строку / целое число. Я пытался использовать odbc_conect
и работает нормально.
Контекст:
Когда это происходит? До сих пор я обнаружил несколько:
SELECT id,GEO.ST_Asgeojson() FROM DEV.GEOMETRIES
SELECT id, CAST(GEO.ST_AsText() AS VARCHAR) FROM DEV.GEOMETRIES
или же SELECT CAST(1 AS INTEGER) AS "int" FROM DUMMY
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.
Задача ещё не решена.
Других решений пока нет …