Список заказов / пока цикл php проблема - PullRequest
0 голосов
/ 14 сентября 2011

Я собрал базовый список заказов для пользователей-администраторов в php для проверки содержимого заказа, размещенного вошедшими в систему пользователями.

Цель этого скрипта - получить детали заказа (предмет, количество, цена)а также имя и фамилию пользователя (где 'Order for:' is).

Сценарий, приведенный ниже, делает все нормально, так как он получает заказ (и заказы, если их более одного) и его /их товар, количество и цена.

Тем не менее, он не отображает имя и фамилию пользователя.

Я знаю, что проблема в том, что когда я пытаюсь отобразить имя вне цикла 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 голосов
/ 14 сентября 2011

Один из способов сделать это - сначала захватить строку, а затем использовать цикл 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
0 голосов
/ 14 сентября 2011

Проблема в том, что вы пытались получить доступ к $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>";
}
0 голосов
/ 14 сентября 2011

Похоже, проблема в том, что вы пытаетесь отобразить имя пользователя:

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

Переменная $row еще не существует. Я не вижу вашей базы данных или результата запроса к базе данных. Я предполагаю, что имя пользователя повторяется рядом с каждым элементом в их порядке, поэтому это может быть так же просто, как просто запустить цикл WHILE и проверить, если вы ' Мы напечатали их имя:

$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

Но, как я уже сказал, это всего лишь предположение, и оно может быть полностью неверным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...