Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中通过ODBC(使用PDO)查询雪花会返回不正确的数据_Php_Pdo_Odbc_Snowflake Cloud Data Platform - Fatal编程技术网

在PHP中通过ODBC(使用PDO)查询雪花会返回不正确的数据

在PHP中通过ODBC(使用PDO)查询雪花会返回不正确的数据,php,pdo,odbc,snowflake-cloud-data-platform,Php,Pdo,Odbc,Snowflake Cloud Data Platform,我正试图通过PHP(CentOS 6和7)中的ODBC驱动程序连接到Snowflake,并利用PDO更方便地访问 ODBC驱动程序似乎已安装并正常工作,因为PHP中的本机ODBC函数运行良好: $dsn = "Driver=SnowflakeDSIIDriver;Server=" . SNOWFLAKE_HOST; $dsn .= ";Account=" . SNOWFLAKE_ACCOUNT; $dsn .= ";Port=" . SNOWFLAKE_PORT; $dsn .= ";Schem

我正试图通过PHP(CentOS 6和7)中的ODBC驱动程序连接到Snowflake,并利用PDO更方便地访问

ODBC驱动程序似乎已安装并正常工作,因为PHP中的本机ODBC函数运行良好:

$dsn = "Driver=SnowflakeDSIIDriver;Server=" . SNOWFLAKE_HOST;
$dsn .= ";Account=" . SNOWFLAKE_ACCOUNT;
$dsn .= ";Port=" . SNOWFLAKE_PORT;
$dsn .= ";Schema=" . SNOWFLAKE_SCHEMA;
$dsn .= ";Warehouse=" . SNOWFLAKE_WAREHOUSE;
$dsn .= ";Database=" . SNOWFLAKE_DATABASAE;

$conn_id = odbc_connect($dsn, SNOWFLAKE_USER, SNOWFLAKE_PASSWORD);
odbc_exec($conn_id, "USE WAREHOUSE " . SNOWFLAKE_WAREHOUSE);

$res = odbc_exec($conn_id, 'SHOW TABLES IN SCHEMA ' . SNOWFLAKE_SCHEMA . ';');
if ($res) {
    print "Tables in schema\n";
    while($row = odbc_fetch_array($res)) {
        print_r($row);
    }
}

$res = odbc_exec($conn_id, 'SELECT * FROM TEST;');
if ($res) {
    print "Test table content\n";
    while($row = odbc_fetch_array($res)) {
        print_r($row);
    }
}
返回

Tables in schema
Array
(
    [created_on] => 2015-09-09 17:34:43.517000
    [name] => TEST
    [database_name] => TESTSUITE
    [schema_name] => TESTSUITE
    [kind] => TRANSIENT
    [comment] =>
    [cluster_by] =>
    [rows] => 3
    [bytes] => 8192
    [owner] => TESTSUITE
    [account_name] => ****
    [retention_time] => 1
)
Test table content
Array
(
    [C1] => c
    [C2] =>
)
Array
(
    [C1] => a
    [C2] =>
)
Array
(
    [C1] => a
    [C2] =>
)
Tables in schema
Rows: 1
Array
(
    [created_on] => 2015-09-09 17:34:43.517000
    [name] =>
    [database_name] =>
    [schema_name] =>
    [kind] =>
    [comment] =>
    [cluster_by] =>
    [rows] =>
    [bytes] =>
    [owner] =>
    [account_name] =>
    [retention_time] =>
)
Test table content
Rows: 3
这正是我直接查询数据库时得到的结果

但是当我想使用PDO时,结果会变得很奇怪

$dsn = "Driver=SnowflakeDSIIDriver;Server=" . SNOWFLAKE_HOST;
$dsn .= ";Account=" . SNOWFLAKE_ACCOUNT;
$dsn .= ";Port=" . SNOWFLAKE_PORT;
$dsn .= ";Schema=" . SNOWFLAKE_SCHEMA;
$dsn .= ";Database=" . SNOWFLAKE_DATABASE;
$dsn .= ";Warehouse=" . SNOWFLAKE_WAREHOUSE;

$pdo = new PDO("odbc:" . $dsn, SNOWFLAKE_USER, SNOWFLAKE_PASSWORD, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$pdo->exec("USE WAREHOUSE " . SNOWFLAKE_WAREHOUSE);

$query = 'SHOW TABLES IN SCHEMA ' . SNOWFLAKE_SCHEMA . ';';
$statement = $pdo->query($query);
print "Tables in schema\n";
print "Rows: " . $statement->rowCount() . "\n";
while ($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {
    print_r($row);
}

$query = 'SELECT * FROM TEST;';
$statement = $pdo->prepare($query);
$statement->execute();
print "Test table content\n";
print "Rows: " . $statement->rowCount() . "\n";
while ($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {
    print_r($row);
}
返回

Tables in schema
Array
(
    [created_on] => 2015-09-09 17:34:43.517000
    [name] => TEST
    [database_name] => TESTSUITE
    [schema_name] => TESTSUITE
    [kind] => TRANSIENT
    [comment] =>
    [cluster_by] =>
    [rows] => 3
    [bytes] => 8192
    [owner] => TESTSUITE
    [account_name] => ****
    [retention_time] => 1
)
Test table content
Array
(
    [C1] => c
    [C2] =>
)
Array
(
    [C1] => a
    [C2] =>
)
Array
(
    [C1] => a
    [C2] =>
)
Tables in schema
Rows: 1
Array
(
    [created_on] => 2015-09-09 17:34:43.517000
    [name] =>
    [database_name] =>
    [schema_name] =>
    [kind] =>
    [comment] =>
    [cluster_by] =>
    [rows] =>
    [bytes] =>
    [owner] =>
    [account_name] =>
    [retention_time] =>
)
Test table content
Rows: 3
注意:
第3行之后没有进一步的输出

因此,PDO语句知道正确的行数,但
SHOW TABLES
的内容不完整,而且
SELECT*FROM TEST
不知何故完全丢失(
$statement->fetch()
立即返回
false

你知道PDO选项是否有帮助吗


我还注意到,本机ODBC函数在本例中消耗了大约200MB的内存,这似乎很多

我们也遇到了类似的问题,CAST无法通过带有Snowflake的PDO正常工作

异常“PDOException”,消息为“SQLSTATE[SL009]::0[unixODBC][Driver Manager]在此之前未绑定任何列 调用SQLFetch或SQLFetchScroll

长话短说,在与Snowflake支持部门交换了几封电子邮件后,我们发现Snowflake不支持PDO

目前,由于一些问题,我们不支持PHP PDO 由于绑定字符串/VARCHAR类型和列大小而被找到 1600万字节。这是一个决定,不推进保障性。 您可以继续使用PHP和ODBC,但是,我们可能无法 解决出现的问题/缺陷


因此,您最好使用PHP中的本机
odbc.*
函数族(这就是我们正在做的)

嗨,我也面临同样的问题,你有什么解决办法吗?@DipuR不幸的是,我们仍然在使用ODBC。这里也一样@昂德伊赫拉瓦切克对此有何更新?你成功地让PDO工作了吗?@DuruCanCelasun不,我放弃了,最后使用了ODBC