2009-12-03 48 views
0

我正在使用PHP從數據庫中獲取數據。SQLite中的SELECT *不會返回表中的所有內容

下面是代碼:

<?php 
    $db = new SQLiteDatabase("testDB.db"); 
    $query = $db->query("SELECT * FROM blog ORDER BY blogdate DESC"); 
    while($entry = $query->fetch(SQLITE_ASSOC)) { //only one blog entry per day 
     echo "<a href=\"display.php?date=".$entry['blogdate']."\">".$entry['blogdate']."</a><br>"; 
    } 
?> 

但由於某些原因,它不返回,我一定是在數據庫中的條目。我認爲它在數據庫中的原因是我可以在查看* .db文件時看到條目的文本。

這裏有可能會幫助我更好地理解這是怎麼回事就一些具體的問題:

CREATE的表稱爲blog。 I INSERT元組轉換爲blog使用查詢函數,就像我對SELECT調用一樣。當我使用LIKE的元組,是那些從數據庫中刪除的元組,還是僅僅從表博客中刪除了這些元組?如果是後一種情況,我如何讓SQLite從數據庫中完全刪除元組?

最後,我觀察到一些奇怪的行爲。一個元組被添加到blogblogdate爲「2009-12-1」(我把它當作一個字符串,因爲在SQLite中沒有日期或時間類型)。當我用上面的代碼運行PHP文件時,2009-12-1的條目爲blogdate不會顯示。我跑了另一個PHP頁面,搜索2009-12-1的blogdate LIKE元組,並且它出現在搜索結果中。只有這樣,當我使用上面的PHP爲d時,2009-12-1的元組纔會出現。

+2

請詳細說明如何知道某個記錄必須存在,但不在SELECT查詢的結果集中。 – VolkerK 2009-12-03 09:26:25

+0

通過任何方式我們可以看到你想要拉動的記錄和/或某些輸出? – gonzofish 2009-12-03 12:42:36

+0

那麼,我知道它在testDB.db中,因爲我可以看到文件中的條目。 我會修改我的問題。 – user5243421 2009-12-04 01:37:21

回答

4

當您在文本/十六進制編輯器中查看數據庫文件時,即使記錄文本可能已被標記爲數據庫中已刪除,也可能顯示記錄文本。

要完全刪除這些已刪除的記錄,請嘗試壓縮數據庫。

+0

+1對禮貌存在/不存在記錄,並解釋原因。 – Stewbob 2009-12-04 02:49:33

+0

我的問題是一個新手問題嗎? – user5243421 2009-12-04 06:09:18

+0

不,我看不出你的代碼有什麼問題,我只是解釋你爲什麼會在原始數據庫文件中看到它,但它可能不存在於你的表中。 正如其他人所建議的那樣,您應該使用數據庫瀏覽器來查看您真正擁有的數據。 – Nick 2009-12-04 08:37:39

1

查看二進制數據庫文件不足以顯示數據庫中實際存在記錄。許多數據庫並不會實際上從數據文件中刪除數據,因爲這會浪費時間。相反,他們可能會將塊標記爲「已刪除」,並在保存其他數據時稍後覆蓋它。因此,你斷言記錄在數據庫中,因爲你可以在.db文件中看到它,這意味着什麼也沒有,你需要在一個旨在瀏覽數據庫內容的程序中打開該文件,看它是否顯示。

相關問題