plötzliche Fehlermeldungen bei MySQL-Abfragen

mirakles66

Benutzer
Beiträge
8
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!
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.171
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!


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
 

mirakles66

Benutzer
Beiträge
8
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.171
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://de.php.net/manual/de/mysql_real_escape_string 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?


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
 

mirakles66

Benutzer
Beiträge
8
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);
}
 

mirakles66

Benutzer
Beiträge
8
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
 

mirakles66

Benutzer
Beiträge
8
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.
 

Tommi

Datenbank-Guru
Beiträge
284
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
 

mirakles66

Benutzer
Beiträge
8
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;
}
 

akretschmer

Datenbank-Guru
Beiträge
9.171
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.


*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
 

mirakles66

Benutzer
Beiträge
8
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.
 

akretschmer

Datenbank-Guru
Beiträge
9.171
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


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

Andreas
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
284
Hi,

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

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

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??

die Variable 'id' enthält: " . $datensatznr . "
die Variable 'sql' enthält:
die Variable 'result' enthält: Resource id #6

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
 
Oben