Erhöhen Sie den Wert in der MySQL-Aktualisierungsabfrage
Lesezeit: 3 Minuten
Karem
Ich habe diesen Code erstellt, um +1 Punkt zu vergeben, aber er funktioniert nicht richtig.
mysql_query("
UPDATE member_profile
SET points=" ".$points." " + 1
WHERE user_id = '".$userid."'
");
Der $points Variable sind die Punkte des Benutzers im Moment. Ich möchte, dass es eins hinzufügt. Wenn er also beispielsweise 5 Punkte hätte, sollte es 5 + 1 = 6 sein, aber das tut es nicht, es ändert sich nur zu 1.
Was habe ich falsch gemacht?
Ich hatte ein ähnliches Problem und erkannte dann, dass der Standardtyp des Felds „NULL“ war, änderte es in 0 und alles war gut.
– Azmeer
1. Februar 17 um 8:58 Uhr
Thomas Markauskas
Du könntest auch einfach so vorgehen:
mysql_query("
UPDATE member_profile
SET points = points + 1
WHERE user_id = '".$userid."'
");
@Steve Ihr Kommentar mag für jemanden schlau klingen, der weiß, was PDO ist, aber für mich, der gerade in PHP/MySQL eintaucht, bringt er nicht wirklich viel Licht in die Sache. 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. Danke.
@CamiloMartin die php.net-Handbücher Seite für mysql_query hat den folgenden Hinweis: Diese Erweiterung ist seit PHP 5.5.0 veraltet und wird in Zukunft entfernt. Stattdessen die MySQLi oder PDO_MySQL Erweiterung verwendet werden soll. Siehe auch MySQL: Auswahl einer API Führer und zugehörige FAQ für mehr Informationen.
– ein Land
24. März 13 um 21:55 Uhr
Die Verkettung von Benutzerdaten wie gezeigt in einer SQL-Abfrage ist ein großes SQL-Injection-Risiko.
– Trognander
6. November 15 um 1:20 Uhr
Sie könnten eine Bibliothek verwenden oder mysql_real_escape_string() um die Benutzer-ID herum haben, um sich vor Injektionsangriffen oder Codierungsfehlern zu schützen
– tristanbailey
6. Februar 17 um 8:26 Uhr
Sie können dies tun, ohne die tatsächliche Anzahl der Punkte abfragen zu müssen, sodass Sie bei der Skriptausführung Zeit und Ressourcen sparen.
mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'");
Ansonsten haben Sie falsch gemacht, dass Sie die alte Punktzahl als Zeichenfolge übergeben haben (points="5"+1), und Sie können einer Zeichenfolge keine Zahl hinzufügen. 😉
Ich hoffe, ich gehe in meinem ersten Beitrag nicht vom Thema ab, aber ich möchte die Umwandlung von Integer in String ein wenig erläutern, da einige Befragte anscheinend falsch liegen.
Da der Ausdruck in dieser Abfrage einen arithmetischen Operator (das Pluszeichen +) verwendet, konvertiert MySQL alle Zeichenfolgen im Ausdruck in Zahlen.
Zur Veranschaulichung führt Folgendes zum Ergebnis 6:
SELECT ' 05.05 '+'.95';
Die String-Verkettung in MySQL erfordert die Funktion CONCAT(), daher gibt es hier keine Mehrdeutigkeit, und MySQL konvertiert die Strings in Gleitkommazahlen und fügt sie zusammen.
Ich denke tatsächlich, dass der Grund, warum die ursprüngliche Abfrage nicht funktioniert hat, höchstwahrscheinlich darin liegt, dass die Variable $points tatsächlich nicht auf die aktuellen Punkte des Benutzers gesetzt wurde. Es wurde entweder auf null gesetzt oder nicht gesetzt: MySQL wird einen leeren String auf null umwandeln. Zur Veranschaulichung gibt Folgendes 0 zurück:
SELECT ABS('');
Wie gesagt, ich hoffe, ich bin nicht zu off-topic. Ich stimme zu, dass Daan und Tomas die besten Lösungen für dieses spezielle Problem haben.
+1 Compton sehr gute Punkte, Sie haben Recht mit der Besetzung, seien es Anführungszeichen oder nicht. Willkommen bei SO!
– Pekka
13. Februar 10 um 22:52 Uhr
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
Buschkonst
Verwenden Sie auch zum “Inkrementieren” der Zeichenfolge beim Aktualisieren CONCAT
update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
Rodolfo Suza
Wer muss Zeichenfolgen und Zahlen aktualisieren SET @a = 0;
UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);
Syed Waqas Buchary
Die akzeptierte Antwort ist gut, aber Sie arbeiten nicht mit Nullwerten, versuchen Sie dies
mysql_query("
UPDATE member_profile
SET points = IFNULL(points, 0) + 1
WHERE user_id = '".$userid."'
");
Ich hatte ein ähnliches Problem und erkannte dann, dass der Standardtyp des Felds „NULL“ war, änderte es in 0 und alles war gut.
– Azmeer
1. Februar 17 um 8:58 Uhr