0

我开始尝试使用 sqlite 来托管小型网站,并且在我自己的个人服务器上,我遇到了一个小故障,它破坏了整个想法。

我有一个非常简单的测试示例,在 sqlite 2.x 数据库中的两行表上,我使用 5.2.12 托管,我也尝试过使用 PDO sqlite3 数据库,问题是这样的。“users”表,保存一些信息,表是这样的

字段(id、用户名、名字、姓氏、密码)

表中有两个条目,它们是

条目(1,克里斯,克里斯托弗,托马斯,123) 条目(2,亚当,亚当,坦纳,456)

问题有点奇怪,当我这样查询数据库时:

query("select * from users where id=2")

我得到正确的结果,如下所示:

条目(2,亚当,亚当,坦纳,456)

当我请求所有行时,比如这个查询(“select * from users”),我得到了这个:

条目(1,克里斯,克里斯托弗,坦纳,456) 条目(2,亚当斯,亚当斯托弗,坦纳,456)

你看到似乎发生了什么吗?第二个条目中的信息比第一个条目中的字符少,所以它似乎只是用第二个条目覆盖了数据,导致了一些损坏。

克里斯亚当斯<---- s来自克里斯

Christopher Adamstopher <--- stopher 来自 chri stopher


代码很简单,这就是我运行的,我尝试在 sqlite2 上直接调用 sqlite_*,然后在同一数据库的 sqlite2 和 sqlite3 版本上进行 PDO,以确保有任何疑问。

(顺便说一句:我添加了一些简单的 html 标记更改和一些东西以使其在 stackoverflow 网站上看起来更好,这些更改不在原始代码中,但它们只是像 h1->p 或用 <pre> 包装的东西保留代码格式等)。

<p>TEST 1 with direct sqlite_* calls</p>
<?php 
try{
    $connection = sqlite_open("../playground.sqlite",0666,$error);
    $handle = sqlite_query("select * from users",$connection);

    $numResults = sqlite_num_rows($handle);

    for($a=0;$a<$numResults;$a++){
        print("<pre>".print_r(sqlite_fetch_array($handle,SQLITE_ASSOC),true)."</pre>");    
    }

}catch(Exception $e){
    die("EXCEPTION OCCURED: '$error'");
}
?>
<p>PDO TEST: SQLITE 2.x</p>
<?php    
    $connection = new PDO('sqlite2:../playground.sqlite');
    $handle = $connection->query("SELECT * FROM users");

    if($handle){
        $result = $handle->fetchAll(PDO::FETCH_ASSOC);
        print("<pre>".print_r($result,true)."</pre>");
    }else{
        var_dump($connection->errorInfo());
        print("query returned negatively");
    }
?>
<p>PDO TEST: SQLITE 3.x</p>
<?php    
    $connection = new PDO('sqlite:../playground.sqlite3');
    $handle = $connection->query("SELECT * FROM users");

    if($handle){
        $result = $handle->fetchAll(PDO::FETCH_ASSOC);
        print("<pre>".print_r($result,true)."</pre>");
    }else{
        var_dump($connection->errorInfo());
        print("query returned negatively");
    }
?>

运行此代码的输出是:

TEST 1 with direct sqlite_* calls
Array
(
    [id] => 1
    [username] => chris
    [forename] => Christopher
    [surname] => Thomas
    [password] => 123
)

Array
(
    [id] => 2
    [username] => adams
    [forename] => Adamstopher
    [surname] => Tanner
    [password] => 456
)

PDO TEST: SQLITE 2.x
Array
(
    [0] => Array
        (
            [id] => 1
            [username] => chris
            [forename] => Christopher
            [surname] => Thomas
            [password] => 123
        )

    [1] => Array
        (
            [id] => 2
            [username] => adams
            [forename] => Adamstopher
            [surname] => Tanner
            [password] => 456
        )

)

PDO TEST: SQLITE 3.x
Array
(
    [0] => Array
        (
            [id] => 1
            [username] => chris
            [forename] => Christopher
            [surname] => Thomas
            [password] => 123
        )

    [1] => Array
        (
            [id] => 2
            [username] => adams
            [forename] => Adamstopher
            [surname] => Tanner
            [password] => 456
        )
)

如果你知道为什么会这样,谢谢你告诉我!

4

1 回答 1

2
<?php
echo PHP_VERSION, ' ', PHP_OS, ' ', PHP_SAPI, "\n";

$pdo = new PDO('sqlite:sotest.sqlite'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$pdo->exec('DROP TABLE IF EXISTS users');
$pdo->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY ASC, username,forename,surname,password)');
$pdo->exec("INSERT INTO users (id,username,forename,surname,password) VALUES (1,'chris','Christopher','Thomas',123)");
$pdo->exec("INSERT INTO users (id,username,forename,surname,password) VALUES (2,'adam','Adam','Tanner',456)");

$rows = $pdo->query("SELECT Length(forename) as cForename, Length(surname) as cSurname, * FROM users")->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);

在我的机器上打印

5.3.2 WINNT cli
Array
(
    [0] => Array
        (
            [cForename] => 11
            [cSurname] => 6
            [id] => 1
            [username] => chris
            [forename] => Christopher
            [surname] => Thomas
            [password] => 123
        )

    [1] => Array
        (
            [cForename] => 4
            [cSurname] => 6
            [id] => 2
            [username] => adam
            [forename] => Adam
            [surname] => Tanner
            [password] => 456
        )

)

您能否在 5.2.x 服务器上使用此代码重现错误行为?

于 2010-07-10T20:46:58.713 回答