2010-07-10 43 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