Mit PHP daten aus der Datenbank löschen?

...komplette Frage anzeigen

2 Antworten

Du musst nur die einfachen Anführungszeichen um das $num entfernen. Allerdings ist dein Code anfällig für SQL-Injection. Hier eine ähnliche Antowort von mir zu diesem Thema:

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

(https://www.gutefrage.net/frage/php-query-ausgeben?foundIn=list-answers-by-user#answer-253443992)

Bei dir sollte es also im Optimalfall lauten (wenn du mysqli nutzt):

<?php

if (isset($_POST['text'])) {
$num = $_POST['text'];
$stmt = $mysqli->prepare('DELETE FROM aufgaben WHERE aufgabennummer=?');
$stmt->bind_param("d", $num);
$stmt->execute();
}

?>

Oder falls du PDO nutzt:

<?php

if (isset($_POST['text'])) {
$num = $_POST['text'];
$stmt = $pdo->prepare('DELETE FROM aufgaben WHERE aufgabennummer=?');
$stmt->execute(array($num));
}

?>

Jxl0e 12.07.2017, 07:48

Habe PDO verwendet hat alles gut funktioniert. 

0

Hat nicht funktioniert hier der code

    <?php if ( isset ( $_POST [ 'text' ] ) ) {    $num   =   $_POST [ 'text' ] ;    $sql   =   "DELETE FROM aufgaben WHERE aufgabennummer='$num'" ;  } ?>
areaDELme 11.07.2017, 16:03

du musst auch eine verbindung aufbauen und dein statement auf dieser verbindung ausführen!, außerdem konkateniert man in php mit "."

=".$num." 

des weiteren solltest du jeden get und post grundsätzlich escapen bevor du ihn auf deine datenbank loslässt.

0

Was möchtest Du wissen?