订单列表/ while循环php问题

时间:2011-09-14 01:51:25

标签: php mysql while-loop

我已经为php中的管理员用户编制了一个基本订单列表,用于检查登录用户下的订单内容。

此脚本的目的是检索订单详细信息(项目,数量,价格)以及用户的名字和姓氏(其中'Order for:')。

下面的脚本可以确保一切正常,因为它会检索订单(如果有多个订单则是订单)以及它/它们的项目,数量和价格。

但是,它不显示用户的姓名和姓氏。

我知道问题是,我试图显示名称的位置在while循环之外,但我有点卡在它应该坐的位置。有什么建议?代码如下:

    <?php 
    $page_title = 'View Individual Order';
    include ('includes/header.html');

    // Check for a valid user ID, through GET or POST.
   if ( (isset($_GET['id'])) && (is_numeric($_GET['id'])) )
    { // Accessed through view_users.php   
     $id = $_GET['id'];

    } elseif ( (isset($_POST['id'])) && (is_numeric($_POST['id'])) )
   { // Form has been submitted.   
    $id = $_POST['id'];
} else { // No valid ID, kill the script.
    echo '<h1 id="mainhead">Page Error</h1>
    <p class="error">This page has been accessed in error.</p><p><br /><br /></p>';
    include ('./includes/header.html'); 
    exit();
}
?>

<h1>Order Details</h1>

<?php
require_once ('database.php'); // Connect to the db.

// Retrieve the user's, order and product information.
$query = "SELECT us.users_id, us.users_sales_id, us.users_first_name, us.users_surname, us.users_dealer_name, 
             ord.order_id, ord.users_id, ord.total, ord.order_date,  
             oc.oc_id, oc.order_id, oc.products_id, oc.quantity, oc.price,
             prd.products_id, prd.products_name, prd.price      
         FROM users AS us, orders AS ord, order_contents AS oc, products AS prd  
         WHERE ord.order_id=$id
         AND us.users_id = ord.users_id
         AND ord.order_id = oc.order_id
         AND oc.products_id = prd.products_id    
         ";

$result = mysql_query ($query) or die(mysql_error());

if (mysql_num_rows($result)) { // Valid user ID, show the form.

    echo    '<p>Order for:<strong>' . $row[2] . ' ' . $row[3] . ' </strong> </p>
            <table border="0" style="font-size:11px;" cellspacing="1" cellpadding="5">
                <tr class="top">
                <td align="left"><b>Product</b></td>
                <td align="center"><b>Price</b></td>
                <td align="center"><b>Qty</b></td>
                </tr>';

    $bg = '#dddddd'; // Set the background color.

    while($row = mysql_fetch_array($result, MYSQL_NUM)) { // WHILE loop start

    $bg = ($bg=='#eaeced' ? '#dddddd' : '#eaeced');

    echo        '<tr bgcolor="' . $bg . '">';

    echo        '<td align="left">' . $row[15] . '</td>
            <td align="center">' . $row[13] . ' pts</td>
            <td align="center">' . $row[12] . '</td>
            </tr>';

    echo        '';         

                }// end of WHILE loop

        echo '</table>
            <p> Here:</p>   
            <br><br>
            <p><a href="view-all-orders.php"> << Back to Orders</a></p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            ';

} else { // Not a valid user ID.
    echo '<h1 id="mainhead">Page Error</h1>
    <p class="error">This page has been accessed in error.</p><p><br /><br /></p>';   
}

mysql_close(); // Close the database connection.
?>

<p>Footer here</p>

<?php
include ('./includes/footer_admin_user.html'); // Include the HTML footer.
?>

3 个答案:

答案 0 :(得分:0)

当您尝试显示用户名时,问题就在于:

echo '<p>Order for:<strong>'.$row[2].' '.$row[3]

$row变量尚不存在。没有看到你的数据库或数据库查询的结果,我的猜测是用户的名字会在它们的顺序中的每一个项目旁边重复,所以它可能就像启动WHILE循环一样简单,并检查你是否' ve打印了他们的名字:

$lastUser = NULL;
while($row = mysql_fetch_array($result, MYSQL_NUM)) {
    if ($row[0] !== $lastUser) {
        if (isset($lastUser)) {
            // finish up the report for the previous user
        }
        // echo the stuff for the current user's name
        $lastUser = $row[0];
    }
    // go on echo-ing their order information
}
// after the while loop is over,
// close up the last user's report

但就像我说的那样,这只是猜测,可能完全不合适。

答案 1 :(得分:0)

你可以做的一种方法是首先获取行,然后使用do / while循环而不是基本的while循环。像这样:

if (mysql_num_rows($result)) { // Valid user ID, show the form.

    /*********** I added this line ***********/
    $row = mysql_fetch_array($result, MYSQL_NUM);

    echo    '<p>Order for:<strong>' . $row[2] . ' ' . $row[3] . ' </strong> </p>
            <table border="0" style="font-size:11px;" cellspacing="1" cellpadding="5">
                <tr class="top">
                <td align="left"><b>Product</b></td>
                <td align="center"><b>Price</b></td>
                <td align="center"><b>Qty</b></td>
                </tr>';

    $bg = '#dddddd'; // Set the background color.

    /*********** I changed this from a while loop to a do-while loop ***********/
    do { // WHILE loop start

    $bg = ($bg=='#eaeced' ? '#dddddd' : '#eaeced');

    echo        '<tr bgcolor="' . $bg . '">';

    echo        '<td align="left">' . $row[15] . '</td>
            <td align="center">' . $row[13] . ' pts</td>
            <td align="center">' . $row[12] . '</td>
            </tr>';

    echo        '';         

    } while($row = mysql_fetch_array($result, MYSQL_NUM)); // end of WHILE loop

答案 2 :(得分:0)

问题是您尝试在$row[2]之前访问$row[3]mysql_fetch_array()。由于您已经echo标记了HTML个标记,为什么不首先像这样“缓冲”您的输出?:

while($row = mysql_fetch_array($result, MYSQL_NUM)) {
  $bg = ($bg=='#eaeced' ? '#dddddd' : '#eaeced');

  $order = '<tr bgcolor="' . $bg . '">
              <td align="left">' . $row[15] . '</td>
              <td align="center">' . $row[13] . ' pts</td>
              <td align="center">' . $row[12] . '</td>
            </tr>';
  $orders[$row[2] . " " . $row[3]][] .=  $order;
}

然后为foreach

执行第二个$orders循环
foreach($orders as $name => $orderList)
{
  echo "Order for: $name";
  echo "<table ...>";
  foreach($orderList as $order)
  {
     echo $order;
  }
  echo "</table>";
}