2017-02-13 2 views
1

Ich habe eine MySQL-Tabelle mit einer Integer-Spalte namens count, die ich versuche, einige Grundrechenarten zu tun und dann den Wert zu aktualisieren. Hier ist ein Beispiel für eine solche Aufgabe, die ich versuche.MySQL zu PHP Integer Math

$sql = 'SELECT count FROM triggers WHERE id = ?'; 
$params = array($id); 
$result = sqlsrv_query($connection, $sql, $params); 

$row = sqlsrv_fetch_array($result); 

$count = intval($row[0]); 
if ($count = 0) 
    return -1; 
$newCount = $count - 1; 

$sql = 'UPDATE triggers SET count = ? WHERE id = ?'; 
$params = array($newCount, $id); 
$result = sqlsrv_query($connection, $sql, $params); 

Das Problem, das ich habe, ist, dass $newCount immer gleich -1, so dass der Datenbankwert von count auf -1 aktualisiert. In einem bestimmten Beispiellauf war $count gleich 84, also gab es die if-Anweisung. Aber anstatt $newCount wird auf 83 gesetzt, wird es auf -1 gesetzt.

Ich habe das Gefühl, das hat etwas damit zu tun, dass der MySQL-Wert als String behandelt wird statt als Integer, aber ich dachte, intval() würde das lösen. Ich versuchte auch (int) stattdessen, aber keinen Unterschied.

+0

'echo $ count' vor if-Anweisung und prüfen sie seinen Wert – affaz

+2

es ist möglich, dass Zählung ein reserviertes Wort ist, und muss Backticks in Ihrer Abfrage (dies macht es fehlschlagen und sein„falsch“, die auf 0 gegossen wird , dann wird 1 davon subtrahiert). Außerdem würde ich empfehlen, dass Sie versuchen, den Wert direkt in der Abfrage zu aktualisieren. Beispiel: http://stackoverflow.com/questions/16277339/decrement-value-in-mysql-but-not-negative –

Antwort

5

Ihr Problem ist if ($count = 0). In PHP ist = der Zuweisungsoperator und == ist der Gleichheitsvergleichsoperator.

tl; dr: Sie meinten if ($count == 0).

(Oder if $count === 0. Obwohl seit $count garantiert eine ganze Zahl, hier zu sein, wird es nicht wirklich in diesem Fall egal. Mit === und nur explizit == mit dem Sie beabsichtigen Art Hantieren aufrufen kann auch eine gut sein Gewohnheit, in zu kommen.)

Erklärung: Lassen Sie uns durch Ihren Code treten. Was passiert hier:

  1. $count = intval($row[0]); Sätze $count zu einem beliebigen Wert aus der Datenbank.
  2. if ($count = 0) weist $count den Wert 0 zu, unabhängig von etwas anderem. Es testet dann diesen Wert von 0, falsey, wodurch der If-Anweisungsblock übersprungen wird und return -1 nie ausgeführt wird. Das ist das Gleiche, als wenn Sie direkt if (0) schreiben würden.
  3. $newCount einen Wert von $count - 1 oder -1 in allen Fällen seit $count zugewiesen wird immer 0.
  4. Die Abfrage wird dann ausgeführt, UPDATE ing die Zeile mit, kein anderer als unser Freund -1.
1

Die Linie

if ($count = 0) 

sollte

if ($count === 0) 

Dieser lesen ist, weil Sie den Wert zuweisen, anstatt einen Vergleichsoperator verwenden. Hier ist ein paar nützliche Hinweise zu Operatoren in PHP http://www.w3schools.com/php/php_operators.asp Hoffe, dass hilft!

+1

Um nur den Unterschied zwischen den beiden Operatoren in den obigen Antworten zu erwähnen, == wird True nach Typ zurückgegeben jonglieren (string, int, double, bool etc .. Werte) while === gibt nur dann true zurück, wenn sie vom selben Typ sind (in diesem Fall integer). – Inkdot

1

Ihr Fehler wird durch Ic in Ihrer Antwortliste gut definiert.

Ich denke, Ihr Code ist ein bisschen länger eins, es kann mit kürzerer Form mit in einer Abfrage anstelle von zwei Abfragen statt - zuerst auswählen und erhalten Zählwert und aktualisieren Sie es, können Sie dies durch einzelne Abfrage wie unten erreichen -

UPDATE triggers 
    // if is like ternary operator condition, true value , false value 
    SET count = IF(count > 0, count - 1, count) 
WHERE id = ?