zwerg: Fehler im Gästebuch Skript

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&auml;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

  1. Sorry! Hier richtig verlinkt:
    Link

  2. 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

    1. 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®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
      1. 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

  3. 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 :-(

    1. 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.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Das ist eine Ehrlichkeit, die an Blödheit grenzt. (Thomas Gottschalk)
  4. Hallo, zwerg Alex
    schön, dass du das Problem gelöst hast. Nur noch zwei kurze Anmerkungen (auch für das Archiv)

    1. Du solltest zumindest während des Entwickelns folgende Zeile am Beginn jedes Scriptes stehen haben:
      
    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.

    1. Du hast eine Funktion PostVar, die dir anscheinend die Variablen aus $_POST global verfügbar macht. Erstens die Frage: warum benutzt du die nicht auch für $status - vergessen?
      
    
    > <?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

  5. 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";

    1. 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";

    2. 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";

      1. Scheint zu klappen.
        Danke :-)
        Was wär ich ohne euch ...