Philipp Walter: SQL - Delete function

Hallo liebe Forum Mitglieder,
ich schlage mich jetzt seit einer halben Stunde mit diesem SQL Code rum und finde den Fehler nicht.

Vielleicht kann mir von euch einer helfen?

mysql_query("DELETE FROM tuspgatour WHERE id=".$_GET['nummer'])or die("Fehler in Abfrage.  Fehlercode: ".mysql_errno().": ".mysql_error());

  1. Hallo Philipp,

    ich schlage mich jetzt seit einer halben Stunde mit diesem SQL Code rum und finde den Fehler nicht.

    ja und?
    -Was macht der Code (nicht)?
    -Gibt es eine Fehlermeldung? Wenn ja, welche? Wenn nein, was sagt mysql_affected_rows()[1]?

    mysql_query("DELETE FROM tuspgatour WHERE id=".$_GET['nummer'])or die("Fehler in Abfrage.  Fehlercode: ".mysql_errno().": ".mysql_error());

    -sieht der Query so aus, wie du es erwartet hast (Query in ein Variable schreiben und dann ausgeben)?
    -Ist $_GET['nummer'] überhaupt gesetzt? Wenn ja, was steht da drin?
    -Gibt es die Tabelle "tuspgatour"?
    -Ist überhaupt was zum löschen da?

    Fragen über Fragen... :-)

    Grüße aus Nürnberg
    Tobias

    [1] http://de.php.net/mysql_affected_rows

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
  2. Hallo,

    meistens ist es die Faulheit, die eine bestraft ;-)

    mysql_query("DELETE FROM tuspgatour WHERE id=".$_GET['nummer'])or die("Fehler in Abfrage.  Fehlercode: ".mysql_errno().": ".mysql_error());

    1. alles das, was Tobias Dir auch schon geschrieben hat...
    2. Übernimm nie Werte direkt aus externen Quellen (GRT, POST, COOKIE, ...)
    3. teile auf in mehrere Schritte.

    $id = intval($_GET['nummer']);  ## dadurch ist sichergestellt,
                                    ## dass in $id wirklich nur eine
                                    ##Nummer steht

    $sql = "DELETE FROM tuspgatour WHERE id = $id";
    $ok  = mysql_query($sql, $con):
    if (!$ok)
    {
      ## "die()" ist keine Funktion für fertige Scripte!
      ## Only fpr debug
      die("Fehler in Abfrage. Fehlercode: ".mysql_errno().": ".mysql_error());
    }

    Die C-Faule-Schweine-Syntax ist es immer wieder, die PHP-Programmierer zum Absturz bringt. Das, was man an Tipparbeit bei der Code-Ersterfassung spart, brauchtg man ungefähr 10-100fach, um die Fehler darin zu suchen.

    Gewöhn Dir einen lockeren und ausführlichen Schreibstil an. Das Parsen dauert selten länger, denn die gleichen Funktionen müssen aufgelöst werden.

    Du hattest übrins nur ein Anführungszeichen vergessen, aber das sieht man beim C-Faule-Schweine-Stil ( :-)) ) nicht.

    Grüße

    Tom

    1. Hallo Tom,

      1. Übernimm nie Werte direkt aus externen Quellen (GRT, POST, COOKIE, ...)

      stimmt, das habe ich doch glatt vergessen :-)

      $id = intval($_GET['nummer']);

      ob das so gut ist, weiß ich nicht - wenn der User z.B. "2O4" (ein großes 'o' statt der Null) eingibt wird nicht der Datensatz mit der id 204 gelöscht, sondern der mit der id 2, und das dürfte vermutlich nicht gewünscht sein. Ist $id = mysql_escape_string($_GET['nummer']); nicht vielleicht besser?

      $sql = "DELETE FROM tuspgatour WHERE id = $id";

      $sql = 'DELETE ... WHERE id='.$id ist schneller :-)

      ## "die()" ist keine Funktion für fertige Scripte!

      <frage modus="blöd">Warum?</frage>

      Du hattest übrins nur ein Anführungszeichen vergessen,

      ähh... wo? ich sehe kein fehlendes...

      Grüße aus Nürnberg
      Tobias

      --
      Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
      1. Hallo Tobias,

        $id = intval($_GET['nummer']);
        ob das so gut ist, weiß ich nicht - wenn der User z.B. "2O4" (ein großes 'o' statt der Null) eingibt wird nicht der Datensatz mit der id 204 gelöscht, sondern der mit der id 2, und das dürfte vermutlich nicht gewünscht sein. Ist $id = mysql_escape_string($_GET['nummer']); nicht vielleicht besser?

        Man sollte eigentlich auch keine Mummern direkt eingeben lassen. Bevor der Satz gelöscht wird, sollte er angezeigt werden.

        Ich gehe da noch zwei Schritte weiter. Jeder Satz hat eine eigen ID in der DB. Beim Anbiten zum Löschen wird diese ID in dr Session gespeichert, und Satz-relevante Teile nebst einem index im Session-Array ebenfalls. Wenn die Löschanweisung kommt, wird anhand der zurückgesandten Erkennenungsdaten (Indes aus dem Array, z.B. Nachmane) ermittelt, ob es der richtitge Satz ist. Mit Hilfe der ermittelten ID wird geprüft, ob der User überhaupt Löschrechte hat. Erst dann wird gelöscht.

        Das ganze nennt sich dann bidirektionale Vorgangsbearbeitung.

        Wenn man es erst einmal programmiert hat, funktioniert das immer.

        ## "die()" ist keine Funktion für fertige Scripte!
        <frage modus="blöd">Warum?</frage>

        weil sie keinen Doctype, kein <html>, kein <body> usw. sendet.

        Tom

        1. Hallo Tom,

          Jeder Satz hat eine eigen ID in der DB. Beim Anbiten zum Löschen wird diese ID in dr Session gespeichert, und Satz-relevante Teile nebst einem index im Session-Array ebenfalls. Wenn die Löschanweisung kommt, wird anhand der zurückgesandten Erkennenungsdaten (Indes aus dem Array, z.B. Nachmane) ermittelt, ob es der richtitge Satz ist. Mit Hilfe der ermittelten ID wird geprüft, ob der User überhaupt Löschrechte hat. Erst dann wird gelöscht.

          mhh... die Idee klingt gut, ich glaube sowas bau ich bei Gelegenheit auch mal - aber für die Zwecke für die ich bisher was zum Löschen hatte, wäre das etwas oversized :-)

          Das ganze nennt sich dann bidirektionale Vorgangsbearbeitung.

          nie gehört... hast du vielleicht einen Link?

          ## "die()" ist keine Funktion für fertige Scripte!
          <frage modus="blöd">Warum?</frage>
          weil sie keinen Doctype, kein <html>, kein <body> usw. sendet.

          achso. Aber da normalerweise der Teil vor dem or die() true ergeben sollte (und mögliche Fehler vorher abgefangen werden sollten) ist das doch eigentlich nicht sooo wild, oder?

          Grüße aus Nürnberg
          Tobias

          --
          Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
          1. ReHallo,

            mhh... die Idee klingt gut, ich glaube sowas bau ich bei Gelegenheit auch mal - aber für die Zwecke für die ich bisher was zum Löschen hatte, wäre das etwas oversized :-)

            Das geht natürlich auch viel einfacher. Nur einen einzigen Satz zum Löschen anbieten, in die Session eintragen, anzeigen, und wenn der Delete-Button gedückt wurde (nach dem Userident) genau den Satz aus der Session löschen.

            Das ganze nennt sich dann bidirektionale Vorgangsbearbeitung.
            nie gehört... hast du vielleicht einen Link?

            Ist eigentlich Standard seit ca. 40 Jahren oder wie lange es SQL gibt...

            ## "die()" ist keine Funktion für fertige Scripte!
            <frage modus="blöd">Warum?</frage>
            weil sie keinen Doctype, kein <html>, kein <body> usw. sendet.
            achso. Aber da normalerweise der Teil vor dem or die() true ergeben sollte (und mögliche Fehler vorher abgefangen werden sollten) ist das doch eigentlich nicht sooo wild, oder?

            Doach, die Puristen hier würden uns erschlagen, wenn wir das durchgehen ließen. Das ist absolut unvalider HTML-Code...

            Tom

            1. Hallo Tom,

              Das geht natürlich auch viel einfacher. Nur einen einzigen Satz zum Löschen anbieten, in die Session eintragen, anzeigen, und wenn der Delete-Button gedückt wurde (nach dem Userident) genau den Satz aus der Session löschen.

              [x] auf der todo-Liste vermerkt

              Das ganze nennt sich dann bidirektionale Vorgangsbearbeitung.
              nie gehört... hast du vielleicht einen Link?
              Ist eigentlich Standard seit ca. 40 Jahren oder wie lange es SQL gibt...

              tja, so lange gibt es mich aber noch nicht... :-)

              weil sie keinen Doctype, kein <html>, kein <body> usw. sendet.
              achso. Aber da normalerweise der Teil vor dem or die() true ergeben sollte (und mögliche Fehler vorher abgefangen werden sollten) ist das doch eigentlich nicht sooo wild, oder?
              Doach, die Puristen hier würden uns erschlagen, wenn wir das durchgehen ließen. Das ist absolut unvalider HTML-Code...

              ich weiß, aber da das sowieso nur bei einem Fehler auftritt, sehe ich das nicht soo eng :-) Außerdem: was soll man denn sonst machen um die Ausführung zu beenden und gültigen Code zu produzieren?

              Grüße aus Nürnberg
              Tobias

              --
              Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
              1. Hi Tobi,

                ich weiß, aber da das sowieso nur bei einem Fehler auftritt, sehe ich das nicht soo eng :-) Außerdem: was soll man denn sonst machen um die Ausführung zu beenden und gültigen Code zu produzieren?

                Nachdenken. In erster Lineie nachdenken...

                Tom