Tommy: MySQL Einträge mit Formular löschen

Hi,

ich möchte über ein Dropdownmenü den jeweils ausgewählten Begriff in der Datenbank löschen.

Wenn ich das ganze über die ID mache klappt es, also z.B. so

Formular: <input type="text" name="del_id" maxlength="3">

PHP:

$loeschen = "DELETE FROM namen WHERE id = $del_id";
$loesch = mysql_query($loeschen);

Aber wenn ich nicht die ID sondern einen Namen angebe, klappt es nicht, also z.B. so:

Formular: <input type="text" name="del_name" maxlength="3">

PHP:

$loeschen = "DELETE FROM namen WHERE nachname = $del_name";
$loesch = mysql_query($loeschen);

Kann ich die Daten nur über die ID löschen? Das wäre dämlich, da ich ja über den Namen direkt sehe welchen Namen ich lösche, bei der ID wird das ja mehr oder weniger ein Blindflug (zumindest muss ich immer erst schauen, welche ID der gewünschte Name hat).

  1. Ich würde mir das Dropdownmenü halt immer aus der Datenbank erzeugen lassen, so in etwa:

    <form action="loeschen.php" method="POST">  
    <select name="nachname">  
    <?php  
      
      # gibt DB-Inhalt aus:  
      $abfrage = "SELECT nachname FROM name";  
      $ergebnis = mysql_query($abfrage);  
      while($row = mysql_fetch_object($ergebnis))  
        {  
        echo "<option>";  
        echo $row->nachname;  
        echo "</option>";  
        }  
    ?>  
      
    </select>  
    <br><br>  
    <input type="submit" value="L&ouml;schen">  
    </form>  
    
    

    Und da würde ich halt bei der ID nur die Zahl sehen und wüsste erstmal nicht, welcher Name das nun ist.

  2. echo $begrüßung;

    $loeschen = "DELETE FROM namen WHERE nachname = $del_name";

    Zur Notation von String-Werten in SQL-Befehlen gelten etwas andere Regeln als bei numerischen Werten. Siehe Language Structure -> Literal Values -> Strings

    $loesch = mysql_query($loeschen);

    Die MySQL-Funktionen in PHP geben im Fehlerfall im Allgemeinen false zurück. Der dazugehörige Fehlermeldungstext kann über mysql_error() abgefragt werden. Du solltest diesen Programzustand nicht ignorieren.

    echo "$verabschiedung $name";

    1. Zur Notation von String-Werten in SQL-Befehlen gelten etwas andere Regeln als bei numerischen Werten. Siehe Language Structure -> Literal Values -> Strings

      Wunderbar, mit '$del_name' klappts also. Danke!

      Die MySQL-Funktionen in PHP geben im Fehlerfall im Allgemeinen false zurück..

      Einen Fehler hab ich aber gar nicht bekommen?

      1. echo $begrüßung;

        Zur Notation von String-Werten in SQL-Befehlen gelten etwas andere Regeln als bei numerischen Werten. Siehe Language Structure -> Literal Values -> Strings

        Wunderbar, mit '$del_name' klappts also. Danke!

        Nun ist aber noch der harmlose Fall zu beachten, wenn im Namen auch ein ' vorkommt. In dem Fall wäre an diesem Zeichen der Stringwert zu Ende. Der Rest führt im günstigen Fall zu einem ungültigen SQL-Statement. Im ungünstigen Fall wird damit der Befehl so manipuliert, dass er etwas anderes ausführt als vorgesehen. Man spricht dabei von SQL-Injection. Um das zu verhindern müssen die ' in Strings entschärft werden. Das nennt man Maskieren oder im Englischen auch "to escape". Es gibt die PHP-Funktion mysql_real_escape_string(), die dafür sorgt, dass ' und noch eine Reihe anderer ebenfalls kritischer Zeichen maskiert werden. Diese müsstest du auf alle Werte anwenden, die in SQL-Befehle eingebaut werden sollen.

        Außerdem ist zu beachten, dass es ein PHP-Feature namens Magic Quotes gibt, welches ebenfalls diese Aufgabe erfüllen soll, aber im Hinblick auf MySQL zu wenig Zeichen berücksichtigt. Sollte dieses Feature eingeschaltet sein, muss es nun ausgeschaltet werden oder dessen Auswirkungen rückgängig gemacht werden, da es sonst zusammen mit mysql_real_escape_string() zu einer doppelten Maskierung kommt. Siehe Disabling Magic Quotes

        Die MySQL-Funktionen in PHP geben im Fehlerfall im Allgemeinen false zurück..
        Einen Fehler hab ich aber gar nicht bekommen?

        MySQL-Fehler werden im Gegensatz zu PHP-Fehlern nicht sofort ausgegeben. Stattdessen wird der Fehlerzustand über den Rückgabewert der mysql_*-Funktion gemeldet. Du musst also prüfen, ob das Ergebnis false ist und dann mysql_error() nach dem Meldungstext befragen.

        echo "$verabschiedung $name";

        1. Nun ist aber noch der harmlose Fall zu beachten, wenn im Namen auch ein ' vorkommt. In dem Fall wäre an diesem Zeichen der Stringwert zu Ende.

          In der Tat, bei Namen mit ' passiert gar nichts - werden also nicht gelöscht. Mit diesem mysql_real_escape_string() klappt das auch.

          Magic Quotes sind bei mir ausgeschaltet.

          Ich hoffe es kommt nicht noch mehr dazu, ich wollt doch nur ein kleines Script für mich basteln :) (wobei ich natürlich einsehe, dass man sowas immer brauchen kann, v.a. wenn andere Zugriff auf ein Script haben).