mysql anfänger: mehr details anzeigen

hallo liebe forumgemeinde!

ich lasse mir aus einer datenbanktabelle daten tabellarisch ausgeben.

das sieht dan so aus:

<table cellpadding="2" cellspacing="0">
<tr class="legende">
<td title="Bandname" style="border-style:solid;border-width:2px 1px 2px 2px;border-color:#444">Band</td>
<td title="Genre" style="border-style:solid;border-width:2px 1px 2px 0px;border-color:#444">Genre</td>
<td title="Region" style="border-style:solid;border-width:2px 1px 2px 0px;border-color:#444">Region</td>
<td title="Eingtragen am:" style="border-style:solid;border-width:2px 1px 2px 0px;border-color:#444">Eingetragen am:</td>
<td title="Details" style="text-align:center;border-style:solid;border-width:2px 2px 2px 0px;border-color:#444">Details</td></tr>

<?
$abfrage = "SELECT * FROM links";
$ergebnis = mysql_query($abfrage);

while($row = mysql_fetch_object($ergebnis))
   {
   echo "
<tr onmouseover="rowhover_on(this)" onmouseout="rowhover_out(this)">
<td title='Bandname' class='first'>$row->name</td>
<td title='Genre' class='middle'>$row->genre</td>
<td title='Region:' class='middle'>$row->region</td>
<td title='Eingetragen am:' class='middle'>$row->datum</td>
<td class='last'><a href='details.php?id=$row->id' class='details'>Details anzeigen</a></td>
</tr>";

}
?>

nun versuche ich über die datei "details.php" mit dem link

<a href='details.php?id=$row->id' class='details'>

details über den eintrag auszugeben. das sollte eigentlich so aussehen:

$abfrage = "SELECT * FROM links WHERE $_GET['id']";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
   {
   echo "$row->url <br>";
   }

aber als antwort bekomme ich immer nur:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /usr/export/www/vhosts/funnetwork/hosting/steffenb/phplernen/details.php on line 32

kann/will mir jemand helfen?

mfg,
mysql anfänger

  1. Hallo Steffen,

    eins vornweg. Im Moment hast Du kein Datenbankproblem, sondern ein PHP-Problem. Schließlich bekommst Du eine Fehlermeldung, die ausschließlich mit PHP zu tun hat - und keine die z.B. einen SQL-Syntaxerror ausgibt.

    $abfrage = "SELECT * FROM links";

    Ah ja, Du fragst also die Inhalte aller Felder Deiner Tabelle ab, gleichgültig ob Du sie brauchst oder nicht. Das ist in aller Regel keine gute Idee.

    $ergebnis = mysql_query($abfrage);

    while($row = mysql_fetch_object($ergebnis))
       {
       echo "
    <tr onmouseover="rowhover_on(this)" onmouseout="rowhover_out(this)">
    <td title='Bandname' class='first'>$row->name</td>
    <td title='Genre' class='middle'>$row->genre</td>
    <td title='Region:' class='middle'>$row->region</td>
    <td title='Eingetragen am:' class='middle'>$row->datum</td>
    <td class='last'><a href='details.php?id=$row->id' class='details'>Details anzeigen</a></td>

    So, an dieser Stelle möchtest Du Details anzeigen ...

    nun versuche ich über die datei "details.php" mit dem link
    $abfrage = "SELECT * FROM links WHERE $_GET['id']";

    ... und Überraschung: Du fragst exakt die gleichen Daten ab, die Du bereits hattest. Also fragst Du zunächst mehr ab, als Du benötigst.

    Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /usr/export/www/vhosts/funnetwork/hosting/steffenb/phplernen/details.php on line 32

    Was steht in den Zeilen 25-35? Gib bitte die Zeilennummern mit an.

    Freundliche Grüße

    Vinzenz

  2. echo $begrüßung;

    Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /usr/export/www/vhosts/funnetwork/hosting/steffenb/phplernen/details.php on line 32

    Lass mich raten, Zeile 32 ist diese:

    $abfrage = "SELECT * FROM links WHERE $_GET['id']";

    Denn die passt zur Fehlermeldung. Komplexe Variablenausdrücke innerhalb von ""-String müssen in {} engefasst werden.

    $abfrage = "SELECT * FROM links WHERE {$_GET['id']}";
      // hier fehlt aber noch etwas. vielleicht ein "id="? WHERE id={$_GET...

    Desweiteren ignorierst du völlig die Möglichkeit, dass bei der Datenbankabfrage etwas schief gelaufen sein könnte.

    $abfrage = "SELECT * FROM links";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))

    mysql_query() (und die meisten anderen mysql-Funktionen auch) liefert in dem Fall keine Ressourcenkennung sondern ein false zurück. Der Wortlaut der Fehlermeldung wird von mysql_error() zurückgegeben. Die nachfolgenden MySQL-Funktionen (hier mysql_fetch_object) mögen aber dieses false gar nicht, weswegen sich PHP mit einer Fehlermeldung beschwert.

    Benutzereingaben sollten auch nicht ungeprüft/unbehandelt in SQL-Statements eingebaut werden. Das führt entweder zu Fehlern oder zu SQL-Injection. Dagegen hat man unter PHP zwar die Magic Quotes erfunden, doch die arbeiten viel zu allgmein, wenn es um MySQL geht. Deswegen sollte man dieses Feature deaktivieren oder seine Auswirkungen rückgängig machen (siehe: Disabling Magic Quotes) und die zur Datenbank passende Maskierung verwenden, was im Falle MySQL mysql_real_escape_string() ist.

    Im Falle der id ist sicherlich nur ein numerischer Wert erlaubt. Dies kann man mit intval($_GET['id']) sicherstellen. Ansonsten stellt es für MySQL kein Problem dar, auch numerische Werte in SQL-Statements in Anführungszeichen zu erkennen. Zusammen mit mysql_real_escape_string() wird auch in dem Fall eine SQL-Injection unterbunden.

    echo "$verabschiedung $name";