2016-07-01 5 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

Es scheint nichts mit Ihrem Code falsch zu sein. Sind Sie sicher, dass '$ pro_id' und' $ ip' richtig eingestellt sind? –

+2

[Little Bobby] (http://bobby-tables.com/) sagt *** [Ihr Skript ist für SQL Injection Attacks gefährdet.] (Http://stackoverflow.com/questions/60174/how-can- i-prevent-sql-injection-in-php *** Erfahren Sie mehr über [vorbereitete] (http://en.wikipedia.org/wiki/Prepared_statement) Anweisungen für [MySQLi] (http://php.net/manual /mysqli.quickstart.prepared-statements.php). Sogar [die Zeichenfolge zu entkommen] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) ist nicht sicher! –

+0

Sie müssen 'session_start();' am Anfang aller Seiten mit Sitzungen, ist es an Ort und Stelle? –

Antwort

1

Es gibt ein Problem hier:

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

Diese while-Schleife $_SESSION["qty"] mit jeder Iteration überschrieben werden, so dass es immer sein wird, Stellen Sie die Menge des letzten Artikels im Warenkorb ein.

Dann wird dieser Sitzungswert für jedes Element in der Anzeige verwendet.

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

Auch wenn das, was Sie in Ihrer Frage gezeigt haben eine Zeile aus einer Tabelle ist, die mehrere Zeilen hat, und Sie haben die gesamte Tabelle in eine Form eingewickelt, wird jeder Eingang abgegeben werden, und da Sie Mehrere Werte für qty und pro_id, nur die letzte wird verwendet. Das sieht so aus, als ob jede Menge aktualisiert wird.


Ich würde einen Ansatz wie diesen vorschlagen, um es zum Laufen zu bringen. Dies kann nicht für Sie arbeiten, wie sie ist, weil ich auf einige der Namen erraten, sollte aber genug sein, um zu zeigen, was ich im Sinn haben:

<?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']; 
} 

?> 

diese Menge für jeden Artikel aktualisieren sollte, aber es hängt davon ab, Ein Array von qty Werten, die von Ihrem Formular bereitgestellt werden. Um das zu erreichen, müssen Sie Ihre Eingaben mit einer Array-Syntax wie der folgenden benennen:

<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

Die UPDATE-Abfrage ist nicht in der While-Schleife und das OP verwendet eine andere Variable in der UPDATE: ' $ Updateqty = $ _ POST ['qty']; 'Aber * yikes * Ich sehe, wo die Logik versaut ist. –

+0

@JayBlanchard Es gibt kein Formular im Fragecode, was bedeutet, dass es ein Formular gibt, das mehrere Instanzen des tr, die sie gezeigt haben, umschließt. Ich denke, es sieht so aus, als hätten sie viele verschiedene Instanzen von 'qty' und' pro_id' und sie werden immer die letzte bekommen. –

+0

Oh, und mir ist gerade aufgefallen, dass das schließende tr hinter dem PHP-Code steht, also könnte es auch wiederholt werden. –

Verwandte Themen