2015-10-03 3 views
0

Это относится к моему первому сообщению, но к новой проблеме. Я не был уверен в протоколе, поэтому создал новую тему. (link to first post)Замена/обновление массивов SESSION

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

Краткое описание: Корзина. У меня есть несколько элементов, перечисленных на странице с ItemID. Пользователь нажимает на элемент, он добавляется в корзину. Если пользователь дважды нажимает на один и тот же элемент, количество должно увеличиваться на единицу (в настоящее время жестко закодировано). Массив $ _SESSION ['cart'] должен начинаться пустым и быть динамическим.

Текущие проблемы: при тестировании кажется, что только один цикл проходит через массив, array_push дает ошибку, хотя параметр один является массивом, не удаляет элемент, как он должен, и не считывает количество в цикле for. Он показывает «1» в print_r($_SESSION['cart'] но «0» в $_SESSION['cart']['itemID']['quantity'];

Warning: array_push() expects parameter 1 to be array, null given in C:\xampp\htdocs\A06_DictCart\controller\updateCart.php on line 25 

Вид нескольких различных вопросов, я полагаю, но фиксируя один поможет мне двигаться вперед с другими, я предположил бы, что они являются полу-родственный ,

viewCart.php

<?php 
session_start(); 

/* Display the itemID and quantity of each item in the shopping cart. 
This may be implemented by iterating though the items in the dictionary 
and displaying their keys and values. */ 
echo ' ** array/ '.print_r($_SESSION['cart']).' ** count/ '.count($_SESSION['cart']); 
echo '<br>'.$_SESSION['cart']['itemID']['quantity']; 
echo '<center><h2><u>SHOPPING CART</u></h2>'; 
echo '<br><TABLE border=1 cellPadding=3 cellSpacing=1> 
     <TBODY> 
     <TR> 
      <TD>ItemID</TD> 
      <TD>Quantity</TD> 
      <TD>Remove from Cart</TD></TR>'; 

if (isset($_SESSION['cart'])) { 
    $c = count($_SESSION['cart']); 
    for ($x=0; $x <= $c; $x++){ 
     echo '<tr><td>'.$_SESSION['cart']['itemID'].'</td>'; 
     echo '<td>'.$_SESSION['cart']['itemID']['quantity'].'</td>'; 
     echo "<td><a href='updateCart.php?action=remove&amp;itemID=".$_SESSION['cart']['itemID']."&amp;quantity=".$qty."> Remove from Cart </a></td></tr>"; 
     $x++; 
    } 
} 
else { 
    $msg = '<i> ** cart is empty ** </i>'; 
    echo '<tr> <td></td>'; 
    echo '<td> </td>'; 
    echo "<td> </td></tr>"; 
} 

echo '</tbody></table>'; 
echo $msg; 
echo '<br><br><a href="../controller/default.php">Back to Catalog</a>'; 
echo '<br><a href="../controller/updateCart.php?action=clear">Empty Cart</a></center>'; 
?> 

updateCart.php

<?php 
/* Read the values of action, itemID, and quantity from the querystring. 
Items will either be added or removed from the shopping cart depending 
on the values of the querystring. Once the quantity is 0 the item should 
be unset from the cart. */ 

session_start(); 

$action = $_GET['action']; 
$itemID = $_GET['itemID']; 
$qty = $_GET['quantity']; 
$msg; 

if (empty($_SESSION['cart'])) $_SESSION['cart'] = array(); 
//array(); //('123' => 0, '456' => 0, '789' => 0, '101' => 0); 
//$cart = array($_SESSION['cart']); 

// ADD TO CART 
if ($action == 'add') { 
    if (!in_array($itemID, $_SESSION['cart'])) {  
     $_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty); // Insert new item 
    } else { 
     $temp = array($_SESSION['cart']); 
     $q += $_SESSION['cart'][$itemID]['qty']; 
     $temp = array('itemID' => $itemID, 'quantity' => $q); 
     array_push($_SESSION['cart'][$itemID], $temp);// Update existing item's quantity 
    } 
    $msg = $qty.' of item # '.$itemID.' has been added to your cart.'; 
} 
// REMOVE FROM CART 
if ($action == 'remove'){ 
    if (($_SESSION['cart'][$itemID]['quantity'] - 1) <= 0) 
     unset ($_SESSION['cart'][$itemID]); // If new value is zero, unset elements 
    else 
     $_SESSION['cart'][$itemID]['quantity']--; // Else decrease quantity by one 
    $msg = $qty.' of item # '.$itemID.' has been removed to your cart.'; 
} 
// EMPTY CART 
if ($action == 'clear') { 
    unset($_SESSION['cart']); // Unset session 
    session_destroy(); 
    $msg = 'Your shopping cart has been emptied.'; 
} 

?> 


<HTML> 
    <HEAD> 
    </HEAD> 
<BODY> 
<center> 
    <p> <?php echo $msg; ?><br><br> 
    <p><a href="../controller/default.php">Back to Catalog</a></p> 
    <p><a href="../controller/viewCart.php">View Cart</a></p> 
</center> 
</BODY> 
</HTML> 

Будучи, что это работа в прогресс может быть некоторые расхождения в коде синтаксисе-накрест, что Я еще не обнаружил. Некоторые из кода в заявлении «удалить из корзины» я увидел в другом посте.

Любая помощь приветствуется.

ответ

0

Я не проверял, но попробовать этот код:

// ADD TO CART 
if ($action == 'add') { 
    if (!isset($_SESSION['cart'][$itemID])) {  
     $_SESSION['cart'][$itemID] = array('itemID' => $itemID, 'quantity' => $qty); // Insert new item 
    } else { 
     $_SESSION['cart'][$itemID]['quantity'] += $qty  
    } 
    $msg = $qty.' of item # '.$itemID.' has been added to your cart.'; 
} 

Вот как бы я это пишу. Я полагаю, в вашем коде

$_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty); // Insert new item 

должен быть

$_SESSION['cart'][$itemID] = array('itemID' => $itemID, 'quantity' => $qty); // Insert new item 

И я думаю, что вы перепутали «» Qty с ключом «количество» в исходном коде. На обновление вы читаете по ключевому qty но ваш initaliser был quantity как ключ:

$q += $_SESSION['cart'][$itemID]['qty']; 

может быть должен быть записан в виде

$q += $_SESSION['cart'][$itemID]['quantity']; 

EDIT: Обратите внимание, это Image

+0

Спасибо - это был определенно некоторые из них! Теперь переменные добавляются в массив, как идентификатор, так и количество. Где-то по-моему это повлияло на мою точку зрения. Я буду продолжать играть. – mallorz

+0

приятно :) получайте удовольствие! И загляните в этот короткий стиль кодирования, который я предложил для ваших ключей .. $ array [key] [subkey] [subsubkey]. В будущем: если вы уничтожаете сеанс только потому, что хотите удалить один массив, вы можете использовать '$ _SESSION ['cart'] = array() ;, там тоже. иначе вы могли бы удалить будущий статус - что-то случайно. Я был бы испорчен, если бы вы могли проголосовать за мой ответ. Мне нужно 50 баллов, чтобы прокомментировать другую тему: D – Nibbels

+0

Я называю количество неправильным в цикле for? Независимо от того, что я делаю, он печатает «0», но я вижу, что это «1» в массиве. – mallorz

0

Вы могли бы хотеть подумать о логике вашего приложения и о том, чего вы пытаетесь достичь, прежде чем начинать писать какой-либо код.

if ($action == 'add') { 
    if (!in_array($itemID, $_SESSION['cart'])) {  
    $_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty); // Insert new item 
    } else { 
    $temp = array($_SESSION['cart']); 
    $q += $_SESSION['cart'][$itemID]['qty']; 
    $temp = array('itemID' => $itemID, 'quantity' => $q); 
    array_push($_SESSION['cart'][$itemID], $temp);// Update existing item's quantity 
    } 
} 

должны быть просто:

if ($action == 'add') { 
    $_SESSION['cart'][$itemID]+=$qty; 
} 

(Обратите внимание на изменения в структуре массива)