PHP PDO Postgres与Sqlite列类型的计数(*)

时间:2016-08-09 17:42:24

标签: php postgresql pdo sqlite

将PHP PDO与此SQL语句一起使用

SELECT count(*) FROM my_table;

返回带有Postgres的INTEGER和带有Sqlite3的STRING。也就是说,如果表中有一行,Postgres返回(int)1,Sqlite返回'1'

这是预期的,还是这个错误?

[编辑添加如下]

如果你想在家里跟随,这是一个我拼凑的演示脚本。我实际上在我的PHPUnit测试通过时遇到了这种情况(使用内存中的Sqlite作为测试夹具)但我的应用程序使用生产的Postrgres数据库失败了。

<?php
function connect($dsn)
{
    try {
        $pdo = new \PDO($dsn);
    }
    catch (\PDOException $e) {
        echo 'New PDO failed: ' . $e->getMessage() . PHP_EOL;
        exit;
    }
    return $pdo;
}

function doQuery($pdo, $sql)
{
    if ( ($result = $pdo->query($sql)) === false) {
        echo "'$sql' failed: " . print_r($pdo->errorInfo(), true) . PHP_EOL;
    }
    return $result;
}

$pgo = connect('pgsql:host=localhost;dbname=postgres');
$sqo = connect('sqlite::memory:');

doQuery($pgo, 'DROP TABLE IF EXISTS public.foo');
doQuery($pgo, 'CREATE TABLE public.foo ( ii int )');
doQuery($pgo, 'INSERT INTO public.foo VALUES (42)');

doQuery($sqo, "ATTACH DATABASE ':memory:' AS public;") or die();
doQuery($sqo, 'DROP TABLE IF EXISTS public.foo');
doQuery($sqo, 'CREATE TABLE public.foo ( ii int )');
doQuery($sqo, 'INSERT INTO public.foo VALUES (42)');

$pgResult = doQuery($pgo, 'SELECT COUNT(ii) FROM foo');
echo 'Postgres: ';
var_dump($pgResult->fetchColumn());

echo 'Sqlite3: ';
$ltResult = doQuery($sqo, 'SELECT COUNT(ii) FROM foo');
var_dump($ltResult->fetchColumn());

2 个答案:

答案 0 :(得分:1)

这是sqlite没有数据类型的副作用。或者更确切地说,拥有他们所谓的dynamic type system。但非常有趣的是

SELECT TYPEOF(b) FROM ( select count(*) as b from my_table) a;

生成integer作为输出!很明显,在从sqlite到php的翻译中丢失了一些东西。然而,它并不重要,因为在php '1' + 2中给出了3.因为让我们不要忘记,PHP也是一个动态类型系统。

答案 1 :(得分:0)

报告并接受为PHP PDO错误:

https://bugs.php.net/bug.php?id=72798