Order list/ while loop php issue

蹲街弑〆低调 提交于 2019-12-13 06:29:57

问题


I have put together a basic order list for admin users in php for checking order contents placed by logged in users.

The aim of this script is to retrieve the order details (item, quantity, price) as well as the user’s first name and surname (where ‘Order for:’ is).

The script below does everything ok in that it retrieves the order (and orders if there are more than one) and it’s/their item, quantity and price.

However, it doesn’t display the user’s name and surname.

I know the problem is that where I am trying to display the name is outside the while loop but Im a little stuck in where it should sit. Any suggestions? Code is below:

    <?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.
?>

回答1:


One way you could do it is grab the row first, and then use a do/while loop instead of just a basic while loop. Like this:

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:


It looks like the problem is when you're trying to display the user's name:

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

The $row variable doesn't exist yet. Not seeing your database or the result from your database query, my guess is that the user's name is repeated next to every single item in their order, so it might be as simple as just starting the WHILE loop, and checking to see if you've printed their name yet:

$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

But like I said, this is just a guess, and might be totally off.




回答3:


The problem is that you tried to access $row[2] and $row[3] before mysql_fetch_array(). Since you are already echo'ing HTML tags, why don't you "buffer" your output first like this?:

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;
}

Then do a second foreach loop for the $orders

foreach($orders as $name => $orderList)
{
  echo "Order for: $name";
  echo "<table ...>";
  foreach($orderList as $order)
  {
     echo $order;
  }
  echo "</table>";
}


来源:https://stackoverflow.com/questions/7410443/order-list-while-loop-php-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!