Craig van Tonder
Craig van Tonder

Reputation: 7677

PHP - How to accomplish this if?

I am creating an order cart.

On the page that displays the cart, it checks if a value stored in the session $order corresponds with an id of a row in a mysql table. If this match exists, then the corresponding row is returned.

Within this process, I am trying to retrieve the quantity value stored in the session $quantity that corresponds to the id of the row in the table.

Each value in $order and $quantityis assigned a name, which is the id of the item they were added from.

This is the code that adds the order to the cart:

if (isset($_POST['action']) and $_POST['action'] == 'Order')
{
// Add item to the end of the $_SESSION['order'] array
$_SESSION['order'][$_POST['id']] = $_POST['id'];
$_SESSION['quantity'][$_POST['id']] = $_POST['quantity'];
header('Location: .');
exit();
}

This is the code on the cart page:

foreach ($order as $item) 
foreach ($quantity as $amount)
{

mysql_data_seek( $productsSql, 0);  //<- this line, to reset the pointer for every EACH.
while($row = mysql_fetch_assoc($productsSql))
{
     $itId = $row['id'];
     $itDesc = $row['desc'];
     $itPrice1 = $row['price1'];
     if ($item == $itId) 
    {
    $pageContent .= '
            <tr>
                <td>'.$itDesc.'</td>
                <td>'.if ($item[''.$itId.''] == $amount[''.$itId.'']) {echo $amount}.'</td>
                <td>R'.number_format($itPrice1*$amount, 2).'</td>               
            </tr>
';      
    }
}   
}

This row is producing a syntax error:

<td>'.if ($item[''.$itId.''] == $amount[''.$itId.'']) {echo $amount}.'</td>

What is the problem here for starters?

Secondly, how would I need to do to accomplish the task that I am facing?

Any input on this would be greatly appreciated!

Upvotes: 0

Views: 72

Answers (3)

Jan Thom&#228;
Jan Thom&#228;

Reputation: 13604

The code for creating the cart page has several issues.

  1. You walk over items and over quantities, which will probably give you duplicate outputs.
  2. $item is a plain string, so I wonder what $item[$itId] is supposed to do?
  3. You walk over your complete result set several times which actually is not necessary. I really hope that "$productSql" isn't a "select * from product", otherwhise this might get REAL slow in production mode.

I suggest creating a good SQL for getting the data and using this as a basis for filling the page:

// note this has SQL-injection issues, so you really need to make sure that $order contains no crap
$productsSql = mysql_query("select * from product where id in (".join($order, ',').")");

// you now have a result set with all products from your order.
while($row = mysql_fetch_assoc($productsSql))
{
 $itId = $row['id'];
 $itDesc = $row['desc'];
 $itPrice1 = $row['price1'];
 // session contains the quantity array mapping ID -> Quantity, so grab it from there
 $itQuantity = $quantity[$itId]; 
 // finally  calculate the price
 $itPrice = number_format($itPrice1*$itQuantity, 2);

 // now you have all data for your template and can just insert it.
 // if you use double quotes you can put the $xyz into the string directly
 $pageContent .= "
        <tr>
            <td>$itDesc</td>
            <td>$itQuanty</td>
            <td>R $itPrice</td>               
        </tr>
        ";      
}

Upvotes: 0

adlawson
adlawson

Reputation: 6431

You can't simply add conditional statements like that while you're building a string.

You can do this, however

<td>' . ($item[$itId] == $amount[$itId]) ? $amount : null . '</td>

but you should use a more legible method.

Another issue you may get is if $amount is an array, you won't be able to print it as a string. If, however, $amount is an object with ArrayAccess interface, you can print it with the __toString() method; but that's another story.

Upvotes: 1

Lordalcol
Lordalcol

Reputation: 1020

Could you try this?

<td>'.($item[$itId] == $amount[$itId] ? $amount : '').'</td>

This is a ternary operator, look at http://en.wikipedia.org/wiki/Ternary_operation

Upvotes: 2

Related Questions