Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>MySQL UPDATE mit IF

MySQL UPDATE mit IF

schmidl16.11.0915:29
Hallo an die Leute die Ahnung von dem Thema haben (und an die anderen die nur schnüffeln ).

Ich habe mich gerade mal wieder an MySQL versucht.
UPDATE partners SET accepted = IF(accepted = 0, accepted = 1,accepted = 0) WHERE ID = '{$_POST['uid']}'

Das ist der code.
Was ich haben möchte ist:
Wenn man auf einen Button drückt soll sich der Wert in der Datenbank ändern und zwar von 0 zu 1.

Also ist der Wert in der Datenbank 1 dann wird er zu 0. (das funktioniert auch komischerweise)
Jetzt klickt man aber nochmal so wird wieder anstatt 0 eine 1 eingetragen. (Und das funktioniert nicht)

Kann mir wer verraten wo hier der Fehler liegt?

Danke.
-schmidl
„ich auch nicht.“
0

Kommentare

GeWoldi16.11.0915:51
UPDATE partners SET accepted = IF(accepted = 0, 1,0) WHERE ID = '{$_POST['uid']}'
Nur mal aus der Hüfte geschossen, aber vielleicht klappts
0
ts
ts16.11.0916:04
Ich verstehe nicht so ganz..

Du willst, dass der Wert immer zu 0 wird? Das macht dein query, obwohl eigentlich nicht unbedingt korrekt geschrieben.

Du willst, dass sich der Wert immer ändert (also wenn accept = 0, dann ändere accept zu 1 und wenn accept = 1, dann ändere accept zu 0)?
Das würde z.B. UPDATE partners SET accepted = IF(accepted = 0, 1, 0) WHERE ID = '1' machen.

Übrigens: Pass bloß auf mit Praktiken wie '{$_POST['uid']}' mitten in der Query. Das ist sehr gefährlich. Immer auf einen gültigen Wertebereich prüfen und integer bei PHP z.B. folgendermaßen behandeln: $variable = (int) $_POST['uid']; $query = '...'; $query .= mysql_real_escape_string($variable); $query .= '...';
0
schmidl16.11.0916:14
Danke ihr beiden,

so funktioniert das.
Und nein, ich wollte nicht dass der Wert immer zu 0 wird, das wäre wohl auch einfacher hinzubekommen.

Ich wollte genau das erreichen was es jetzt macht.

lg
-schmidl
„ich auch nicht.“
0
schmidl17.11.0914:59
ts
Übrigens: Pass bloß auf mit Praktiken wie '{$_POST['uid']}' mitten in der Query. Das ist sehr gefährlich. Immer auf einen gültigen Wertebereich prüfen und integer bei PHP z.B. folgendermaßen behandeln: $variable = (int) $_POST['uid']; $query = '...'; $query .= mysql_real_escape_string($variable); $query .= '...';

Meinst du damit, dass keiner irgendeinen Schadcode einschleusen kann?

Aber wie prüfe ich jetzt auf einen „gültigen Wertebereich“?
Das kann ich nur dann machen wenn ich weiß, dass da jetzt eine Zahl oder ein Name reinkommt oder?

in diesem Fall hier müsste ich prüfen ob da auch wirklich nur Zahlen verwendet werden und wenn ja, dann darf er weitermachen.

Hab ich dich hier richtig verstanden?
„ich auch nicht.“
0
GeWoldi17.11.0915:10
prüfe so eng wie möglich. Wenn Du eine positive zahl zwischen 1 und 1000 erwartest, dann prüfe genau das. Überleg dir mal, wenn in deinem Code die per Post übergebne Variable den Inhalt
'; DELETE FROM partners WHERE '1

Und wenn Du Dich jetzt fragst, woher ich weiss, wie deine Tabelle heisst: Ich kriegs raus wenns sein muss...
0
schmidl17.11.0917:27
Das macht alles Sinn.
Danke für die Tipps.

In Zukunft achte ich auf sowas,
ich hab mir bisher eigentlich nie Gedanken darüber gemacht.
„ich auch nicht.“
0
micheee17.11.0917:35
Hi schmidl,
ist nur noch ein kosmetischer Tipp für obige Abfrage:
UPDATE partners SET accepted = !accepted
funktioniert sobald deine Spalte vom Typ boolean (intern ein tinyint(1)) ist.

Mehr dazu hier:
BOOL, BOOLEAN

These types are synonyms for TINYINT(1). A value of zero is considered false. Nonzero values are considered true:
Mysql Manual Numeric Types Overview
0
ts
ts17.11.0920:24
GeWoldi
Nun, das Beispiel wird so wohl eher nicht klappen, siehe auch , aber prinzipiell kann man doch so einiges einsetzen, das nicht unbedingt im Sinne des Autors war.


schmidl
Prinzipiell musst Du schon beim Programmieren genau wissen, was für einen Datentyp der Wert hat. Zusätzlich unbedingt immer Funktionen wie z.B. mysql_real_escape_string() aus dem PHP-Beispiel verwenden.

Beim Datentyp String weiß man ja nicht unbedingt, was der genaue Inhalt ist und dort können prinzipiell bei jeder Eingabe eines Nutzers irgendwelche Versuche unternommen worden sein um „schadhafte Anweisungen” unterzubringen.

Übrigens ist nicht nur beim SQL-Anweisungen Aufmerksamkeit unbedingt gefordert, auch die Ausgabe von Werten kann sehr problematisch sein. Automatisierte Skripte, die Nachrichten von Benutzern lesen, Zugangsdaten ändern usw. sind prinzipiell möglich.

Zur Ausgabe empfehle ich z.B. die htmlentities()-Funktion aus PHP, eventuell in Kombination mit bbcode-Mechanismen zur Formatierung. Aber Achtung: In vielen bbcode-Implementierungen sind Sicherheitslücken bezüglich Verknüpfungen vorhanden. Der Grund sind ist relativ einfach: Mangelnde Prüfung auf gültige Wertebereiche und so kann dann ein Skript dort eventuell landen.
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.