Vinzenz Mai: Doppelte Daten, fehlende Programmlogik?

Beitrag lesen

Hallo,

zunächst nur ein paar allgemeine Anmerkungen:

$idd = htmlspecialchars($_GET['id'],ENT_QUOTES);

was soll diese Anweisung bewirken?
Warum htmlspecialchars?
$_GET['id'] sollte offensichtlich eine Zahl enthalten.
Welche für HTML relevanten Zeichen willst Du aus welchem Grund umwandeln?
Du willst doch in eine Datenbank abspeichern, genauer in eine MySQL-Datenbank.
Dazu gibt es die Funktion mysql_real_escape_string(). Dabei musst Du wie bei Beispiel 3 gezeigt, gegebenenfalls die Magic Quotes berücksichtigen und falls nötig vorher die Daten mit stripslashes() behandeln.

htmlspecialchars() ist jedenfalls nicht dafür geeignet, Daten für die SQL-Textschnittstelle eines DBMS zu maskieren. Nein, auch nicht für MySQL.

$idd = htmlspecialchars($_GET['id'],ENT_QUOTES);

Nochmals der gleiche Unsinn.

$datum = date ("F j,Y");
$var1 = substr(htmlspecialchars($_POST['comment_titel'],ENT_QUOTES),0,150);

... schon wieder, das hat System. Noch was: Es ist keine gute Idee, diese "Importvariablen" lokalen Variablen zuzuweisen. Das verschleiert die Herkunft.

$post_query = mysql_query("insert into comment (ID,titel,datum,userid,welcher,text) values ('','$var1','$datum','$var2','$idd','$var3')");

Allerdings ist es eine gute Idee, bei der Verwendung von mysql_query das SQL-Statement in einer eigenen Variablen zusammenzubauen und das Statement bei Problemen und fehlerhaftem Verhalten zu Debug-Zwecken auszugeben. Du ignorierst die Möglichkeit, dass hier ein Fehler auftreten könnte (den Du vernünftig behandeln solltest).

$update_query = mysql_query("update news set comments = comments + 1 where id=".$idd.";");

Aha! Hier gehst Du davon aus, das in der Variablen $idd eine Zahl steht. Wo hast Du das geprüft? mysql_query möchte außerdem kein Semikolon am Ende der SQL-Anweisung. Hier gilt wie oben: SQL-Statement vorher einer Variablen zuweisen, Benutzereingaben (dazu zählt auch alles aus den $_GET- und $_POST-Arrays) sind nicht mit mysql_real_escape_string() behandelt, es fehlt jegliche Fehlerbehandlung.

echo "<center>Danke für den Kommentar. Bitte warten oder <p><a href="comments.php?mode=show&id=$idd#bottom" target="_self">hier klicken um kommentar zu sehen</a></center>

Parameter im Querystring sind (meistens) durch einen Ampersand getrennt. Dieser muss mit &amp; maskiert werden.

Wo bitte prüfst Du ab, was Dein Skript tun soll? Warum sollte bei der Anforderung von

comments.php?mode=show&amp;id=blabla#bottom

kein INSERT ausgeführt werden? Warum sollte kein UPDATE versucht werden. Ich sehe in dem von Dir geposteten Code keinerlei Anzeichen dafür, dass Du $_GET['mode'] auswertest. Ich vermute, dass hier der Grund für die Leereinträge liegt.

Wenn Du Daten in eine Datenbank abspeichern willst, behandele sie mit den vom Datenbankmanagementsystem dafür vorgesehenen Funktionen, willst Du Daten in einem HTML-Kontext ausgeben, dann behandele sie mit htmlspecialchars().

Freundliche Grüße

Vinzenz