Einträge im Formular werden nicht gelöscht!
Geri
- php
Hallo Leute,
auf einer Seite lest die DB die Einträge ein und gibt sie wieder auf der selben Seite aus.
Das Problem ist, er löscht mir nicht die Einträge im Formular wenn man auf „OK“ klickt.
Wie soll ich das am besten anstellen?
Der Quelltext:
##############################
<?php
error_reporting(E_ALL ^ E_NOTICE);
include("global.inc.php");
$GBname = trim( $_POST["GBname"] );
$GBemail = trim( $_POST["GBemail"] );
$GBwebadresse = trim( $_POST["GBwebadresse"] );
$GBtext = trim( $_POST["GBtext"] );
$dblink = mysql_connect($datahost,$datauser,$datapass);
mysql_select_db($database, $dblink);
$query = 'INSERT INTO gastbuch
(
name,
email,
www,
text
)
VALUES
(
"'.mysql_real_escape_string ($GBname).'",
"'.mysql_real_escape_string ($GBemail).'",
"'.mysql_real_escape_string($GBwebadresse).'",
"'.mysql_real_escape_string ($GBtext).'"
)';
mysql_query($query, $dblink);
$sql = "SELECT *
FROM
gastbuch
ORDER BY
zeitstempel DESC;";
$result = mysql_query($sql) OR die(mysql_error());
echo mysql_error();
?>
*********************************
<form action="137.php" method="POST">
<input name="GBname" value="<?php echo $GBname; ?>"
<input type="text" name="GBemail" value="<?php echo $GBemail; ?>"
<input type="text" name="GBwebadresse" value="<?php echo $GBwebadresse; ?>" size="40">
<textarea name="GBtext" value="<?php echo $GBtext; ?>" cols="39" rows="5"></textarea>
<input type="submit" value="Senden!"> <input type="reset" value="Zurücksetzen">
</form>
*******************************
<?php
echo "<h2>EINTRÄGE IM GÄSTEBUCH</h2><br />\n";
while($row = mysql_fetch_assoc($result)) {
echo '<table width="350" align="center" border="1"><tr><td bgcolor="#898989">';
echo $row['name']. " schrieb am ". $row['zeitstempel']." ".$row['www']."</td></tr><tr><td>".$row['text']."</td></tr></table><br>\n";
}
?>
########################################
Danke an alle für die Hilfe
gruß geri
echo $begrüßung;
auf einer Seite lest die DB die Einträge ein und gibt sie wieder auf der selben Seite aus.
Das Problem ist, er löscht mir nicht die Einträge im Formular wenn man auf „OK“ klickt.
Wenn du die Variablen nach der erfolgreichen Datenbankoperation nicht "leer machst", dann wird deren Inhalt selbstverständlich auch angezeigt, wenn man sie später mit echo darum bittet.
echo "$verabschiedung $name";
echo $begrüßung;
Wenn du die Variablen nach der erfolgreichen Datenbankoperation nicht "leer machst", dann wird deren Inhalt selbstverständlich auch angezeigt, wenn man sie später mit echo darum bittet.
echo "$verabschiedung $name";
Hallo $name.
danke für deinen tipp - echo eh klar :-)
gruß geri
Ahoi Geri,
erstens: ich hoffe du machst eine eingabe überprüfung vor dem INSERT.
zweitens: ich hoffe du prüfst ob das INSERT erfolgraich war.
du musst nur zuvor eine Kontrollvariable angeben. diese setzt du auf
true. ist nun die eingaben nicht korekt setzt du sie auf false. hat
das insert nicht funktioniert ebenso. ist die variable am ende des scripts immernoch true dann setzt $GBname usw = "";
<textarea name="GBtext" value="<?php echo $GBtext; ?>" cols="39" rows="5"></textarea>
eine Textarea hat AFAIK kein value.
<textarea name="GBtext" cols="39" rows="5"><?php echo $GBtext; ?></textarea>
MfG
Hello,
<?php
error_reporting(E_ALL) ### zum Testen immer (meistens) alles einschalten! ^ E_NOTICE);
include("global.inc.php");
$GBname = trim( $_POST["GBname"] );
$GBemail = trim( $_POST["GBemail"] );
$GBwebadresse = trim( $_POST["GBwebadresse"] );
$GBtext = trim( $_POST["GBtext"] );$dblink = mysql_connect($datahost,$datauser,$datapass);
mysql_select_db($database, $dblink);$query = 'INSERT INTO gastbuch
(
name,
email,
www,
text
)
VALUES
(
"'.mysql_real_escape_string ($GBname).'",
"'.mysql_real_escape_string ($GBemail).'",
"'.mysql_real_escape_string($GBwebadresse).'",
"'.mysql_real_escape_string ($GBtext).'"
)';
mysql_query($query, $dblink);
$sql = "SELECT *
FROM
gastbuch
ORDER BY
zeitstempel DESC;";
$result = mysql_query($sql) OR die(mysql_error());
echo mysql_error();
?>
*********************************
<form action="137.php" method="POST">
<input name="GBname" value="<?php echo $GBname; ?>"
<input type="text" name="GBemail" value="<?php echo $GBemail; ?>"
<input type="text" name="GBwebadresse" value="<?php echo $GBwebadresse; ?>" size="40">
<textarea name="GBtext" value="<?php echo $GBtext; ?>" cols="39" rows="5"></textarea>
<input type="submit" value="Senden!"> <input type="reset" value="Zurücksetzen"></form>
*******************************
<?phpecho "<h2>EINTRÄGE IM GÄSTEBUCH</h2><br />\n";
while($row = mysql_fetch_assoc($result)) {
echo '<table width="350" align="center" border="1"><tr><td bgcolor="#898989">';
echo $row['name']. " schrieb am ". $row['zeitstempel']." ".$row['www']."</td></tr><tr><td>".$row['text']."</td></tr></table><br>\n";}
?>
########################################
Du hast bisher keine Fehlerkontrolle bei den SQL-Statements
Du hast keine Steuerflußkontrolle
Du lässt es auf Notices ankommen (siehe $_POST)
Beim Erstaufruf des Scriptes (über die Adresszeile) wird ein leerer Datensatz eingetragen
Abhilfe:
übertrag aus dem Formular einen Button oder ein Hidden-Field.
Deklariere ein Array mit allen erwarteten Datenfeldern
$_data = array();
$_data['GBname']['value'] = '';
$_data['GBname']['regexp'] = '[0-9a-zA-Z]{2,}';
$_data['GBname']['required'] = 1; # 0 für optionale Eingabe,
# 1 für Pflichteingabe,
# 2 für Pflichteingabe nach Muster
$_data['GBname']['default'] = ''; # default z.B. für Radio, Select und Ckeckboxen
$_data['GBemail']['value'] = '';
$_data['GBemail']['regexp'] = '[0-9a-zA-Z]{2,}@[0-9a-zA-Z]{3,}'; ## die musst Du natürlich
$_data['GBemail']['required'] = 1; ## selber aufbauen ;-)
$_data['GBemail']['default'] = '';
...
Dann kannst Du auf diese Werte zugreifen im Formular.
Wenn nun das Script aufgerufen wird, kannst Du nachfragen
if(isset($_POST['btn']['insert']))
{
$_error = array();
foreach($_data as $name => $specs)
{
if ($specs['required'] > 0 and !isset($_POST[$name])
{
$_error[] = "Feld $name muss ausgefüllt werden";
}
elseif($specs['required'] > 0 and isset($_POST[$name] and !check($_POST['data'],$name,$_data)
{
$_error[] = "Feld $name enthält falsche Werte";
}
....
}
}
und so weiter.
Und die funktion check(Postdaten, Name des Paramters, Kontrollarray ) schreibst Du Dir dann einmal. Die überprüft nur noch den Feldwert mittels der RegExp und gibt false oder true zurück.
Auf diese Weise bekommst Du Deine Applikation auch relativ wasserdicht
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Hello,
Hallo Tom
<?php
error_reporting(E_ALL) ### zum Testen immer (meistens) alles einschalten! ^ E_NOTICE);
Habe ich weggelassen da ich es jetzt nicht für wichtig gehalten habe error_reporting(E_ALL ^ E_NOTICE);
include("global.inc.php");
was ist mit get_magic_quotes_gpc() ?
sind die Magic Quotes bei Dir ausgeschaltet?
für was brauche ich die?
$GBname = trim( $_POST["GBname"] );
$GBemail = trim( $_POST["GBemail"] );
$GBwebadresse = trim( $_POST["GBwebadresse"] );
$GBtext = trim( $_POST["GBtext"] );$dblink = mysql_connect($datahost,$datauser,$datapass);
mysql_select_db($database, $dblink);$query = 'INSERT INTO gastbuch
(
name,
email,
www,
text
)
VALUES
(
"'.mysql_real_escape_string ($GBname).'",
"'.mysql_real_escape_string ($GBemail).'",
"'.mysql_real_escape_string($GBwebadresse).'",
"'.mysql_real_escape_string ($GBtext).'"
)';Gut! Richtiges Escapen ist wichtig für das Überleben Deiner DB
ja aber wenn der Server zu streng eingestellt ist haut es damit auch nicht hin
Beispiel:
$stat="SELECT * FROM tabelle WHERE
nummer='".check_quotes($_REQUEST['nummer'])."'";
$result = mysql_query($stat);
$row=mysql_fetch_array($result);
Das sollte sicherer sein aber für diesen zweck reicht das.
mysql_query($query, $dblink);
$sql = "SELECT *
FROM
gastbuch
ORDER BY
zeitstempel DESC;";Wozu _alle_ Datensätze auslesen? reichen nicht z.B. 10 auf einmal ?
meinst du 10 auf einer Seite??
$result = mysql_query($sql) OR die(mysql_error());
echo mysql_error();
?>
*********************************
<form action="137.php" method="POST">was passiert denn wohl beim Erstaufruf des Scriptes, wenn das Formular noch nicht aufgebaut
war, also auch noch keine $_POST vorhanden waren? Der Fehler (Notice) tritt dann aber schon
oben auf
Ja wenn ich ihn nicht auschalte!
<input name="GBname" value="<?php echo $GBname; ?>"
<input type="text" name="GBemail" value="<?php echo $GBemail; ?>"
<input type="text" name="GBwebadresse" value="<?php echo $GBwebadresse; ?>" size="40">
<textarea name="GBtext" value="<?php echo $GBtext; ?>" cols="39" rows="5"></textarea>
<input type="submit" value="Senden!"> <input type="reset" value="Zurücksetzen"></form>
*******************************
<?phpecho "<h2>EINTRÄGE IM GÄSTEBUCH</h2><br />\n";
while($row = mysql_fetch_assoc($result)) {
echo '<table width="350" align="center" border="1"><tr><td bgcolor="#898989">';
echo $row['name']. " schrieb am ". $row['zeitstempel']." ".$row['www']."</td></tr><tr><td>".$row['text']."</td></tr></table><br>\n";}
?>
########################################Du hast bisher keine Fehlerkontrolle bei den SQL-Statements
doch - aber nicht hier angegeben!
Du hast keine Steuerflußkontrolle
wie soll ich das machen?
Du lässt es auf Notices ankommen (siehe $_POST)
Beim Erstaufruf des Scriptes (über die Adresszeile) wird ein leerer Datensatz eingetragenAbhilfe:
übertrag aus dem Formular einen Button oder ein Hidden-Field.
Deklariere ein Array mit allen erwarteten Datenfeldern$_data = array();
$_data['GBname']['value'] = '';
$_data['GBname']['regexp'] = '[0-9a-zA-Z]{2,}';
$_data['GBname']['required'] = 1; # 0 für optionale Eingabe,
# 1 für Pflichteingabe,
# 2 für Pflichteingabe nach Muster
$_data['GBname']['default'] = ''; # default z.B. für Radio, Select und Ckeckboxen$_data['GBemail']['value'] = '';
$_data['GBemail']['regexp'] = '[0-9a-zA-Z]{2,}@[0-9a-zA-Z]{3,}'; ## die musst Du natürlich
$_data['GBemail']['required'] = 1; ## selber aufbauen ;-)
$_data['GBemail']['default'] = '';...
Sollten ja keine Pflichtfelder sein
Harzliche Grüße vom Berg
Danke Tom für deine ausführliche Hilfe
gruß geri
Hello,
was ist mit get_magic_quotes_gpc() ?
sind die Magic Quotes bei Dir ausgeschaltet?
für was brauche ich die?
Die Einstellung "magic_quotes_gpc = on" ist PHP-Default.
Die Magic-Quotes sind die Backslashes, die PHP vor einigen Zeichen in Paramtern, die vom Client kommen, selbstständig einfügt. Es ist eine Art "Escaping für Arme", da es leider nicht zur Datenbank passt. Also muss man es entweder ausschalten oder mittels stripslashes()
http://de3.php.net/manual/de/function.stripslashes.php wieder entfernen.
Das darf man natürlich nur dann tun, wenn es auch eingeschaltet war.
Und dann sollte man es rekursiv tun.
Gut! Richtiges Escapen ist wichtig für das Überleben Deiner DB
ja aber wenn der Server zu streng eingestellt ist haut es damit auch nicht hin
Beispiel:
Das liegt dann ggf. an den PHP-eigenen Escapes, die zusätzlich vorhanden sind
Wozu _alle_ Datensätze auslesen? reichen nicht z.B. 10 auf einmal ?
meinst du 10 auf einer Seite??
Ja, maximal. Und mehr als man benötigt, sollte man aus der DB auch nicht holen lassen.
Dafür gibt es bei MySQL das wunderbare Feature 'limit $offset $count'
was passiert denn wohl beim Erstaufruf des Scriptes, wenn das Formular noch nicht aufgebaut
war, also auch noch keine $_POST vorhanden waren? Der Fehler (Notice) tritt dann aber schon
oben auf
Ja wenn ich ihn nicht auschalte!
Nein! Wenn Du ihn nicht vermeidest.
Notices sind in PHP bezüglich der Sicherheit die wichtigsten Fehlermeldungen, da sie auf Fehler hinweisen, bei denen das Script weiterläuft, währen bei einem fatal error das Script abgebrochen wird, und keinen Schaden mehr anrichten kann.
Du hast bisher keine Fehlerkontrolle bei den SQL-Statements
doch - aber nicht hier angegeben!
das ist dumm. Denn darauf achten wir hier doch meistens
Und bevor jemand die nicht eingebaut hat, bekommt er nur dusselige Antworten :-)
Du hast keine Steuerflußkontrolle
wie soll ich das machen?
Habe ich geschrieben: Ins Formular ein Hidden-Feld einbauen oder einen Button, auf dessen Esistenz geprüft wird. Die Steuerung geschieht ja durch bewusste Nutzerhandlungen und die sollten auch abgefragt werden.
[...]
Sollten ja keine Pflichtfelder sein
War ja auch nur eine Kurzbeschreibung, wie man ein komplexeres Script-Design mit _allgemeingüligen_ Funktionen aufbauen kann. Die entstehenden Funktionen kann man so immer wieder verwenden und muss sie nicht jedes mal neu schreiben.
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
echo $begrüßung;
Das [stripslashes] darf man natürlich nur dann tun, wenn es [magic quotes] auch eingeschaltet war.
Und dann sollte man es rekursiv tun.
Dafür gibt es auf der englischen Handbuchseite zu stripslashes() ein Beispiel (stripslashes_deep).
Es gibt auch ein eigenes Kapitel zu Sinn, Vor- und Nachteilen der Magic Quotes, ebenfalls mit einem stripslashes_deep-Beispiel, das sogar noch die Anwendung auf $_GET/$_POST/$_COOKIES zeigt.
echo "$verabschiedung $name";
Hello,
Dafür gibt es auf der englischen Handbuchseite zu stripslashes() ein Beispiel (stripslashes_deep).
gibts hier im Forumsarchiv auch schon lange:
http://forum.de.selfhtml.org/archiv/2003/12/t67457/#m385942
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom