WinFuture-Forum.de: Mysql Syntax Fehler In Delete - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Mysql Syntax Fehler In Delete


#1 Mitglied ist offline   Stefan24 

  • Gruppe: aktive Mitglieder
  • Beiträge: 151
  • Beigetreten: 17. Februar 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 10. Juni 2010 - 08:51

Ich glaube MySQL hat sich gegen mich verschworen :D Aber vllt. könnt ihr mir ja helfen. Das folgende PHP Script spukt immer eine Fehlermeldung aus:

<?php
include('mysql_connect.php');

		$aendern = "DELETE FROM ".$_GET['nr']." WHERE id = `".$_GET['id']."`";
		echo $aendern;
		$update = mysql_query($aendern);
		if (!$update) {
			die('Invalid query: ' . mysql_error());
		}
	
header("Location: mandant.php?nr=".$_GET['nr']);
?>


DELETE FROM 5678 WHERE id = `3`Invalid query: 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 '5678 WHERE id = `3`' at line 1

(Der Erste Teil kommt vom echo und ist keine Fehlermeldung)

Habt ihr eine Idee?

Stefan
Eingefügtes Bild

Eingefügtes Bild
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 10. Juni 2010 - 09:23

Willkommen in der Welt der bescheuerten MySQL Backticks...

Da der MySQL-Parser zu dumm ist Tabellennamen, die ausschließlich aus Zahlen oder Sonderzeichen bestehen, zu erkennen, muss man diese in Backticks schreiben:
DELETE FROM `5678` WHERE id = 3


Und noch was, was ich dir schon das letzte Mal gesagt habe, filtere deine Eingaben! Ich kann ohne Probleme deine komplette Tabelle, wenn nicht sogar Datenbank löschen!
http://de.wikipedia....L-Injection#PHP
0

#3 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 659
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 10. Juni 2010 - 10:00

Beitrag anzeigenZitat (Witi: 10.06.2010, 10:23)

Willkommen in der Welt der bescheuerten MySQL Backticks...

Da der MySQL-Parser zu dumm ist Tabellennamen, die ausschließlich aus Zahlen oder Sonderzeichen bestehen, zu erkennen, muss man diese in Backticks schreiben


das ist kein reines MySQL-Problem
Raise your glass if you are wrong
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 10. Juni 2010 - 10:43

Du hast natürlich recht, habe mich falsch ausgedrückt.

Mir geht's um die Backticks, da andere DBMSe Anführungsstriche nutzen.
0

#5 Mitglied ist offline   Stefan24 

  • Gruppe: aktive Mitglieder
  • Beiträge: 151
  • Beigetreten: 17. Februar 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 10. Juni 2010 - 11:17

Beitrag anzeigenZitat (Witi: 10.06.2010, 10:23)

Und noch was, was ich dir schon das letzte Mal gesagt habe, filtere deine Eingaben! Ich kann ohne Probleme deine komplette Tabelle, wenn nicht sogar Datenbank löschen!
http://de.wikipedia....L-Injection#PHP


Das ist nicht so schlimm, das läuft nur in einem Intranet :) Das ist doch die mysql_real_escape Sache, oder?

Jetzt komm folgende Meldung:

DELETE FROM `5678` WHERE id = `15`Invalid query: Unknown column '15' in 'where clause'


Wie kommt MySQL auf die Idee, dass 15 eine Spalte ist?! Ich habe doch festgelegt, er soll in der Spalte id nach 15 suchen :D

Dieser Beitrag wurde von Stefan24 bearbeitet: 10. Juni 2010 - 11:20

Eingefügtes Bild

Eingefügtes Bild
0

#6 Mitglied ist offline   prunkster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 282
  • Beigetreten: 22. Mai 08
  • Reputation: 5
  • Geschlecht:Männlich

geschrieben 10. Juni 2010 - 11:24

$aendern = "DELETE FROM ".$_GET['nr']." WHERE id = `".$_GET['id']."`";

eingefasst in die einfachen anführungszeichen, scheint es als spalte interpretiert zu werden. folgendes sollte helfen:

$aendern = "DELETE FROM ".$_GET['nr']." WHERE id = ".$_GET['id'];

Eingefügtes Bild <--- Workstation@Home

My Blog: hier
0

#7 Mitglied ist offline   voodoo44 

  • Gruppe: aktive Mitglieder
  • Beiträge: 355
  • Beigetreten: 26. Dezember 05
  • Reputation: 0

geschrieben 10. Juni 2010 - 11:38

Wirklich sauber ist letztere Variante aber auch nicht.

Schonmal was von einfachen Hochkommas gehört? Die sollten hier an dieser Stelle benutzt werden. Spaltennamen schreibt man im übrigen auch in diese Apostroph-Dinger:

$aendern = 'DELETE FROM `'.$_GET['nr'].'` WHERE `id` = '.$_GET['id'];

Dass man, um SQL-Injections vorzubeugen, auch noch die GET-Parameter entsprechend behandeln sollte, hätte evtl. auch erwähnung finden sollen.
0

#8 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 10. Juni 2010 - 11:56

Stefan24 sagte:

Das ist nicht so schlimm, das läuft nur in einem Intranet wink2.gif Das ist doch die mysql_real_escape Sache, oder?

Och...auch intern im Unternehmen kann so etwas als schlampige Programmierung interpretiert werden. Und dann bist du in Erklärungsnot. :D

Backticks sind nur bei Tabellen- und Spaltennamen notwendig, nicht bei Werten. Hochkommata benötigst du auch nur, wenn es Char- oder ähnliche Datentypen sind. Bei Integern sind sie überflüssig.

Meine Lösung sieht wie folgt aus:
// ...
// isset und co sollte natürlich auch nicht vergessen werden
$nr = (int)mysql_real_escape_string($_GET['nr']);
$id = (int)mysql_real_escape_string($_GET['id']);

$query = "DELETE FROM `$nr` WHERE `id` = $id";
mysql_query($query);
// ...


Trotzdem muss ich dir wohl nicht sagen, dass so ein parametrisierbarer Aufruf unglaublich gewährlich ist.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0