2016-02-18 198 views
1

我試圖用PHP創建一個購物籃,我可以添加項目,清除整個購物籃,但是當我試圖從籃子中刪除一件商品時,我被卡住了。我嘗試發送一個GET變量到URL中,然後根據它的ID減少指定項目的數量。雖然目前看起來似乎不起作用,並且如果我多次點擊,URL變得巨大,並且GET變量不斷被添加到結尾,而不是更改整個URL。從購物籃中刪除商品PHP

這是我的PHP

<?php if(isset($_SESSION["cart"])) { 
      foreach ($_SESSION["cart"] as $id => $value) { 
       $ids .= $id . ','; 

       $count += $value['quantity']; 

       $totalPrice += $value['price']; 

      } 

      $query = $database->find_item_db($ids); 

      foreach ($query as $single_query) { 
       $id = $single_query['Sweet_ID']; 
      echo $single_query['Description']; ?> x <?php echo $_SESSION['cart'][$id]['quantity'] . '<a href=' . $_SERVER['REQUEST_URI'] .'&idToRemove=' . $id . '&action=remove> Remove </a>' . '</br>'; 
      } ?> 

     <h3>Currently <?php echo $count; ?> Items in the basket</h3> 
     <h4> Total Price £<?php echo $totalPrice; ?> </h4> 

     <?php 
      } else { 
      echo "Your cart is empty"; 
      } 
    ?> 


<?php 
session_start(); 

if ($_GET['action'] == "add") { 

    $idNumber=intval($_GET['id']); 

    if (isset($_SESSION['cart'][$idNumber])) { 

     $_SESSION['cart'][$idNumber]['quantity']++; 

    } else { 
     $sql = $database->display_single($idNumber); 

     $second_id = $sql[0]['Sweet_ID']; 
     $price = $sql[0]['Price']; 

     $_SESSION['cart'][$second_id]=array(
       "quantity" => 1, 
       "price" => $price 
     ); 
    } 

} else if ($GET['action'] == 'remove') { 

    $idNumber=intval($_GET['idToRemove']); 

    $_SESSION['cart'][$idNumber]['quantity']--; 

} else if ($_GET['action'] == 'clear') { 
    unset($_SESSION['cart']); 
} 

?> 
+0

我注意到的第一件事情是:在發送標題並在初始化之前使用它之後開始會話。然後,語法,樣式和使用函數看起來不安全,看起來像XSS泄漏給我,我猜也是SQL注入。 – DanFromGermany

回答

2

更改此:

'<a href=' . $_SERVER['REQUEST_URI'] .'&idToRemove=' . $id . '&action=remove> Remove </a>' 

到這一點:

'<a href="?idToRemove=' . $id . '&action=remove"> Remove </a>' 

$_SERVER['REQUEST_URI'] ALR eady包含當前存在於URL中的所有參數。 這將僅創建一個空白URL(指向當前頁面),其參數只有idToRemoveaction

(並加入雙引號,以保持很好地包含在href屬性中的URL)

+0

謝謝,效果很好。 – pocockn

0

的問題來自於您的HTML代碼。 我覺得你有這樣的事情在你的PHP:

<form action="<?php echo $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']?>" 

而當你總是(重新)調用相同的HTML表單,先前發佈的GET瓦爾一連連發布....

0

我編程,基於會話的籃子類,你可以使用它,什麼問題都問我請

class basket { 
function add($pid,$qty){ 


if(!isset($_SESSION['basket'])){ 
$_SESSION['basket']=array(); 
$_SESSION['basket'][0]['productid']=$pid; 
$_SESSION['basket'][0]['qty']=$qty; 
echo 'The product was successfully added'; 
} 

else { 

if($this->isexist($pid,$qty)){ 
echo 'The quantity was successfully updated'; 
} 
else{ 
$m=$_SESSION['basket']; 
$max=count($m); 
$_SESSION['basket'][$max]['productid']=$pid; 
$_SESSION['basket'][$max]['qty']=$qty; 
echo 'The product was successfully added'; 
} 
} 

} 

function isexist($pid,$qty) { 
$m=$_SESSION['basket']; 
$max=count($m); 
for($i=0;$i<$max;$i++){ 
if($pid==$_SESSION['basket'][$i]['productid']){ 
$_SESSION['basket'][$i]['qty']=$qty; 
return true;break;} 
} 
return false;} 

function delete($pid){ 
$m=$_SESSION['basket']; 
$max=count($m); 
for($i=0;$i<$max;$i++){ 
if($pid==$_SESSION['basket'][$i]['productid']){ 
unset($_SESSION['basket'][$i]); 
$_SESSION['basket']=array_values($_SESSION['basket']); 
$_SESSION['basket'.'num']-=1;echo 'The product was successfully delete'; 
break;} 
} 
} 


function modify($pid,$qty){ 
$m=$_SESSION['basket']; 
$max=count($m); 
if($qty>0){ 
for($i=0;$i<$max;$i++){ 
if($pid==$_SESSION['basket'][$i]['productid']){ 
$_SESSION['basket'][$i]['qty']=$qty;break;} 
} 
} 
else $this->delete($pid); 


} 

function show_basket() { 

$max=count($_SESSION['basket']); 
for($i=0;$i<$max;$i++){ 
echo 'id=>'.$_SESSION['basket'][$i]['productid'].'qty=>'.$_SESSION['basket'][$i]['qty']; 
} 
} 

} 
+0

我會看看這個,看起來很乾淨 – pocockn