2016-07-01 54 views
0
<tr align="center"> 
    <td> 
     <input type="checkbox" name="remove[]" value="<?php echo $pro_id;?>">//removes checked items 
    </td> 
    <td> 
     <img src="admin_area/product_images/<?php echo $product_image?>" width="60" height="60"/><br>//displays products image 
     <?php echo $product_title ?>//displays products title 
    </td> 
    <td> 
     <input type="text" size="4" name="qty" value="<?php echo $_SESSION["qty"]; ?>"><span style="color:red">Required</span> 
    </td>//textbox where user enters the new quantity 
    <input type="hidden" name="pro_id" value="<?php echo $pro_id; ?>"> 
</td> 
<?php 
$sql = "select * from cart"; 
$run_query = mysqli_query($con,$sql); 
while ($row = mysqli_fetch_array($run_query)) { 
    $_SESSION["qty"] = $row['qty']; 
} 

if (isset($_POST['update_cart'])) { 
    $ip = getIp(); 
    $Updateqty = $_POST['qty']; 
    //get quantity from the text boxes which are repeated with every product 

    $pro_id = $_POST['pro_id']; 
    //gets the id from the hidden field 

    $update_qty = "UPDATE cart SET qty='$Updateqty' where p_id='$pro_id' and ip_add='$ip'"; 
    $run_qty = mysqli_query($con, $update_qty); 

    if ($run_qty) { 
     echo"<script>window.open('cart.php','_self')</script>"; 
    } 
} 
?> 
</tr> 
+1

你的代碼沒有出現任何問題。你確定'$ pro_id'和'$ ip'設置正確嗎? –

+2

[Little Bobby](http://bobby-tables.com/)說*** [你的腳本存在SQL注入攻擊風險。](http://stackoverflow.com/questions/60174/how-can- ***)瞭解[MySQLi](http://php.net/manual)[準備](http://en.wikipedia.org/wiki/Prepared_statement)聲明/en/mysqli.quickstart.prepared-statements.php)。即使[轉義字符串](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)是不安全的! –

+0

你必須在使用會話的所有頁面的頂部有'session_start();'是否到位? –

回答

1

有這裏有一個問題:

$sql = "select * from cart"; 
$run_query = mysqli_query($con,$sql); 
while ($row = mysqli_fetch_array($run_query)) { 
    $_SESSION["qty"] = $row['qty']; 
} 

這個while循環將覆蓋$_SESSION["qty"]每次迭代,所以它總是會設置爲購物車中最後一個物品的數量。

然後,該會話值用於顯示每個項目。

<input type="text" size="4" name="qty" value="<?php echo $_SESSION["qty"]; ?>"><span style="color:red">Required</span> 

另外,如果你曾表示你的問題是從具有多個行的表中的一行,並在其中一個包裹的形式對整個表,每個輸入將被提交,既然你有多個值爲qtypro_id,只有最後一個會被使用。這就是讓每個數量都得到更新的外觀。


我會建議這樣的方法來使它工作。這可能不適合你的,是的,因爲我猜對一些名字,但應該足以說明我的心裏有:

<?php 

if (isset($_POST['update_cart'])) { 
    $ip = getIp(); 

    // prepare an update statement 
    $sql = "UPDATE cart SET qty=? where p_id=? and ip_add=?"; 
    $stmt = mysqli_prepare($con, $sql); 

    // loop over each quantity and update 
    foreach ($_POST['qty'] as $pro_id => $qty) { 
     $stmt->bind_param("iis", $qty, $pro_id, $ip); 
     $stmt->execute(); 
    } 
} 

$sql = "select * from cart"; 
$run_query = mysqli_query($con,$sql); 
while ($row = mysqli_fetch_array($run_query)) { 
    // update the session with the new values 
    $_SESSION[$row['p_id']]['qty'] = $row['qty']; 
} 

?> 

應該針對每個項目的更新量,但是這取決於由表單提供的qty值的數組。爲了達到這個目的,你需要使用這樣的數組語法來命名你的輸入:

<form action="" method="post"> 
    <table> 
     <?php foreach ($products as $product): ?> 
     <tr> 
      <td>Other product info</td> 
      <td> 
       <input type="text" 
        name="qty[<?php echo $product['id'] ?>]" 
        value="<?php echo $_SESSION[$product['id']]['qty']; ?>"> 
      </td> 
     </tr>    
     <?php endforeach ?> 
    </table> 
    <input type="submit" name="update_cart" value="Update Cart"> 
</form> 
+0

UPDATE查詢不在while循環中,OP在UPDATE中使用不同的變量:' $ Updateqty = $ _ POST ['qty'];'但* * *我確實看到邏輯被搞亂了。 –

+0

@JayBlanchard問題代碼中沒有任何形式,這意味着有一種形式將他們展示的tr的多個實例包裝起來。所以我認爲它看起來像'qty'和'pro_id'有很多不同的實例,並且它們總是會得到最後一個。 –

+0

哦,我剛剛注意到,關閉tr是在PHP代碼之後,所以它可能會重複。 –

相關問題