2009-12-03 67 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文件中看到它,这意味着什么也没有,你需要在一个旨在浏览数据库内容的程序中打开该文件,看它是否显示。

相关问题