2012-12-11 65 views
0

我的网站有问题。在id!= 0的MySQL数据库中选择记录

我有一个带有ID的照片表。当用户将文件上传到服务器时,该表格就会填充,这很好。我也有一个论坛,可以发布图片,图片发送到相同的照片表。在主页上有一个部分,其中的一张照片出现在下面的分页链接中。

现在当有人张贴到论坛,他们不包括一个图像打破。该线程不会显示,因为它正在查找不存在的0的photo_id。所以我上传了一个虚拟形象,改变id值为零,并试图

$sql = "SELECT * FROM photographs HAVING id != 0 "; 
$sql .= "LIMIT {$per_page} "; 
$sql .= "OFFSET {$pagination->offset()}"; 

哪工作,图像不再显示,但分页仍然认为存在记录的存在。它显示了该图像的链接,当用户点击它时,它会中断并删除一堆其他链接,这是一团糟。

是否可以从数据库中选择所有内容而不是0记录,或者可以从分页链接中删除链接?下面是代码:

//1. the current page number ($current_page) 
$page = !empty($_GET['page']) ? (int)$_GET['page'] : 1; 

//2. records per page ($per_page) 
$per_page = 1; 

//3. total record count ($total_count) 
$total_count = Photograph::count_all(); 


//Find all photos 
//use Pagination instead 
//$photos= Photograph::find_all(); 

$pagination = new Pagination($page, $per_page, $total_count); 

//Instead of finding all records, just find the records 
//for this page 
$sql = "SELECT * FROM photographs HAVING id != 0 "; 
$sql .= "LIMIT {$per_page} "; 
$sql .= "OFFSET {$pagination->offset()}"; 
$photos = Photograph::find_by_sql($sql); 

//Need to add ?page=$page to all links we want to 
//maintain the current page(or store $page in $session) 
?> 

    <div id="right"> 
    <?php 
    foreach($photos as $photo): 
    ?> 
<h3 style="margin: 0;"></h3> 
<div style="padding: 5px;"> 
    <a href="photo.php?id=<?php echo $photo->id; ?>"><img src="<?php echo $photo->image_path(); ?>" width="200" alt="Photo Share Photo" /></a> 
    <p align="center"><?php echo $photo->caption; ?></p> 
    </div> 
    <?php } 
endforeach; 
?> 

    <div id="pagination" style="clear: both;" align="center"> 
    <?php 
if($pagination->total_pages() > 1) { 

    if($pagination->has_previous_page()) { 
     echo "<a href=\"index.php?page="; 
     echo $pagination->previous_page(); 
     echo "\">&laquo; Previous</a> "; 
    } 

    for($i=1; $i <= $pagination->total_pages(); $i++) { 
     if($i == $page) { 
      echo " <span class=\"selected\">{$i}</span> "; 
     } else { 
     echo " <a href=\"index.php?page={$i}\">{$i}</a> "; 
    } 
    } 

    if($pagination->has_next_page()) { 
     echo " <a href=\"index.php?page="; 
     echo $pagination->next_page(); 
     echo "\">Next &raquo;</a> "; 
    } 
} 
?><br /> 
<div align="center"> 
<a href="photo_upload.php">Upload a new photograph</a> 
</div> 

[编辑]

分页代码。

class Pagination { 

    public $current_page; 
    public $per_page; 
    public $total_count; 

    public function __construct($page=1, $per_page=20, $total_count=0){ 
     $this->current_page = (int)$page; 
     $this->per_page = (int)$per_page; 
     $this->total_count = (int)$total_count; 
    } 

    public function offset() { 
     //Assuming 20 items per page: 
     //page 1 has an offset of 0       (1-1) * 20 
     // page 2 has an offset of 20  (2-1) * 20 
     //in other words, page 2 starts with item 21 
     return ($this->current_page - 1) * $this->per_page; 
    } 

    public function total_pages() { 
     return ceil($this->total_count/$this->per_page); 
    } 

    public function previous_page() { 
     return $this->current_page - 1; 
    } 

    public function next_page() { 
     return $this->current_page +1; 
    } 

    public function has_previous_page() { 
     return $this->previous_page() >= 1 ? true : false; 
    } 

    public function has_next_page() { 
     return $this->next_page() <= $this->total_pages() ? true : false; 
    } 
} 

我会查看total_pages,并返回给你,如果它的工作。我想我可以将WHERE ID!= 0添加到count_all方法的末尾。除了照片分享以外,我认为别的什么都不用。我将不得不查看代码。

感谢您的帮助。

DC

我简单地加入:

public static function count_all() { 
    global $database; 
    $sql = "SELECT COUNT(*) FROM ".self::$table_name." WHERE `id` **!= 0 AND `show` != 0";** 
    $result_set = $database->query($sql); 
    $row = $database->fetch_array($result_set); 
    return array_shift($row); 
} 

我已将此添加到照片对象。现在,用户可以选择是否希望他们的图片在照片共享部分显示,如果他们没有上传图片和他们的帖子,那么它会自动分配ID为0.如果这不明确,并且有人需要帮助它,让我知道。

+1

看起来你应该使用'NULL'而不是'0'。 –

回答

0

正如G-Nugget提到的。 NULL更适合于此。 您的查询也看起来很奇怪。通常的语法是:

SELECT * FROM photographs WHERE id != 0 

用于在GROUP BY查询中应用过滤。

编辑: 它也像你正在使用$ TOTAL_COUNT从分页浏览:

$total_count = Photograph::count_all(); 

<snip> 

for($i=1; $i <= $pagination->total_pages(); $i++) { 
     if($i == $page) { 
      echo " <span class=\"selected\">{$i}</span> "; 
     } else { 
     echo " <a href=\"index.php?page={$i}\">{$i}</a> "; 
} 

这将显示一个链接,更多的页面比存在,因为$ TOTAL_COUNT包括0的记录。

+0

使用null对我来说没有意义。该ID确实有价值。值为0.所以我希望它不等于0.该部分确实有效。现在,表中有5条记录,一条ID为0,我想排除该记录。sql的工作原理,它没有抓住那条记录,但由于某种原因,分页看到有五条记录,显示了五条记录,即使其中一条是空白的,因为它被排除在sql调用之外。我有困难缠绕它。 – DataCorrupt

+0

我确实将它更改为WHERE id!= 0。它仍然不显示记录,但通过分页有链接。 – DataCorrupt

+0

哦。我应该将id更改为null,并将sql查找为空吗?我试过,我不能将id值设置为null,因为id设置为int而NOT NULL。 – DataCorrupt