PHP Query ausgeben?

... komplette Frage anzeigen

2 Antworten

Wie triopasi schon erwähnt hat, fehlt ein Semikolon.

Außerdem ist dein Code extrem anfällig für SQL-Injection, da du einen vom User eingegebenen Wert direkt in ein SQL-Statement einbaust. Das Problem ist, der Nutzer könnte statt einer Zahl einen gültigen SQL-Teilbefehl eintippen, durch den die gesamte SQL-Anweisung manipuliert werden kann.

Beispiel für deinen Fall:

"SELECT titel, text FROM aufgaben WHERE aufgabennummer = $num"

Angenommen der Nutzer gibt jetzt ein: "123 OR 1=1"

Dann lautet das vollständige Statement:

"SELECT titel, text FROM aufgaben WHERE aufgabennummer = 123 OR 1=1"

Und zack! Es wird jede Zeile aus aufgaben zurückgegeben, weil 1=1 immer wahr ist.

Oder noch schlimmer:

"SELECT titel, text FROM aufgaben WHERE aufgabennummer = 123; DROP TABLE aufgaben;"

Und wieder zack! Die Tabelle wird sogar gelöscht.


Früher hat man das ganze durch sogenanntes Escapen gelöst. Heute gibt es eine noch bequemere Alternative: Die Prepared Statements.

Dabei wird an die Datenbank zunächst ein Statement mit Platzhaltern gesendet:

"SELECT titel, text FROM aufgaben WHERE aufgabennummer = ?"

oder mit benannten Platzhaltern:

"SELECT titel, text FROM aufgaben WHERE aufgabennummer = :num"

Anschließend werden in einem zweiten Request die eigentlichen Daten übersendet. Dies verhindert, dass das eigentliche Statement manipuliert werden kann, weil die Datenbank genau weiß, dass es sich um eine Variable handelt.
PDO emuliert Prepared Statements sogar für nicht unterstützte Treiber.


Hier findest du weitere Informationen dazu:

http://php.net/manual/de/pdo.prepared-statements.php


Deinen Code habe ich dementsprechend angepasst:

https://hastebin.com/aneyajeneg.xml


Aber dieser Code wird nicht funktionieren, weil du nach der Aufgabennummer fragst, von der Datenbank aber Titel und Text abfragst. Was genau willst du also mit dieser SQL-Abfrage bezwecken?

Die Aufgabennummer kannst du ja einfach mit

echo $num;

ausgeben. Dann brauchst aber keine SQL-Abfrage dafür. Oder willst du danach noch weiteren Code in die Schleife einfügen?

Antwort bewerten Vielen Dank für Deine Bewertung

Strichpunkt fehlt.

Code in Zukunft bitte auf pastebin posten, nicht hier. Danke.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?