Fehler im Gästebuch Skript
zwerg
- datenbank
Glück auf!
Ich habe ein Script für ein Gästebuch aus einem Buch
mehr oder weniger 1 zu 1 übernommen. Ich habe lediglich
"Kleinigkeiten" im Design angepasst und <? durch <?php
angepasst.
Hier der entsprechende Link
zu meiner Gästebuchseite.
Die Vorschau funktioniert bei mir einwandfrei. Jedoch
übernimmt er bei Eintrag die Daten für eintrag, autor
und datum nicht in die Tabelle guestbook. Meldet mir aber auch
keinen Fehler.
Da ich nicht riskieren will, dass ich beim Kürzen des
Skriptes wesentliche Dinge vergesse, hier einmal das
Skript in voller Länge (ich hoffe ihr verzeiht dies
und verliert nicht allein aufgrund der Länge des Skriptes
die Lust mir zu helfen):
<!-- Verbindung zur Datenbank aufbauen -->
<?php include ("../MySQL/mysql2.inc"); ?>
<?php
function PostVar($variablen_name) {
$ergebnis = $_POST[$variablen_name];
if (get_magic_quotes_gpc()) $ergebnis = stripslashes($ergebnis);
return trim($ergebnis);
}
function format ($text) {
$ergebnis = htmlentities($text);
$ergebnis = str_replace("\r\n\r\n","<br /><br />",$text);
return $ergebnis;
}
$eintrag = PostVar("eintrag");
$autor = PostVar ("autor");
$status = $_POST['status'];
$grenzwert = 1000;
$anzeigen = true;
$fehler = "";
if (empty($eintrag)) $fehler .= "<li>Dein Eintrag ist leer</li>";
if (empty($autor)) $fehler .= "<li>Du hast keinen Namen eingetragen</li>";
if (strlen($eintrag) > $grenzwert) $eintrag = substr($eintrag,0,$grenzwert);
if (!strpos($eintrag," ") or strpos($eintrag," " > 60)) $eintrag = wordwrap($eintrag, 60, " ", 1);
?>
<!-- Eintragungen -->
<h3>Gästebuch</h3>
<br />
<?php
if (!empty($fehler)) {
$anzeigen = false;
echo "<p><b>Leider konnte dein Eintrag nicht angenommen werden:</b></p>";
echo "<ul>$fehler</ul>";
} elseif ($status == "Vorschau") {
$anzeigen = false;
$datum = date ("\a\m j. n. Y \u\m H:i");
?>
<h4>So sieht dein Eintrag derzeit aus:</h4>
<hr width="500" align="left" />
<p><?php echo format($eintrag) ?></p>
<p><small><b><? echo htmlentities($autor)," ", "$datum" ?></b></small></p>
<hr width="500" align="left" />
<p><b>Benutze bitte das Formular, wenn du deinen Eintrag bearbeiten willst.</b></p>
<?php
} elseif (status == "Eintragen") {
$query = "INSERT INTO guestbook SET
datum = now(),
eintrag = '".addslashes($eintrag)."',
autor = '".addslashes($autor)."'
";
$sql = mysql_query($query)
or die(mysql_error());
}
if ($anzeigen) {
$query = "SELECT DATE_FORMAT(datum, 'am %e. %c. %Y um %k:%i')
AS datum, eintrag, autor FROM guestbook ORDER BY datum DESC";
$sql = mysql_query($query)
or die (mysql_error());
while ($ds = mysql_fetch_object($sql)) {
$eintrag = $ds->eintrag;
$autor = $ds->autor;
$datum = $ds->datum;
?>
<p><?php echo format($eintrag)?></p>
<p><small><b><? echo htmlentities($autor)," ", "$datum" ?></b></small></p>
<hr width="500" align="left" />
<?php
}
unset($eintrag,$autor);
}
?>
<table border="0" style="width: 500px">
<tr>
<td>
<form action="guestbook.php" method="post">
<p>
<b>Dein Name:</b><br />
<input style="width: 500px;" type="text" maxlength="50" name="autor" value="<?php echo htmlentities($autor) ?>" />
</p>
<p>
<b>Dein Eintrag (max. <?php echo $grenzwert ?> Zeichen):</b><br />
<textarea style="width: 500px; height: 240px;" name="eintrag"><?php echo format($eintrag) ?></textarea>
</p>
<p>
<input type="submit" name="status" value="Vorschau" />
<input type="submit" name="status" value="Eintragen" />
</p>
</form>
</td>
</tr>
</table>
Ich wäre dankbar für sämtliche Tipps, die mir bei der Lösung
meines Problems helfen könnten.
Bitte helft mir trotz der Komplexität des Problems!
Beste Grüße
zwerg Alex
Sorry! Hier richtig verlinkt:
Link
Man ey, da les ich mir das 20x durch und finde den Fehler
nicht. Dann schreib ich das und nu finde ich in Zeile
52 selber, dass hier das "$" fehlt:
} elseif ($status == "Eintragen") {
Ich könnte mich echt im A... beißen. Sorry an alle!
Aber ich habs endlich :-)
Grüße
zwerg Alex
Moin!
Ich könnte mich echt im A... beißen. Sorry an alle!
Aber ich habs endlich :-)
Error-Reporting hätte Dir geholfen.
Dann musst Dich seltener so verrenken, kannst auch nach dem Finden des Fehlers noch schmerzfrei sitzen und sparst zudem eine Menge Zeit.
Ich würde aber im Gegensatz zu mbr zumindest während der Entwicklung nicht die Notizen abschalten. Also:
error_reporting(E_ALL);
oder
ini_set ('error_reporting', E_ALL);
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hallo fastix®, hallo Forum
sorry, falls ich mich etwas unklar ausgedrückt habe. Ich würde auch **auf jeden Fall** bei der Entwicklung die Notizen mit reinnehmen. Wollte nur darauf hinweisen, dass die Standardeinstellung von PHP zumindest die Fehler auch schon ankreidet - wäre ja auch schlimm wenn nicht - die Warnungen (oder Notices) aber eben nicht.
Allerdings handelt es sich bei dem vom OP begangenen "Fehler" aus Sicht von PHP eben nur um eine Warnung. Übrigens ist der Inhalt der Warnung beim genaueren Hinsehen vielleicht doch nicht so eindeutig, wie ich gedacht habe. Wenn ich zum Beispiel folgenden Codeschnipsel in ein skript einbaue
$a=10;
for($i=0;$i<a;$i++)
{
echo $i."<br>";
}
kommt diese Warnung
Notice: Use of undefined constant a - assumed 'a' in C:\scriptname.php on line 13
Naja, PHP vermutet etwas als Fehlerursache, was so - zumindest meistens - nicht gewollt ist. Aber immerhin findet man damit überhaupt erstmal den Fehler, der bei error_reporting(E_ALL ^ E_NOTICE); nicht bemerkt werden würde. Genug gesunden Menschenverstand, um so eine Warnung zu interpretieren muß man anscheinend voraussetzen... ;-)
Liebe Grüße
mbr
Eine Frage hätte ich doch noch.
Wenn ich das Script ohne Post durch den Link auf
guestbook.php aufrufe, zeigt er mir an, dass mein
Eintrag leer ist. Er soll aber eigtentlich
die Einträge und das Eingabeformular an deren
Ende anzeigen?
Wie muss ich das Script hierzu anpassen?
Eigentlich müsste das m.E. geschehen, ich
finde den Fehler aber nicht selbst :-(
Hi zwerg,
Wie muss ich das Script hierzu anpassen?
<?php
// Diese Variablen werden später im Script nochmal verwendet und
// sollten deshalb immer deklariert sein
$grenzwert = 1000;
$anzeigen = true;
$fehler = "";
// Na sind denn überhaupt POST Daten angekommen?
if(!empty($_POST['status']))
$eintrag = PostVar("eintrag");
$autor = PostVar ("autor");
if (empty($eintrag)) $fehler .= "<li>Dein Eintrag ist leer</li>";
if (empty($autor)) $fehler .= "<li>Du hast keinen Namen eingetragen</li>";
if (strlen($eintrag) > $grenzwert) $eintrag = substr($eintrag,0,$grenzwert);
if (!strpos($eintrag," ") or strpos($eintrag," " > 60)) $eintrag = wordwrap($eintrag, 60, " ", 1);
}
// im weitern Script nun noch überall $status durch
// $_POST['status'] ersetzen - du brauchst den Inhalt
// nicht in eine andere Variable kopieren, braucht nur
// mehr Arbeitsspeicher ;-)
// also statt if($status == "Eintragen") einfach
// if(isset($_POST['status']) AND $_POST['status'] == "Eintragen")
// die isset Abfrage kommt hinzu weil du sonst eine
// Notice Meldung von PHP bekommst - deine jetztige Lösung spuckt
// übrigens auch so eine Meldung aus, wenn du Sie dir anzeigen
// lassen würdest ;-) (s. error_reporting()).
?>
Viele Grüße aus Kanada,
~ Dennis.
Hallo, zwerg Alex
schön, dass du das Problem gelöst hast. Nur noch zwei kurze Anmerkungen (auch für das Archiv)
error_reporting(E_ALL);
Damit werden ausdrücklich alle Fehler und Warnungen zur Laufzeit des Skriptes ausgegeben. Die Standardeinstellungen von PHP entsprechen
error_reporting(E_ALL ^ E_NOTICE);
was bedeutet, dass nur Fehler angezeigt werden, die Warnmeldungen aber unterdrückt werden. Auch in deinem Fall (ein $ vergessen) wäre sonst eine Warnmeldung ausgegeben worden.
> <?php
> function PostVar($variablen_name) {
> $ergebnis = $_POST[$variablen_name];
> if (get_magic_quotes_gpc()) $ergebnis = stripslashes($ergebnis);
> return trim($ergebnis);
> }
>
> $eintrag = PostVar("eintrag");
> $autor = PostVar ("autor");
> $status = $_POST['status'];
>
Zweitens als Anregung: pruef doch gleich in der Funktion, ob die Variable überhaupt in $_POST vorhanden ist (Sonst gibt es beim error_reporting wieder Meldungen)
> <?php
> function PostVar($variablen_name) {
> $ergebnis = isset($_POST[$variablen_name])?$_POST[$variablen_name]:"";
> if (get_magic_quotes_gpc()) $ergebnis = stripslashes($ergebnis);
> return trim($ergebnis);
> }
Liebe Grüße
mbr
Glück auf mal wieder!
Kann mir jemand sagen, warum die Einträge nicht
chronologisch sortiert angezeigt werden? Trotz
dieser Zeile:
$query = "SELECT DATE_FORMAT(datum, 'am %e. %c. %Y um %k:%i')
AS datum, eintrag, autor, kommentar FROM guestbook ORDER BY datum DESC";
Wenn ich nach "id" sortiere klappt es. Kann ich das so lassen
oder ist das "unsauber"?!
$query = "SELECT DATE_FORMAT(datum, 'am %e. %c. %Y um %k:%i')
AS datum, eintrag, autor, kommentar FROM guestbook ORDER BY id DESC";
echo $begrüßung;
Kann mir jemand sagen, warum die Einträge nicht chronologisch sortiert angezeigt werden? Trotz dieser Zeile:
$query = "SELECT DATE_FORMAT(datum, 'am %e. %c. %Y um %k:%i') AS datum, eintrag, autor, kommentar FROM guestbook ORDER BY datum DESC";
Vermutlich liegt das daran, dass du dem Alias für die Berechnung den gleichen Namen wie der ihr zugrunde liegenden Spalte gegeben hast. ORDER BY sortiert vorwiegend nach der Ergebnisspalte. Versuche mal, ob ORDER BY guestbook.datum DESC hilft, also die Angabe des Tabellennamens. Wenn nicht, sehe ich nur eine Chance, wenn du einen anderen Aliasnamen nimmst.
echo "$verabschiedung $name";
Scheint zu klappen.
Danke :-)
Was wär ich ohne euch ...