mysql ID in php als Link ausgeben
Inspiron
- php
Hallo,
ich sitze seit 2 Tagen an einem Problem und komme nicht weiter.
Daten aus einer DB werden in einer Tabelle angezeigt.
##########################
##########################
#------------------------#
.
.
.
Nun möchte ich beim Klick auf die ID eine neue Seite öffnen um dort den gesamten Datensatz zu dieser ID anzeigen lassen.
Der erste Teil, ID als Link funktioniert.
Es wird eine Seite "www.seite.de/Bericht/view2.php?ID=1" aufgerufen.
Da kommt es aber zu folgender Fehlermeldung im Teil 2:
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 '' at line 1
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /is/htdocs/www/Bericht/view2.php on line 13
Großen Dank für eure Hilfe
Gruß Mario
Teil 1
<?php
//**********************************
// erste Seite
//**********************************
// Datenbankzugriff
include("includes/config.php");
$query = "SELECT * FROM FW_Fehlerbericht";
$result = mysql_query($query);
echo mysql_error();
while($daten=mysql_fetch_array($result))
{
echo "ID Nummer: <a href=\"/Bericht/view2.php?ID=",$daten['ID'],"\">", $daten['ID'],"</a>", "<br>";
}
?>
Teil 2
<?
//************************************
// View
//************************************
// Datenbankzugriff
include("includes/config.php");
$query = "SELECT * FROM FW_Fehlerbericht WHERE ID = $ID";
$result = mysql_query($query);
echo mysql_error();
$daten = mysql_fetch_array($result)
?>
<td style="border-top: 1px dotted #00447C" width="30%" align="left" valign="top"><?=$daten['SENDUNG']?></td>
<td style="border-top: 1px dotted #00447C" width="30%" align="left" valign="top"><?=$daten['KURZBESCHREIBUNG']?></td>
<td style="border-top: 1px dotted #00447C" width="30%" align="left" valign="top"><?=$daten['MASSNAHME']?></td>
Hi,
Es wird eine Seite "www.seite.de/Bericht/view2.php?ID=1" aufgerufen.
Da kommt es aber zu folgender Fehlermeldung im Teil 2:
$query = "SELECT * FROM FW_Fehlerbericht WHERE ID = $ID";
Und wo hast du hier die Variable $ID definiert und mit einem Wert belegt?
Höchstvermutlich möchtest du dich über register_globals informieren - warum es gut ist, dass das auf off steht, und wie man zeitgemäß auf per GET/POST/COOKIE übergebene Parameter zugreift.
Ausserdem informiere dich über das Stichwort SQL Injection.
MfG ChrisB
Hi,
Und wo hast du hier die Variable $ID definiert und mit einem Wert belegt?
kannst Du mir bitte auf die Sprünge helfen!?
Ausserdem informiere dich über das Stichwort SQL Injection.
...ist Hausintern, nichts öffentliches!
Gruß
Hi,
Und wo hast du hier die Variable $ID definiert und mit einem Wert belegt?
kannst Du mir bitte auf die Sprünge helfen!?
Gut: Du hast sie nirgends definiert, und es hat auch niemand automatisch für dich gemacht.
http://www.peterkropff.de/tutorials/php_register/php_register.htm
Ausserdem informiere dich über das Stichwort SQL Injection.
...ist Hausintern, nichts öffentliches!
Kann a) trotzdem schief gehen, und b) vielleicht wird es ja so "erfolgreich", dass das nicht immer so bleibt.
Deshalb: Von Anfang an *sauber* Programmieren.
MfG ChrisB
Dankeschön,
http://www.peterkropff.de/tutorials/php_register/php_register.htm
»»
...ist ja interessant, diesen werde ich mal genauer durchlesen.
Gruß
Hallo
Und wo hast du hier die Variable $ID definiert und mit einem Wert belegt?
kannst Du mir bitte auf die Sprünge helfen!?
Ganz einfach, $ID existiert nicht, womit der Query mit seinem Where-Teil ins Leere läuft. Der Query sieht somit folgendermaßen aus: "SELECT * FROM FW_Fehlerbericht WHERE ID =
", was ein Syntaxfehler ist.
Wie Chris schon andeutete, werden in PHP die an ein Skript übergebenen Werte, je nach Übergabeart, in nach diesen Arten benannten, superglobalen Arrays zur Verfügung gestellt. Das sind $_GET
, $_POST
, $COOKIE
, $_SESSION
und $_FILE
(falls ich etwas vergessen habe, bitte ich, es zu ergänzen). In deinem Fall würde dir $_GET["ID"]
die Werte des Linkparameters ID liefern. Mit der zusätzlichen Verwendung der PHP-Funktion mysql_real_escape_string maskierst du auch etwaige falsche oder böse Werte. Eine vorherige Prüfung, ob der Wert von $_GET["ID"]
in das passende Schema passt (hier eine Ganzzahl/Integer), darf ebenfalls nicht fehlen.
Ergebnis:
$query = "[code lang=sql]SELECT * FROM FW_Fehlerbericht WHERE ID =
".mysql_real_escape_string($_GET["ID"]);[/code]
Ausserdem informiere dich über das Stichwort SQL Injection.
...ist Hausintern, nichts öffentliches!
... ist unerheblich, aus grundsätzlichen Gründen!
Einerseits ist ein nicht vorhandenes Sicherheitsloch eben nicht vorhanden und andererseits weißt du *jetzt* nicht, wozu der Code *zukünftig* weiter- oder wiederverwendet wird. *Dann* könnte eine jetzt nicht beseitigte und dann übersehene Lücke unangenehme Folgen haben.
Tschö, Auge
Oh man,
ich glaube ich mache erst einmal Urlaub um den Kopf wieder frei zu bekommen.
Gelesen habe ich schon von "$_GET" nur das Zuordnen geht gerade garnicht.
Aber Grooooßes Danke für Deine Hilfe, genau so wollte ich es.
Gruß
Hi!
Mit der zusätzlichen Verwendung der PHP-Funktion mysql_real_escape_string maskierst du auch etwaige falsche oder böse Werte.
Vorsicht! mysql_real_escape_string() ist für den String-Kontext gedacht. Eine Zahl ohne begrenzende Anführungszeichen notiert ist aber kein String-Kontext. Deshalb braucht sich ein Angreifer auch nicht die Mühe zu machen, ihn zu verlassen, um in den Anweisungsteil zu gelangen. Denn er ist bereits drin und kann sofort loslegen. Außerdem braucht er noch nicht einmal Anführungszeichen um einen String zu notieren, sollte er einen für sein Werk benötigen.
Eine vorherige Prüfung, ob der Wert von $_GET["ID"] in das passende Schema passt (hier eine Ganzzahl/Integer), darf ebenfalls nicht fehlen.
Das wäre wichtig, kann aber gleich anstelle des falsch verwendeten mysql_real_escape_string() eingesetzt werden.
$query = "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);
Richtiger: $query = "SELECT * FROM FW_Fehlerbericht WHERE ID = " . intval($_GET["ID"]);
intval() sorgt garantiert für einen Integer-Wert. Im Zweifelsfall ist dieser 0.
Ausserdem informiere dich über das Stichwort SQL Injection.
...ist Hausintern, nichts öffentliches!
Auch hausintern gibt es genügend Angriffsmotivation und -gelegenheiten.
Lo!