将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());
答案 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错误: