2013-04-29 4 views
0

У меня есть следующий вопрос. Я храню корзину в сеансе массива, как показано нижеFetching array cart php

session_start(); 
$id= $_GET['id']; 
if(isset($_SESSION['cart'])) 
{ 
array_push($_SESSION['cart'], $id); 
} 
else 
    $_SESSION['cart']= array($id); 

header("location:cart.php"); 

И когда я пытаюсь достать телегу. Я получаю один и тот же идентификатор продукта, сколько я положил в корзину.

<?php 
if(!isset($_SESSION['cart'])) { 
    echo "Your cart is empty.<br /><br /><a href='products.php'>Show products</a>"; 
} else { 
    echo '<table border="0.2">'; 

    $total_price = 0; 

    foreach($_SESSION['cart'] as $id) { 
     $the_query = "select * from products where id='$id' GROUP BY id"; 

     $result = mysql_query($the_query) or die('Query failed: ' . mysql_error()); 

     $the_product = mysql_fetch_array($result, MYSQL_ASSOC); 

     $total_price = $total_price + $the_product['price']; 

     $href = "show_products.php?id=".$the_product['id']; 
     //echo "<tr>"; 
     echo "<tr><td><a href='$href'>"; 
     echo "<img src='".$the_product['image_url_small']."' /></a></td>"; 
     echo "<td><strong>".$the_product['name']."</strong></td><td><em>$".$the_product['price']."</em>"; 
     echo "</td>"; 
     echo "<td> <a href='do_deletecart.php?id=". $the_product['id'] ."'>Delete item </a></td></tr>"; 
    } 
    echo "<tr><td colspan='2'></td></tr>"; 
    echo "<tr><td style='text-align:center;font-size:40px;'>$</td><td><strong>Total</strong><br /><em>$".$total_price."</em></td></tr>"; 
    echo "</table>"; 
    echo "<br /><a href='empty_cart.php'>Empty Cart</a> <a href='showallproducts.php'>Show phones</a><br /><br />"; 
} 

Как я могу заставить его показывать только один идентификатор или имя продукта. Заранее спасибо

+1

Этот код очень уязвим для [SQL Injection] (http://bobby-tables.com). Пожалуйста, дезинфицируйте свои материалы и используйте [недавний API] (http://j.mp/PoWehJ) – Touki

+0

Я на самом деле новичок в PHP, спасибо за ваш совет. – user2210209

ответ

1

Если я правильно понимаю ваш вопрос, вы получаете много результатов для одного и того же идентификатора продукта. Это связано с тем, что вы сохраняете одинаковые значения id много раз в переменной $_SESSION.

Вы можете сделать следующее, чтобы не повторять те же идентификаторы в переменной $_SESSION.

EDIT

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

index.php

<?php 

session_start(); 

$id= isset($_GET['id']) ? $_GET['id'] : null; 

if(!is_null($id)){ 
    if(isset($_SESSION['cart']) && count($_SESSION['cart']) > 0){ 

     // increment product quantity if already exists 
     // or create a new one 
     add_or_increment_product_to_cart($id, $_SESSION['cart']); 

    } else { 
     // initialize cart 
     // add the first product 
     $_SESSION['cart'] = array(); 
     array_push($_SESSION['cart'], (object) array('id' => $id, 'quantity' => 1)); 
    } 
} 

function add_or_increment_product_to_cart($id, $cart){ 

    foreach ($cart as $key => $product) { 
     if($id == $product->id){ 
      $product->quantity++; 
      return; 
     } 
    } 

    array_push($_SESSION['cart'], (object) array('id' => $id, 'quantity' => 1)); 
} 

header("location:cart.php"); 

Cart.php

<?php 

session_start(); 

$cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : null; 

if($cart) { 
    foreach ($cart as $key => $product) { 
     $the_query = "SELECT * FROM products WHERE id=" . $product->id . " LIMIT 1"; 

     // your code to fetch the products from the database 
     // what you have done is fine but vulnerable 
     // PDO recommended 
    } 
} else { 
    echo "Your cart is empty.<br /><br /><a href='products.php'>Show products</a>"; 
} 

Также обратите внимание, что mysql_connect является устаревшим и PDO класс является рекомендуемым и безопасный способ подключения к базе данных. Ваш код уязвим для SQL Injection, как сказал @Touki в своем комментарии.

+0

Использование 'array()' будет работать, но все еще немного беспорядочно. Я бы предложил вместо фиксации симптомы, чтобы исправить корень проблемы (несколько экземпляров одинаковых идентификаторов продуктов). – Aquillo

+0

Да. Согласен. Проверка 'in_array()' гарантирует, что нет повторяющихся экземпляров одного и того же идентификатора. – Subash

+0

Моя ошибка, я не читал ваш пример правильно. Этот образец используется для ввода любых новых 'id' вместо циклов для их печати. – Aquillo

0

Я бы порекомендовал выполнить только один запрос для извлечения всех продуктов, а затем повторить результат запроса для заполнения HTML. Например;

$the_query = "select * from products where id in (". implode(',', $_SESSION['cart']) .")"; 
$result = mysql_query($the_query); 
while (($the_product = mysql_fetch_array($result, MYSQL_ASSOC))) { 
    ... 
} 

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

Стоит отметить, однако, что методы mysql_ * устарели, и было бы целесообразно начать использовать другую библиотеку, такую ​​как mysqli или PDO.

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

+0

спасибо, я попробую. – user2210209