2010-07-10 45 views
0

我开始尝试使用sqlite来托管小型网站,并在我自己的个人服务器上,我遇到了一种损坏整个想法的格式。php sqlite_fetch_array损坏的结果

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

字段(ID,用户名,名,姓,密码)

有两个条目到表中,他们

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

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

查询(”选择*来自用户,其中id = 2“)

我得到正确的结果,就像下面这样:

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

当我要求这样的查询中的所有行(“SELECT * FROM用户“)我得到这个:

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

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

克里斯·亚当斯 ---- <在S来自克里斯

克里斯托弗 Adamstopher < ---该stopher来自英联邦人权stopher


的代码非常简单,这是我运行的,我尝试在sqlite2上直接调用sqlite_ *,然后在同一个数据库的sqlite2和sqlite3版本上使用PDO,只是为了确保有任何疑问。

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

<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 
     ) 
) 

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

+0

对不起,上面的一些文本格式,似乎网站有点改变了一些小事情,我希望它不会太多烦恼 – 2010-07-10 19:48:35

+0

如果你的问题的格式不是你所期望的,只需编辑! – 2010-07-10 19:53:23

+0

我试图修复它,但我回滚了。预览是越野车,虽然看起来不错,但最终的结果是嵌套的框。 – Artefacto 2010-07-10 19:55:14

回答

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服务器上的代码错误的行为呢?

+0

好吧,那简直太奇怪了,牛逼产生错误,你可以在这里看到的结果 http://burning-candle.com/widget-playground/profile-image/test_database2.php 和 http://burning-candle.com/widget -playground/profile-image/test_database2.phps (我在<之前做了一个小型mod输出,因此它的格式正确)。 好吧,这是一个测试用例,让我们找到重现我的错误所需的最小代码,我想知道它是否获得了它的长度?或者可能使用我使用的工具(sqlabs.net提供的SQLiteManager 3.1.1)创建表格 – 2010-07-11 08:48:28

+0

检查出这些 http://burning-candle.com/widget-playground/profile-image/test_database3.php 和 http://burning-candle.com/widget-playground/profile-image/test_database4.php – 2010-07-11 09:03:48

+0

哦,我不喜欢它如何把链接,grr! – 2010-07-11 09:06:12