Verzweiflung mit doppelter datenbankeingabe.
timon
- datenbank
Hallo,
Ich habe hier ein Problem, dass ich einfach nicht verstehe. Ich habe ein Blog-kommentar-system geschrieben, und irgendetwas stimmt da nicht. Jedesmal, wenn ich über ein eingabeformular die daten sende, wird der gewollte eintrag in die datenbank eingetragen, und danach ein leerer nicht gewollter.
erklärung:
1. Spalte: ID
2. Spalte: titel
3. Spalte: datum
4. Spalte: userid
5. spalte: übergeordneter blogeintrag
6. spalte: text
nun verstehe ich aber nicht, warum dieser leere datensatz kommt.
hier das formular:
<?
$idd = htmlspecialchars($_GET['id'],ENT_QUOTES);
echo "<form method=\"post\" action=\"comments.php?mode=insert&id=".$idd."\" name=\"postform\">";
?>
<hr>Titel:
<input type="text" name="comment_titel">
<p>
Kommentar:
<br>
<textarea name="text" cols="40" rows="5">
</textarea><hr>
<input type="submit" value="Kommentar senden">
</form>
und hier das eintragenin die datenbank:
$db = mysql_connect("localhost","*****","*****");
if (!$db) {
echo "fehler mit datenbank :(";
} else {
mysql_select_db("*****",$db);
$idd = htmlspecialchars($_GET['id'],ENT_QUOTES);
$datum = date ("F j,Y");
$var1 = substr(htmlspecialchars($_POST['comment_titel'],ENT_QUOTES),0,150);
$var2 = $_SESSION['login_id'];
$var3 = substr(htmlspecialchars($_POST['text'],ENT_QUOTES),0,150);
$post_query = mysql_query("insert into comment (ID,titel,datum,userid,welcher,text) values ('','$var1','$datum','$var2','$idd','$var3')");
$update_query = mysql_query("update news set comments = comments + 1 where id=".$idd.";");
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>
<script language=\"javascript\" type=\"text/javascript\">
<!--
window.setTimeout(\"window.open('comments.php?mode=show&id=$idd#bottom','_self')\",\"3000\");
//-->
</script>
";
mysql_close ($db);
}
vielleicht kann jemand herausfinden, woran das liegen kann...
vielen dank schon mal für die hilfe...
hast du denn eine abfrage gemacht ob mode = shot, bzw. insert ist? immerhin scheinst du die selbe Datei für lesen und schreiben zu benutzen. Und das ansich macht schon nicht so viel sinn. Mach das schreiben doch lieber in eine externe datei, das erspart dir probleme und ist ordentlicher. Geht auch schneller beim zugreifen.
Und das ID beim eintragen kannst du weglassen, da das ja eh autoincrement zu sein scheint.
Gruß Artis
Hi,
Du scheinst "uns" Code zu unterschlagen? Ich sehe nämlich nur ein Insert. Wie sollen da 2 Einträge draus entstehen? Ich sehe auch kein Select was die in dem eingebundenen Bild angezeigte Darstellung "erzeugt".
Und warum machst du ein Update in eine andere Tabelle?
Wenn du mal dein PHPMyAdmin benutzt und dir die Inhalte anschaust, existiert dann wirklich ein Eintrag mit 37?
Ciao, Frank
Hi,
»»
Wenn du mal dein PHPMyAdmin benutzt und dir die Inhalte anschaust, existiert dann wirklich ein Eintrag mit 37?
Ciao, Frank
das war ein screenshot aus phpmyadmin...
Servus,
Wenn du mal dein PHPMyAdmin benutzt und dir die Inhalte anschaust, existiert dann wirklich ein Eintrag mit 37?
das war ein screenshot aus phpmyadmin...
Keine Ahnung, stand ja nicht dabei. ;)
Aber wenn da wirklich 2 Einträge pro Eintrag gemacht werden, schickst du entweder das Formular 2x hintereinander ab und du übersiehst einen doppelten Datenbankzugriff. In dem von dir geposteten Code ist jedenfalls (imho) keine Spur der Ursache zu sehen.
Was passiert, wenn du die eine Zeile $post_query auskommentierst?
Und aus welchen Tabellen sind welche Inhalte?
Ciao, Frank
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 & maskiert werden.
Wo bitte prüfst Du ab, was Dein Skript tun soll? Warum sollte bei der Anforderung von
comments.php?mode=show&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
echo $begrüßung;
$var1 = substr(htmlspecialchars($_POST['comment_titel'],ENT_QUOTES),0,150);
Noch was: Es ist keine gute Idee, diese "Importvariablen" lokalen Variablen zuzuweisen. Das verschleiert die Herkunft.
Vorsicht! In dem Fall ist das ja keine Import-Variable mehr, sondern ein (wenn auch nicht sehr sinnvoll) bearbeiteter Wert. Und diesen in einer neuen Variable abzulegen, spricht nichts dagegen.
Ansonsten:
htmlspecialchars() ist, wie schon erwähnt, eine für SQL-Statements unpassende Funktion.
Und auch die Reihenfolge - erst htmlspecialchars(), dann mit substr() beschneiden - ist alles andere als sinnvoll, da man dabei Entities treffen und verstümmeln kann.
Wenn an einer Stelle nur Integer-Werte, wie beispielsweise in $idd, vorkommen sollen, wäre es sinnvoll, das mit intval() sicherzustellen.
echo "$verabschiedung $name";