1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

plötzliche Fehlermeldungen bei MySQL-Abfragen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von mirakles66, 13 Februar 2013.

  1. mirakles66

    mirakles66 Benutzer

    Haben sich die MySQL-Standards geändert in der letzten Zeit? Ich habe folgendes Problem: In allen Sripts, in denen ich Datensätze aktualisieren oder löschen lassen will tritt, unabhängig vom Rechner (also auch online) folgende Fehlermeldung auf:

    "Es konnte kein Datensatz gelöscht werden: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM tab_66849 WHERE tab_66849.datres_nr = 6' at line 1"

    Die Syntax sieht so aus:

    $id = $_POST["datres_nr"];
    $sql = "DELETE * FROM tab_66849
    WHERE tab_66849.datres_nr = $id";

    Es wäre toll, wenn Ihr mir helfen könntet!
    Im Voraus vielen Dank!
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Nein. DELETE * FROM ... ist schon immer syntaktisch falsch. Dein Code ist übrigens massiv anfällig für SQL-Injection.

    Code:
    test=*# create table foo (i int);
    CREATE TABLE
    test=*# delete * from foo where i = 1;
    ERROR:  syntax error at or near "*"
    LINE 1: delete * from foo where i = 1;
                   ^
    test=*# delete from foo where i = 1;
    DELETE 0
    

    Andreas
     
    ukulele gefällt das.
  3. mirakles66

    mirakles66 Benutzer

    Hallo Andreas, ich bin kein Profi. Ich habe die Grundlagen PHP/MySQL im Fernstudium gelernt und kann mit Deinem vorgeschlagenen Script leider nichts anfangen. Jetzt wälze ich Bücher und versuche mein Script mit der Funktion von http://de2.php.net/manual/de/function.mysql-real-escape-string.php umzuschreiben.

    Ein Script sieht jetzt so aus :

    $id = ($_POST["datensatznr"]);
    $sql = "DELETE FROM tbl_einrichtungen
    WHERE tbl_einrichtungen.datensatznr =' ";
    $sql .= mysql_real_escape_string($id)." ' ";

    Jetzt kommt zwar keine Fehlermeldung mehr, aber ausgeführt wird der Befehl trotzdem nicht.

    Was muß ich machen, wenn die Datenbank komprimiert ist, d.h. sich jemand von Außen einen Zugang verschafft hat und meine PHP-Befehle blockiert, z.B. Datensätze aktualisieren bzw löschen?
     
  4. akretschmer

    akretschmer Datenbank-Guru


    Mein 'Script' war nur eine Demo Deines Fehlers mit DELETE * ...

    Was steht denn in Deiner Variable $sql drin? Bzw., was Du zeigst, ist nur eine Variable, da wird noch nix an die DB übergeben.


    Wenn die DB kompromitert ist, kannst Du ihr nicht mehr trauen. Was Du dann weiter machst hängt davon ab, wie Du diesen Fakt wertest. Das kann von 'mir doch egal' über 'lösch ich halt alles' bis zu 'ich schalt da mal Profis ein und drohe denen mit viel Geld' reichen.

    Andreas
     
  5. mirakles66

    mirakles66 Benutzer

    In einer Formularmaske wird ein Datensatz angezeigt und dieser soll gelöscht werden - also wird der "Löschen"-Button angeklickt und
    dieses Script soll den Datensatz unter der angegebenen Datensatznummer löschen - macht es eben nicht.

    if (isset($_POST["löschen"]))
    {
    $con = mysql_connect("localhost","Benutzer","passwort")
    or die("Es konnte keine Verbindung hergestellt werden :" . mysql_error());

    mysql_select_db("Datenbank",$con);

    $id = ($_POST["datensatznr"]);

    $sql = "DELETE FROM tbl_einrichtungen
    WHERE tbl_einrichtungen.datensatznr ='";
    $sql .= mysql_real_escape_string($id)."'";
    $result = mysql_query($sql, $con) or die ("Der Datensatz konnte nicht gelöscht werden");

    mysql_close($con);
    }
     
  6. akretschmer

    akretschmer Datenbank-Guru

    • was steht in Deiner Variable drin?
    • was liefert die DB als Fehlermeldung zurück?

    Andreas
     
  7. mirakles66

    mirakles66 Benutzer

    Hallo Andreas!

    ich möchte Deine Geduld nicht strapazieren, ich bin halt eine absoluter Rookie, der sich alles selbst beibringen muß und ich habe in meinem Umfeld niemanden, mit dem ich über so spezielle fachliche Dinge reden kann.

    Die Datenbank liefert jetzt mit der Maskierung der SQL-Abfrage keine Rückmeldung, der Befehl wird einfach nicht ausgeführt.
    Mit welcher Funktion kann ich mir den kompletten Zeichensatz einer Abfrage ausgeben lassen, der an die Datenbank gesendet wird?

    Maik
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Du meinst sicherlich, daß Du Dir den Inhalt der Variable ausgeben lassen willst. Ja, das ist sehr versteckt, kommt man nieeee drauf:

    Code:
    echo $sql;
    

    Andreas
     
  9. mirakles66

    mirakles66 Benutzer

    die Variable 'id' enthält: " . $datensatznr . "
    die Variable 'sql' enthält: DELETE FROM tbl_einrichtungen WHERE tbl_einrichtungen.datensatznr ='\" . $datensatznr . \"'
    die Variable 'result' enthält: 1


    Ok, aber da erscheint nichts neues als das, was ich Dir schon geschrieben habe. Ich hoffe, Du kannst damit etwas anfangen.
    Ich dachte, man kann sich den verschlüsselten Code anzeigen lassen - wenn es das gibt.
     
  10. Tommi

    Tommi Datenbank-Guru

    Hi,

    ich glaube, was Andreas wissen wollte ist, welcher Wert wirklich in dieser Variable drin steht und wie der tatsächlich abgesetzte SQL-Befehl aussieht.
    Evtl. wird ja die Datensatz-ID nicht korrekt übergeben. Hast du das schon mal geprüft?

    Wie sieht dein SQL-String mit allen Variablen-Ersetzungen aus? Wird wirklich ein DELETE des Datensatzes (mit der korrekten ID) befohlen, der auch gemeint ist?

    Viele Grüße,
    Tommi
     
  11. mirakles66

    mirakles66 Benutzer

    Hallo Tommi, wie kann ich prüfen, ob die Datensatz-ID korrekt übergeben wird?
    Ich habe einen Datensatz aufgerufen und ich möchte eine Telefonnummer hinzufügen - und klicke auf aktualisieren.
    Die Datenbank springt zur ersten Datensatznummer und zeigt den aktualisieren Datensatz an. Rufe ich dann die richtige Datensatznummer auf (hier 264), wird der Datensatz ohne Telefonnummer angezeigt.
    Wo liegt der Fehler?
    Ich sende auch den kompletten Code für das Aktualisieren.


    Code:
    if (isset($_POST["aktualisieren"]))
      {
        include "db_connect.inc.php";
     
            $id = ($_POST["datensatznr"]);
        $name = $_POST["strname"];
        $traeger = $_POST["strtraeger"];
        $beschreibung = $_POST["strbeschreibung"];
        $kategorie = $_POST["strkategorie"];
        $adresse = $_POST["stradresse"];
        $plz = $_POST["strplz"];
        $ort = $_POST["strort"];
        $telefon = $_POST["strtelefon"];
        $fax = $_POST["strfax"];
        $email = $_POST["stremail"];
        $internet = $_POST["strinternet"];
        $kontakt = $_POST["strkontakt"];
        $interna = $_POST["strinterna"];
        $sprechzeit = $_POST["strsprechzeit"];
        $quelle = $_POST["strquelle"];
     
        $position = $_POST["Position"];
        $num_rows = $num_rows;
        $hinweis = "Du bist bei " . $position"  von " . $num_rows;
         
        $sqlab = "UPDATE tbl_einrichtungen SET tbl_einrichtungen.name = '$name',          tbl_einrichtungen.traeger = '$traeger',
    tbl_einrichtungen.beschreibung = '$beschreibung',
    tbl_einrichtungen.kategorie = '$kategorie', 
    tbl_einrichtungen.adresse = '$adresse',
    tbl_einrichtungen.plz = '$plz',
    tbl_einrichtungen.ort = '$ort',
    tbl_einrichtungen.telefon = '$telefon',
    tbl_einrichtungen.fax = '$fax',
    tbl_einrichtungen.email = '$email',
    tbl_einrichtungen.internet = '$internet',
    tbl_einrichtungen.kontakt = '$kontakt',
    tbl_einrichtungen.interna = '$interna',
    tbl_einrichtungen.sprechzeit = '$sprechzeit',
    tbl_einrichtungen.quelle = '$quelle',
    tbl_einrichtungen.bearbeitung = CURRENT_TIMESTAMP
    WHERE tbl_einrichtungen.datensatznr = '";
    $sqlab .= mysql_real_escape_string($id)."'";     
             
    $result = mysql_query($sqlab,$con) or die ("Der Datensatz konnte nicht akualisiert werden!");
         
    echo "die Variable 'id' enthält: $id <br />";
    echo "die Variable 'sql' enthält: $sql <br />";
    echo "die Variable 'result' enthält: $result";
         
    mysql_close($con);
    $position = $position-1;
    }
    
     
  12. akretschmer

    akretschmer Datenbank-Guru


    *Seufz*

    Schreibe in Deinen PHP-Code einfach rein: echo $sql; Und zwar bevor das an die DB geht. Da ist nix verschlüsselt, das ist für Menschen lesbarer Text.

    Wenn Du als SQL-Befehl an die DB schickst:

    Code:
    DELETE FROM tbl_einrichtungen WHERE tbl_einrichtungen.datensatznr ='\" . $datensatznr . \"'
    
    dann kann die keine Datensatznummer finden, die '\" . $datensatznr . \"' lautet, denn sehr wahrscheinlich lauten diese z.B. 4711 oder 815.


    Andreas
     
  13. mirakles66

    mirakles66 Benutzer

    Hallo Andreas!
    Ich habe jetzt 'echo $sql; ' in den PHP-Code geschrieben, befor ich die Verbindung zur Datenbank öffne und es erscheint folgende Fehlermeldung:
    Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\quartier-test\data\logakt_e.php on line 374

    Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\quartier-test\data\logakt_e.php on line 374
    die Variable 'id' enthält: " . $datensatznr . "
    die Variable 'sql' enthält:
    die Variable 'result' enthält: Resource id #6


    Anmerkung: Es gibt keinen user ODBC für die Datenbank über PHPmyAdmin! Jetzt kannst Du denken:"Der hat ja gar keine Ahnung!" - Stimmt leider.....
    Ich beschäftige mich erst seit ca. 10 Monaten mit dem Thema.
    Schau mal rein: www.gaardeninfo.de - Die habe ich in Bürgerarbeit programmiert und wusste vorher GARNICHTS!!!
    Bürgerarbeit ist ein Programm für Langzeitarbeitslose zur Wiedereingliederung in den 1. Arbeitsmarkt.
     
  14. akretschmer

    akretschmer Datenbank-Guru



    Das ist keine Ausgabe von echo $sql; Und falls doch: das ist kein SQL, was man an eine DB schickt.

    Andreas
     
  15. Tommi

    Tommi Datenbank-Guru

    Hi,

    ich versuch mich mal in einer Fehler-Interpretation (ich kenne mich mit PH nicht wirklich aus, daher unter Vorbehalt!).

    Das sieht für mich so aus, als könnte die aufgerufene Funktion nicht korrekt angesprochen werden. Fehlt hier vielleicht noch ein Import bzw. Include oder so??

    Das sind doch die von dir hinzugefügten Ausgaben. Hier sieht man, dass in der Variable "$id" ein Text steht. Wenn du hier aber eine ID in der Datenbank ansprechen willst, sollte das (vermutlich) eine Zahl sein. D.h., dass die Ersetzung bzw. Ermittlung der Datensatz-ID irgendwo nicht korrekt funktioniert. Dieser Fehler ist wahrscheinlich bereits vorher verursacht, nämlich beim Füllen der Information in ["datensatznr"]. An dieser Stelle solltest du dir noch einmal den Part ansehen, in der du die Information der Datensatz-ID in dieses Feld einträgst.

    Dass für die Variable $sql nichts ausgegeben wird ist klar, du erstellst ja auch die variable $sqlab. Diese Angabe solltest du mal ausgeben lassen und dann in der Ausgabe den Part deiner WHERE-Klausel überprüfen.


    Viele Grüße,
    Tommi
     
Die Seite wird geladen...
Ähnliche Themen - plötzliche Fehlermeldungen MySQL
  1. IchHH
    Antworten:
    1
    Aufrufe:
    1.166

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden