2010-06-17 4 views
0

Je travaille sur un vrai frankensite ici pas de mon propre design. Il y a un CMS rudimentaire et l'une des pages montre les enregistrements clients d'une base de données MySQL. Pour une raison quelconque, il n'a aucun problème à récupérer les données de la BD - il n'y a pas d'enregistrements en double - mais il rend chaque ligne deux fois.Pourquoi cette boucle PHP rend-elle chaque ligne deux fois?

<?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--> 
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--> 

Je ne suis pas le meilleur expert en PHP dans le monde, mais je pense que je peux voir une erreur dans une boucle for quand il y a un ... Mais tout semble ok pour moi. Vous remarquerez que le nom du client est cliquable; En cliquant sur ce bouton, vous accédez à une autre page où vous pouvez afficher toutes les informations contenues dans le DB. Pour les deux lignes, l'ID client est identique et la vérification manuelle du DB indique qu'il n'y a pas d'entrées en double. Le code rend définitivement chaque rangée deux fois, mais pour quelle raison je n'en ai aucune idée.

Tous les pointeurs/conseils appréciés.

+1

Mauvais site, essayez stackoverflow.com – JeremyWeir

+1

Comment $ customers_check est-il rempli? avez-vous essayé de faire un simple 'var_dump ($ customers_check)' pour vous assurer que vous n'avez pas de doublons? – Zoredache

Répondre

0

Essayez ceci, ceci est une version mise à jour de votre code.

S'il vous plaît lire les commentaires que j'ai fait, c'est juste un échantillon de quelques bonnes pratiques.

<?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--> 
<!--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--> 
1

Comme jayrub a écrit, StackOverflow est probablement plus approprié pour cela.

Mais puisque vous avez déjà demandé, je vais faire ces recommandations:

1.) Utilisez foreach() de regarder à travers des tableaux comme celui-ci:

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

2.) Utiliser var_dump() comme Zoredache suggère, sur $customers et $customers_check.

3.) Utiliser le balisage sémantique; ainsi, pour les tables, vous voulez quelque chose comme:

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

Ce sera plus facile pour les lecteurs d'écran et rendre également plus facile à utiliser certains scripts pour générer des riches interfaces web. Voir cette page pour plus d'informations: http://www.ferg.org/section508/accessible_tables.html

4.) Oh, et d'éviter CSS en ligne autant que possible. C'est juste une mauvaise forme.

+0

Tout à fait d'accord - Je n'utiliserais pas de CSS en ligne, je n'ai pas conçu ce site! (J'essaie juste de me frayer un chemin et de résoudre tous ses problèmes, un par un) Noté aussi sur la suggestion de balisage sémantique, j'essaie toujours de concevoir pour se conformer aux normes d'accessibilité recommandées quand c'est possible. Heureusement, je ne suis pas si préoccupé par ce design particulier que le CMS n'est utilisé en interne par une poignée de personnes à l'heure actuelle. –

Questions connexes