2016-07-16 9 views
0

PHP/MySQLiPHP/MySQLi nicht richtig aktualisiert

$query = $conn->query(
     "SELECT 
     cart.cart_id, 
     cart.user_ip, 
     cart.cart_amount, 
     cart.fk_product_id, 
     products.product_id, 
     products.prod_amount 
    FROM 
     cart 
    INNER JOIN 
     products 
    ON 
     cart.fk_product_id = products.product_id 
    WHERE 
     fk_product_id = '{$productID}' AND user_ip = '{$ip}' 
    "); 

    $item = $query->fetch_assoc(): 

    $FKproductID = $item['fk_product_id']; 
    $FKproductID = iSQLsecure($objConnection, $FKproductID); 
    $FKproductID = trim($FKproductID); 

    $CartAmount = $item['cart_amount']; 
    $CartAmount = iSQLsecure($objConnection, $CartAmount); 
    $CartAmount = trim($CartAmount); 

    $ProductAmount = $item['prod_amount']; 
    $ProductAmount = iSQLsecure($objConnection, $ProductAmount); 
    $ProductAmount = trim($ProductAmount); 

    $one = 1; 

    $add_amount = $CartAmount + $one; 
    $remove_amount = $ProductAmount - $one; 

    if($FKproductID == $productsID) { 
     $update_cart_item = $objConnection->query("UPDATE cart SET cart_amount = '{$add_amount}' WHERE fk_product_id = '{$productID}' AND user_ip = '{$ip}'"); 
     $update_product_amount = $objConnection->query("UPDATE products SET prod_amount = '{$remove_amount}' WHERE product_id = '{$productID}'"); 
    } else { 
     $add_item = $objConnection->query("INSERT INTO cart (user_ip, add_amount, fk_product_id) VALUES ('{$ip}', '{$add_amount}', '{$productID}')"); 
     $update_product_amount = $objConnection->query("UPDATE products SET prod_amount = '{$remove_amount}' WHERE product_id = '{$productID}'"); 
    } 

    $objConnection->close(); 

Mein Problem

$update_product_amount = $objConnection->query("UPDATE products SET prod_amount = '{$remove_ProductAmount}' WHERE product_id = '{$productID}'"); 

Ich benutze diese beiden Orte if($FKproductID == $productsID) { /*HERE1*/ } else { /*AND HERE2*/}

Aus irgendeinem Grund funktioniert es in "HERE1" aber nicht in "HERE2 "?

Wenn Artikel ist nicht in Warenkorb

Es wird sie in meine „Karre“ Datenbank einfügen und aktualisieren „Produkte“ Betragswert. Es soll von der aktuellen Produktmenge entfernen (10 wird 9). Stattdessen wird 10 zu -1.

Wenn Artikel im Warenkorb ist

Es aktualisiert perfekt und dreht sich 10 in 9. Der Code ist genau das gleiche, aber gibt zwei unterschiedliche Ergebnisse?

Antwort

0

Ich nehme an, der obige Code ist nicht abgeschlossen, da einige Variable Name ist inkonsistent ($remove_amount vs $remove_ProductAmount) und doch Ihr Code läuft in Ordnung auf einigen Fall.

Für die Abfragen, warum subtrahieren Sie nicht nur den Betrag bei der Aktualisierungsabfrage? So etwas wie

UPDATE table SET field = field - 1 WHERE x = y 

Auch wenn die Zahl 1 dynamisch ist, ist es sicherer, die Anzahl an Variablen dann werfen zu erzeugen, um integer. Im schlimmsten Fall würde es auf Null konvertiert werden (was einfach auf Ihre if() als zusätzliche Validierung hinzugefügt werden kann).

Ich empfehle auch, Debugger zu verwenden. Etwas wie Kint oder PsySH würde ausreichen, wenn Sie sich nicht mit der Einrichtung von XDebug befassen möchten.

+0

Ich habe vergessen, '$ remove_ProductAmount' in' $ remove_amount' zu ändern – Simon

0

Ich denke, das Problem kann mit Ihrem INNER JOIN sein. Von dem, was ich sagen kann, wenn der Artikel nicht in Ihrem Warenkorb ist, wird die cart.fk_product_id nicht vorhanden sein, und daher wird die Abfrage ein leeres Objekt zurückgeben.

Wenn die Fehleranzeige ausgeschaltet ist (wahrscheinlich in php.ini mit display_errors = Off), werden nicht vorhandene Array-Schlüssel während der Gleichungen als null behandelt.

Wenn es Zeit wird, die Gleichungen zu tun, wird PHP null zu integer(0) konvertieren, was 0 - 1 = -1 ergibt, wenn es die If-Anweisung fehlschlägt.

Haben Sie versucht, das zurückgegebene Objekt der Abfrage auszugeben? Sie können dies tun, indem Sie:

echo "<pre>"; print_r($item); echo "</pre>"; 

(die <pre> Tag macht es ein bisschen besser lesbar).

Überprüfen Sie auch den Status Ihrer httpd/Apache Fehlerprotokoll, wenn Sie log_errors eingeschaltet haben.

Verwandte Themen