为什么这个PHP循环每次渲染两次?

时间:2010-06-17 00:48:46

标签: mysql php for-loop loops

我在这里工作的真正的弗兰克斯特不是我自己设计的。有一个基本的CMS,其中一个页面显示来自MySQL DB的客户记录。

出于某种原因,它没有从数据库中获取数据的probs - 没有重复的记录 - 但是它每行都会呈现两次。

<?php
$limit = 500;
$area = 'customers_list';
$prc = 'customer_list.php';

if($_GET['page'])
{
    include('inc/functions.php');
    $page = $_GET['page'];
}
else 
{
    $page = 1;
}

$limitvalue = $page * $limit - ($limit);

$customers_check = get_customers();
$customers = get_customers($limitvalue, $limit);
$totalrows = count($customers_check);

?>
<!-- pid: customer_list -->

<table border="0" width="100%" cellpadding="0" cellspacing="0" style="float: left; margin-bottom: 20px;">
    <tr>
        <td class="col_title" width="200">Name</td>
        <td></td>

        <td class="col_title" width="200">Town/City</td>
        <td></td>

        <td class="col_title">Telephone</td>

        <td></td>
    </tr>

    <?php
    for ($i = 0; $i < count($customers); $i++)
    {
    ?>
    <tr>
        <td colspan="2" class="cus_col_1"><a href="customer_details.php?id=<?php echo $customers[$i]['customer_id']; ?>"><?php echo $customers[$i]['surname'].', '.$customers[$i]['first_name']; ?></a></td>
        <td colspan="2" class="cus_col_2"><?php echo $customers[$i]['town']; ?></td>
        <td class="cus_col_1"><?php echo $customers[$i]['telephone']; ?></td>

        <td class="cus_col_2">
            <a href="javascript: single_execute('prc/customers.prc.php?delete=yes&id=<?php echo $customers[$i]['customer_id']; ?>')" onClick="return confirmdel();" class="btn_maroon_small" style="margin: 0px; float: right; margin-right: 10px;"><div class="btn_maroon_small_left">
                <div class="btn_maroon_small_right">Delete Account</div>
            </div></a>
            <a href="customer_edit.php?id=<?php echo $customers[$i]['customer_id']; ?>" class="btn_black" style="margin: 0px; float: right; margin-right: 10px;"><div class="btn_black_left">
                <div class="btn_black_right">Edit Account</div>
            </div></a>
            <a href="mailto: <?php echo $customers[$i]['email']; ?>" class="btn_black" style="margin: 0px; float: right; margin-right: 10px;"><div class="btn_black_left">
                <div class="btn_black_right">Email Customer</div>
            </div></a>
        </td>
    </tr>
    <tr><td class="col_divider" colspan="6"></td></tr>
    <?php
    };
    ?>
</table>

<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->
<!--// PAGINATION-->
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->
<div class="pagination_holder">

<?php
if($page != 1)
{
    $pageprev = $page-1;
?>
    <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $pageprev; ?>');" class="pagination_left">Previous</a>
<?php
}
else
{
?>
    <div class="pagination_left, page_grey">Previous</div>
<?php
}
?>
<div class="pagination_middle">
<?php
$numofpages = $totalrows / $limit;

for($i = 1; $i <= $numofpages; $i++)
{
    if($i == $page)
    {
    ?>
        <div class="page_number_selected"><?php echo $i; ?></div>
    <?php
    }
    else
    {
    ?>
        <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $i; ?>');" class="page_number"><?php echo $i; ?></a>
    <?php
    }
}

if(($totalrows % $limit) != 0)
{
    if($i == $page)
    {
    ?>
        <div class="page_number_selected"><?php echo $i; ?></div>
    <?php
    }
    else
    {
    ?>
        <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $i; ?>');" class="page_number"><?php echo $i; ?></a>
    <?php
    }
}
?>
</div>
<?php
if(($totalrows - ($limit * $page)) > 0)
{
    $pagenext = $page+1;
?>
    <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $pagenext; ?>');" class="pagination_right">Next</a>
<?php
}
else
{
?>
    <div class="pagination_right, page_grey">Next</div>
<?php
}
?>

</div>
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->
<!--// END PAGINATION-->
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->

我不是世界上最好的PHP专家,但我认为我可以在for循环中看到错误...但是一切看起来都不错。您会注意到客户名称是可点击的;单击将转到另一个页面,您可以在其中查看数据库中保存的完整信息 - 对于这两行,客户ID是相同的,并且手动检查数据库显示没有重复的条目。代码肯定会渲染每一行两次,但出于什么原因我不知道。

赞赏所有指针/建议。

2 个答案:

答案 0 :(得分:1)

就像jayrub写的那样,StackOverflow可能更适合这个。

但既然你已经问过了,我会提出这些建议:

1。)使用foreach()来查看这样的数组:

foreach ($customers as $i => $customer) {
    echo $customer['name'];
    ...
}

2。)在var_dump()$customers上使用$customers_check作为Zoredache建议。

3.)使用语义标记;所以,对于表格,你会想要这样的东西:

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Town</th>
            <th>Phone</th>
        </tr>
    </thead>
    <tbody>
        <!-- your php code here -->
    </tbody>
</table>

这将使屏幕阅读器更容易,并且还可以更轻松地使用某些脚本来生成丰富的Web界面。有关详情,请参阅此页:http://www.ferg.org/section508/accessible_tables.html

4.)哦,尽可能避免使用内联CSS。这只是一种糟糕的形式。

答案 1 :(得分:0)

请尝试以下操作,这是您的代码的更新版本。

请阅读我在其中所做的评论,这只是一些良好做法的示例。

<?php
$limit = 500;
$area = 'customers_list';
$prc = 'customer_list.php';

if($_GET['page'])
{
    include('inc/functions.php');
    $page = (int)$_GET['page']; // safety (page always needs to be an integer
}
else 
{
    $page = 1;
}

$limitvalue = $page * $limit - ($limit);

$customers_check = get_customers();
$customers = get_customers($limitvalue, $limit);
$totalrows = count($customers_check);

?>
<!-- pid: customer_list -->

<table border="0" width="100%" cellpadding="0" cellspacing="0" style="float: left; margin-bottom: 20px;">
    <tr>
        <td class="col_title" width="200">Name</td>
        <td></td>

        <td class="col_title" width="200">Town/City</td>
        <td></td>

        <td class="col_title">Telephone</td>

        <td></td>
    </tr>

    <?php
    foreach($customers as $i => $customer) // foreach is easier to use, manage and troubleshoot
    {
    ?>
    <tr>
        <td colspan="2" class="cus_col_1"><a href="customer_details.php?id=<?php echo $customer['customer_id']; ?>"><?php echo $customer['surname'].', '.$customer['first_name']; ?></a></td>
        <td colspan="2" class="cus_col_2"><?php echo $customer['town']; ?></td>
        <td class="cus_col_1"><?php echo $customer['telephone']; ?></td>

        <td class="cus_col_2">
            <a href="javascript: single_execute('prc/customers.prc.php?delete=yes&id=<?php echo $customer['customer_id']; ?>')" onClick="return confirmdel();" class="btn_maroon_small" style="margin: 0px; float: right; margin-right: 10px;"><div class="btn_maroon_small_left">
                <div class="btn_maroon_small_right">Delete Account</div>
            </div></a>
            <a href="customer_edit.php?id=<?php echo $customer['customer_id']; ?>" class="btn_black" style="margin: 0px; float: right; margin-right: 10px;"><div class="btn_black_left">
                <div class="btn_black_right">Edit Account</div>
            </div></a>
            <a href="mailto: <?php echo $customer['email']; ?>" class="btn_black" style="margin: 0px; float: right; margin-right: 10px;"><div class="btn_black_left">
                <div class="btn_black_right">Email Customer</div>
            </div></a>
        </td>
    </tr>
    <tr><td class="col_divider" colspan="6"></td></tr>
    <?php
    }
    ?>
</table>

<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->
<!--// PAGINATION-->
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->
<div class="pagination_holder">

<?php
if($page != 1)
{
    $pageprev = $page-1;
?>
    <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $pageprev; ?>');" class="pagination_left">Previous</a>
<?php
}
else
{
?>
    <div class="pagination_left, page_grey">Previous</div>
<?php
}
?>
<div class="pagination_middle">
<?php
$numofpages = $totalrows / $limit;
if(($totalrows % $limit) != 0) // using this avoids the second for-loop (avoids redundant code)
  $numofpages++;

for($i = 1; $i <= $numofpages; $i++)
{
    if($i == $page)
    {
    ?>
        <div class="page_number_selected"><?php echo $i; ?></div>
    <?php
    }
    else
    {
    ?>
        <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $i; ?>');" class="page_number"><?php echo $i; ?></a>
    <?php
    }
}

?>
</div>
<?php
if(($totalrows - ($limit * $page)) > 0)
{
    $pagenext = $page+1;
?>
    <a href="javascript: change('<?php echo $area; ?>', '<?php echo $prc; ?>?page=<?php echo $pagenext; ?>');" class="pagination_right">Next</a>
<?php
}
else
{
?>
    <div class="pagination_right, page_grey">Next</div>
<?php
}
?>

</div>
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->
<!--// END PAGINATION-->
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-->