Inkrementieren Sie den Wert in der MySQL-Aktualisierungsabfrage

138

Ich habe diesen Code für die Ausgabe von +1 Punkt erstellt, aber er funktioniert nicht richtig.

mysql_query("
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."'
");

Die Variable $ points ist momentan die Punktzahl des Benutzers. Ich möchte, dass sie plus eins dazu kommt. Wenn er also beispielsweise 5 Punkte hat, sollte sie 5 + 1 = 6 sein. Aber das tut es nicht, es ändert sich nur bis 1

Was habe ich falsch gemacht? Danke

Karem
quelle
2
Ich hatte ein ähnliches Problem und stellte dann fest, dass der Standardtyp des Feldes 'NULL' war, änderte es auf 0 und alles war in Ordnung.
Azmeer

Antworten:

322

Sie können dies auch einfach tun:

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");
Tomas Markauskas
quelle
59
@Steve Ihr Kommentar mag für jemanden, der weiß, was PDO ist, klug klingen, aber für mich, der gerade in PHP / MySQL eintaucht, scheint er nicht wirklich viel Licht in die Sache zu bringen. Macht PDO diesen Code kleiner oder eleganter? Wenn ja, bearbeiten Sie bitte die Antwort oder posten Sie eine eigene, in der Sie zeigen, wie es mit PDO besser ist. Vielen Dank.
Camilo Martin
5
@CamiloMartin Ich war auch neugierig. Ich fand dieses hilfreiche net.tutsplus.com/tutorials/php/…
PJ Brunet
11
@CamiloMartin Die Seite mit den php.net-Handbüchern für mysql_query enthält den folgenden Hinweis: Diese Erweiterung ist ab PHP 5.5.0 veraltet und wird in Zukunft entfernt. Stattdessen sollte die Erweiterung MySQLi oder PDO_MySQL verwendet werden. Weitere Informationen finden Sie unter MySQL: Auswahl eines API- Handbuchs und zugehöriger FAQ .
Aland
9
Das Verketten von Benutzerdaten, wie in einer SQL-Abfrage gezeigt, ist ein großes Risiko für die SQL-Injektion.
Trognanders
1
@ Bigp: Ich habe es versucht UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)und es hat nicht funktioniert. Was funktionierte war : UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie
23

Sie können dies tun, ohne die tatsächliche Anzahl von Punkten abfragen zu müssen, wodurch Sie Zeit und Ressourcen während der Skriptausführung sparen.

mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'");

Andernfalls haben Sie falsch gemacht, dass Sie die alte Anzahl von Punkten als Zeichenfolge ( points='5'+1) übergeben haben und einer Zeichenfolge keine Zahl hinzufügen können. ;)

Daan
quelle
10

Ich hoffe, ich werde bei meinem ersten Beitrag nicht offtopic, aber ich möchte das Casting von Integer zu String ein wenig erweitern, da einige Befragte es falsch zu verstehen scheinen.

Da der Ausdruck in dieser Abfrage einen arithmetischen Operator (das Pluszeichen +) verwendet, konvertiert MySQL alle Zeichenfolgen im Ausdruck in Zahlen.

Um dies zu demonstrieren, wird Folgendes zu Ergebnis 6 führen:

SELECT ' 05.05 '+'.95';

Die Verkettung von Zeichenfolgen in MySQL erfordert die Funktion CONCAT (), sodass hier keine Mehrdeutigkeit besteht und MySQL die Zeichenfolgen in Gleitkommazahlen konvertiert und addiert.

Ich denke tatsächlich, dass der Grund, warum die anfängliche Abfrage nicht funktioniert hat, höchstwahrscheinlich darin besteht, dass die Variable $ points tatsächlich nicht auf die aktuellen Punkte des Benutzers festgelegt wurde. Es wurde entweder auf Null gesetzt oder nicht gesetzt: MySQL setzt eine leere Zeichenfolge auf Null. Zur Veranschaulichung gibt Folgendes 0 zurück:

SELECT ABS('');

Wie gesagt, ich hoffe, dass ich nicht zu weit vom Thema entfernt bin. Ich stimme zu, dass Daan und Tomas die besten Lösungen für dieses spezielle Problem haben.

user272563
quelle
+1 compton sehr gute Punkte, Sie haben Recht mit der Besetzung arbeiten, ob es Zitate gibt oder nicht. Willkommen bei SO!
Pekka
7
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
Mark Byers
quelle
1
Was ist, wenn ich Variable anstelle von Wert = 1 verwendet habe? soll ich es so machen "points = points + $ variable"? oder "points = points + '$ variable'"
Ivo San
7

Verwenden Sie auch, um die Zeichenfolge beim Aktualisieren zu "erhöhen" CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
Bushkonst
quelle
3

Wer muss Zeichenfolge und Zahlen aktualisieren SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

Rodolfo Souza
quelle
2

Sie sollten PDO verwenden, um das SQL-Injection-Risiko zu verhindern.

Sie können wie folgt eine Verbindung zur Datenbank herstellen:

try {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=xxxx;dbname=xxxx', 'user', 'password', $pdo_options);
    $bdd->query('SET NAMES "utf8"');
} catch (PDOException $e) {
    exit('Error');
}

Sie müssen die Datenbank nicht abfragen, um die Anzahl der Punkte zu ermitteln. Sie können direkt in der Update-Abfrage ( points = points + 1) erhöhen .

(Hinweis: Es ist auch keine gute Idee, den Wert mit PHP zu erhöhen, da Sie zuerst die Daten auswählen müssen und der Wert geändert werden kann, wenn andere Benutzer ihn aktualisieren.)

$req = $bdd->prepare('UPDATE member_profile SET 
            points = points + 1
            WHERE user_id = :user_id');

$req->execute(array(
    'user_id' => $userid
));
Sébastien Gicquel
quelle
1

Entfernen Sie die 'um point:

mysql_query("UPDATE member_profile SET points=".$points."+1 WHERE user_id = '".$userid."'");

Sie "gießen" einen ganzzahligen Wert in eine Zeichenfolge in Ihrer ursprünglichen Abfrage ...

Amirshk
quelle
-2

Warum lässt du PHP nicht den Job machen?

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"
Petr Peller
quelle
7
Guter Punkt, aber seien Sie in einer gleichzeitigen Umgebung vorsichtig, da sich der DB-Wert in der Zwischenzeit möglicherweise geändert hat.
Vincent Nikkelen
1
Danke @VincentNikkelen, du hast den Nagel auf den Kopf getroffen. Parallelität!
Jimmy Ilenloa
1
Wenn Sie diese Methode verwenden, sollten Sie zuerst die Daten AUSWÄHLEN, was einen zusätzlichen Zugriff auf die Zeile bedeutet. Dies ist nicht der richtige Weg, wenn Sie nur den Wert aktualisieren müssen.
Andres SK