2015-05-02 3 views
4

У меня проблема с чем-то.
У меня есть этот код, чтобы добавить товар в корзину:Автоматическое увеличение ключа СЕССИИ

$product_id = isset($_GET['product_id']) ? $_GET['product_id'] : ""; 
$product_name = isset($_GET['product_name']) ? $_GET['product_name'] : ""; 

$sql = "SELECT * FROM products WHERE product_id LIKE '{$product_id}' AND product_name LIKE '{$product_name}' LIMIT 1"; 
$stmt = $connection->prepare($sql); 
$stmt->execute(); 

$num = $stmt->rowCount(); 

if($num == 1) 
{ 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
    { 
     extract($row); 
     if(!isset($_SESSION['cart'])) 
     { 
      $product_id_session = 1; 
     } 
     else 
     { 
      $count = count($_SESSION['cart']); 
      $product_id_session = $count++; 
     } 

     $columns = array 
     (
      'product_id_session' => $product_id_session, 
      'product_id' => $product_id, 
      'product_name' => $product_name, 
      'product_price' => $product_price   
     ); 
     $_SESSION['cart'][$product_id_session] = $columns;  
     redirect_to('products.php?&message=added&product_name='. $_SESSION['cart'][$product_id_session]['product_name']); 
    } 
} 

Как вы можете видеть, если сеанс cart создается, я задаю переменную $product_id_session с графом сессионных массивов плюс один. В противном случае переменная $product_id_session установлена ​​в 1. В корзине странице у меня есть ссылка, чтобы удалить выбранный продукт:

foreach($_SESSION['cart'] as $product) 
{ 
    echo "<button onClick=\"location.href='remove.php?product_id_session={$product['product_id_session']}'\"> 
    Remove from cart 
    </button>"; 
} 

Тогда, в remove.php файла я должен это обработать данные из строки запроса и удаление продукта из корзины:

$product_id_session = isset($_GET['product_id_session']) ? $_GET['product_id_session'] : ""; 
unset($_SESSION['cart'][$product_id_session]); 

Проблема, с которой я столкнулся: например, я добавил два продукта в корзину. Затем я удалил первый продукт и добавил другой товар в корзину. Новый продукт вместо того, чтобы быть добавленным, просто заменит продукт, который был ранее добавлен в корзину, и $product_id_session будет всегда того же значения. Что я делаю неправильно? Как указать идентификатор для СЕССИИ?

+0

Не много смысла в подготовке ваше заявление, если вы собираетесь вводить введенные пользователем значения непосредственно в запросе одинаково: у вас проблема с SQL-инъекцией. – jeroen

+0

@jeroen Я вставляю значения только в том случае, если они совпадают в базе данных. – Dyan

ответ

1

Вы можете добавить новые элементы в корзину только с:

$_SESSION['cart'][] = $columns; 

Тогда будет добавлен в конец массива.

И, после удаления элемента из массива, вы можете (но не обязательно) повторно индексировать его

$_SESSION['cart'] = array_values($_SESSION['cart']); 

При печати из телеги, вы просто обновить цикл Еогеаспа поймать ключ значение в некоторую переменную, то есть $ index. Разница заключается в части продукта $ index => $.

foreach($_SESSION['cart'] as $index=>$product) 
{ 
    echo "<button onClick=\"location.href='remove.php?product_id_session={$index}'\"> 
    Remove from cart 
    </button>"; 
} 

Remove.php остается в основном то же самое, я только что обновил его для лучшего readibility:

if (isset($_GET['product_id_session']) and $_GET['product_id_session']) { 
    $product_id_session = $_GET['product_id_session']; 
    unset($_SESSION['cart'][$product_id_session]); 
} 
+0

Благодарим вас за ответ, но мне нужно использовать '$ _SESSION ['cart'] [$ product_id_session]', потому что мне нужно будет указать, какой идентификатор продукта удалить и отключить соответствующий массив SESSION в *** remove.php *** файл. – Dyan

+0

Я понимаю это.Тем не менее, я не думаю, что вам нужно держать $ product_id_session в отдельном поле - значение уже сохраняется как индекс (ключ) значения в массиве, вам не нужно дублировать это число в $ product_id_session. Попробуйте использовать 'foreach ($ _ SESSION ['cart'] как $ product_id_session => $ product)' in ** remove.php **, и вы тоже получите этот результат. –

+0

Но без этого, как я отключу соответствующий массив SESSION? – Dyan

0

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

if($num == 1) { 
    $row = $stmt->fetch(PDO::FETCH_ASSOC); // no need for the loop as you only have 1 result 
    extract($row); 
    if(!isset($_SESSION['cart'])) { 
     $_SESSION['cart'] = array(); 
    } 
    // keep track of the added product for the time being 
    if (!isset($_SESSION['cart'][$product_id])) { 
     $columns = array(
      'product_id_session' => $product_id_session, 
      'product_id' => $product_id, 
      'product_name' => $product_name, 
      'product_price' => $product_price, 
      'amount' => 0, //just add last comma as good practise here 
     ); 
     $_SESSION['cart'][$product_id] = $columns; 
    } 
    //raise the amount 
    $_SESSION['cart'][$product_id]['amount']++; 
    redirect_to('products.php?&message=added&product_name='. $_SESSION['cart'][$product_id_session]['product_name']); 
} 

И изменить удалить соответствующим образом:

foreach($_SESSION['cart'] as $product) { 
    echo "<button onClick=\"location.href='remove.php?product_id={$product['product_id']}'\">Remove from cart</button>"; 
} 

EDIT:

Чтобы сохранить «уникальный» идентификатор не следует использовать count для расчета ID Просто используйте дополнительную переменную для отслеживания последнего Id:

if(!isset($_SESSION['cart'])) 
    { 
     $_SESSION['cart'] = array(); 
     $_SERVER['cart_product_id'] = 1; 
    } 
    else 
    { 
     $_SERVER['cart_product_id']++; 
     $product_id_session = $_SERVER['cart_product_id']; 
    } 
+0

Спасибо за ответ. Я занимаюсь онлайн-системой заказов, поэтому пользователь может добавлять один и тот же продукт несколько раз, потому что у меня есть система дополнений. Мне нужно сделать это, указав ID для этого массива SESSION. – Dyan

+0

Вот почему я добавил «количество» в массиве, чтобы отслеживать заказы на мультипоты одного и того же продукта. – DarkBee

+0

Я не могу назначить 'product_id' в качестве идентификатора для удаления продукта, потому что я могу иметь несколько продуктов на странице корзины с тем же идентификатором. – Dyan

Смежные вопросы