Thomas: Fehler bei Update und Delete

Hallo zusammen.

Ich bin gerade dabei, ein kleines Online-Game zu programmieren, aber bei der Abfrage des Ranges der einzelnen Benutzer wird der SQL-Update nicht ausgeführt.
Beim Anlegen eines neuen Users habe ich zudem einen Fehler beim Delete gefunden, den ich mir aber ebenfalls nicht erklären kann!

Zu meiner MySQL-Datenbank:
es geht um die Tabelle tabBenutzer, in der die Userdaten (Username, Mail, Rang, Kontostand, ...) gespeichert sind.
Primärschlüssel ist user (varchar[30], NOT NULL)
weiteres Attribut: rang (varchar[20], NULL)

Hier der Code zum Update des Rangs:

$update = "UPDATE tabBenutzer SET rang='$Rang' WHERE user='$Benutzer'";
$sqlupdate = mysql_db_query("Anmeldename", $update, $verbindung);
if(!$sqlupdate)
{
 print "<h1>Fehler beim Update des Rangs!</h1>";
}

In $Benutzer ist der Username, in $Rang der zuvor ermittelte Rang abgelegt ($Rang stimmt, das habe ich überprüft; dort ist "Chef der Unterwelt" gespeichert).
Wo ist denn hier bitte der Fehler?

Und zu guter letzt noch der Code des fehlerhaften Delete:

$sqldelete = "DELETE * FROM tabBenutzer WHERE user = '$User'";
$loeschen = @mysql_db_query("Anmeldename", $sqldelete, $verbindung);
if (!$loeschen)
{
 print "<p>Es ist ein SQL-Fehler aufgetreten.</p>";
 print "<p>Die fehlerhaften Datensätze konnten nicht gelöscht werden!</p>";
}
exit;

In $User ist hier der Username gespeichert. Was habe ich da denn falsch gemacht?

Bitte helft mir, denn ich komme wirklich nicht mehr weiter!

Vielen Dank vorab für alle hilfreichen Beiträge,
Thomas

  1. Halihallo Thomas

    $update = "UPDATE tabBenutzer SET rang='$Rang' WHERE user='$Benutzer'";
    $sqlupdate = mysql_db_query("Anmeldename", $update, $verbindung);
    if(!$sqlupdate)
    {
    print "<h1>Fehler beim Update des Rangs!</h1>";

    Benutze http://www.php.net/mysql_error um die _genaue_ Fehler-
    ursache zu finden.

    Wo ist denn hier bitte der Fehler?

    Kann mehrere Ursachen haben, Klarheit verschafft anwenden von
    mysql_error.

    $sqldelete = "DELETE * FROM tabBenutzer WHERE user = '$User'";

    Befasse dich mit der Syntax von DELETE:
    http://dev.mysql.com/doc/mysql/en/DELETE.html

    Was für einen Sinn soll die Nennung von Attributnamen bei DELETE
    ergeben?

    $loeschen = @mysql_db_query("Anmeldename", $sqldelete, $verbindung);

    Fehlerbehandlung! - mysql_error ausgeben!

    Viele Grüsse

    Philipp

    --
    The only program that runs perfectly every time, is a virus.
    1. Benutze http://www.php.net/mysql_error um die _genaue_ Fehler-
      ursache zu finden.

      Mein Problem an der Sache ist, dass gar kein Fehler angezeigt wird. Der Update-Befehl wird aber dennoch nicht ausgeführt, denn in der Datenbank bleibt der Rang auf "Anfaenger"!

      $sqldelete = "DELETE * FROM tabBenutzer WHERE user = '$User'";

      Befasse dich mit der Syntax von DELETE:
      http://dev.mysql.com/doc/mysql/en/DELETE.html

      OK, der * muss weg

      Was für einen Sinn soll die Nennung von Attributnamen bei DELETE
      ergeben?

      Was genau meinst du?

      Vielen Dank schonmal für die Tipps,
      Thomas

      1. Halihallo Thomas

        Mein Problem an der Sache ist, dass gar kein Fehler angezeigt wird. Der Update-Befehl wird aber dennoch nicht ausgeführt, denn in der Datenbank bleibt der Rang auf "Anfaenger"!

        Lass dir den Query über "echo" ausgeben. Sieht er aus, wie erwartet?
        Korrekte Werte in $Benutzer und $Rand.

        Mir ist z.B. aufgefallen, dass du einmal $User und einmal $Benutzer
        verwendest, obwohl beide ggf. das selbe sein sollten...

        Schalte Warnungen von PHP ein!
        ini_set('display_errors',true);
        ini_set('error_reporting', E_ALL);

        $sqldelete = "DELETE * FROM tabBenutzer WHERE user = '$User'";

        Befasse dich mit der Syntax von DELETE:
        http://dev.mysql.com/doc/mysql/en/DELETE.html

        OK, der * muss weg

        aha...

        Was für einen Sinn soll die Nennung von Attributnamen bei DELETE
        ergeben?
        Was genau meinst du?

        Ich meine, dass ein * bei DELETE keinen Sinn ergibt und wollte dich
        fragen, was dich dazu verleitet hat, anzunehmen, dass er Sinn
        ergeben soll.

        Viele Grüsse

        Philipp

        --
        The only program that runs perfectly every time, is a virus.
        1. Ich meine, dass ein * bei DELETE keinen Sinn ergibt und wollte dich
          fragen, was dich dazu verleitet hat, anzunehmen, dass er Sinn
          ergeben soll.

          Habe mir fälschlicherweise gedacht, wenn ich den Stern weglasse, löscht er nur den jeweiligen Wert (z.B. nur das Attribut user).
          Wenn man so überlegt, dann würde er mit DELETE * das ganze Tuple löschen ...

          1. Halihallo Thomas

            Habe mir fälschlicherweise gedacht, wenn ich den Stern weglasse, löscht er nur den jeweiligen Wert (z.B. nur das Attribut user).
            Wenn man so überlegt, dann würde er mit DELETE * das ganze Tuple löschen ...

            Die Argumentation ist z.T. einleuchtend, nur so sieht es der SQL
            Standard (IMHO zurecht [1]) nicht vor :-)

            [1] Es gibt gute Gründe, die DML und DDL klar zu unterscheiden,
                besonders auf der Ebene eines Datensatzes (das wäre dann etwa
                die 1.5-te NF, 1NF + Datentyp einer Tabelle bleibt stets derselbe
                :-))...
                Falls du mit Löschen "auf Default-Wert zurücksetzen" meinst,
                nunja, dann hat es wenig mit DELETE zu tun, sondern ginge auch
                wieder in Richtung UPDATE...

            Fazit: Kein Stern für DELETE :-)

            Viele Grüsse

            Philipp

            --
            The only program that runs perfectly every time, is a virus.
  2. Hallo Thomas,

    $update = "UPDATE tabBenutzer SET rang='$Rang' WHERE user='$Benutzer'";

    das sieht vom Syntax her schon mal richtig aus (allerdings ist die Verwendung von Variablen innerhalb von Strings nicht zu empfehlen, da langsam).

    $sqlupdate = mysql_db_query("Anmeldename", $update, $verbindung);

    du möchtest http://www.php.net/mysql_db_query lesen und dann mysql_select_db und mysql_query verwenden.

    print "<h1>Fehler beim Update des Rangs!</h1>";

    das ist keine besonders Hilfreiche Fehlermeldung - warum lässt du dir nicht die Fehlermeldung von mysql selbst anzeigen (->mysql_error())?

    In $Benutzer ist der Username, in $Rang der zuvor ermittelte Rang abgelegt ($Rang stimmt, das habe ich überprüft; dort ist "Chef der Unterwelt" gespeichert).

    hast du dir den Query mal mit echo $update; ausgeben lassen, um zu sehen, ob da wirklich das drinsteht, was du vermutest?

    Wo ist denn hier bitte der Fehler?

    woher soll ich das wissen? bekommst du eine Fehlermeldung? wenn ja, welche? Was macht der Query/was nicht?

    $sqldelete = "DELETE * FROM tabBenutzer WHERE user = '$User'";

    schau dir mal den Syntax von DELETE auf http://www.mysql.de/doc/de/DELETE.html an - du wirst feststellen dass das * da nichts zu suchen hat.

    $loeschen = @mysql_db_query("Anmeldename", $sqldelete, $verbindung);

    warum unterdrückst du jegliche Fehlermeldung?

    print "<p>Es ist ein SQL-Fehler aufgetreten.</p>";

    mysql_error() (s.o.)

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. $sqlupdate = mysql_db_query("Anmeldename", $update, $verbindung);
      du möchtest http://www.php.net/mysql_db_query lesen und dann mysql_select_db und mysql_query verwenden.

      Werd ich mal versuchen.

      print "<h1>Fehler beim Update des Rangs!</h1>";
      das ist keine besonders Hilfreiche Fehlermeldung - warum lässt du dir nicht die Fehlermeldung von mysql selbst anzeigen (->mysql_error())?

      Werde ich in Zukunft machen.

      Wo ist denn hier bitte der Fehler?
      woher soll ich das wissen? bekommst du eine Fehlermeldung? wenn ja, welche? Was macht der Query/was nicht?

      Das Problem ist ja, dass ich in diesem Fall keine Fehlermeldung bekomme. Aber der Rang bleibt in der Datenbank auf "Anfaenger", wird also nicht geändert.

      $sqldelete = "DELETE * FROM tabBenutzer WHERE user = '$User'";
      schau dir mal den Syntax von DELETE auf http://www.mysql.de/doc/de/DELETE.html an - du wirst feststellen dass das * da nichts zu suchen hat.

      $loeschen = @mysql_db_query("Anmeldename", $sqldelete, $verbindung);
      warum unterdrückst du jegliche Fehlermeldung?

      print "<p>Es ist ein SQL-Fehler aufgetreten.</p>";
      mysql_error() (s.o.)

      Werde das auf jeden Fall so einbauen.
      Vielen Dank,
      Thomas

    2. $update = "UPDATE tabBenutzer SET rang='$Rang' WHERE user='$Benutzer'";
      das sieht vom Syntax her schon mal richtig aus (allerdings ist die Verwendung von Variablen innerhalb von Strings nicht zu empfehlen, da langsam).

      Wie soll man denn die Werte sonst in den Abfragestring aufnehmen?

      1. hi,

        (allerdings ist die Verwendung von Variablen innerhalb von Strings nicht zu empfehlen, da langsam).

        Wie soll man denn die Werte sonst in den Abfragestring aufnehmen?

        string auftrennen,
        "string, teil 1".$variable."string, teil 2";

        gruss,
        wahsaga

      2. Halihallo GT

        Wie soll man denn die Werte sonst in den Abfragestring aufnehmen?

        vergl. </archiv/2004/4/79368/#m459755>

        Viele Grüsse

        Philipp

        --
        The only program that runs perfectly every time, is a virus.