zwerg: PHP-Fehlermeldung

Glück auf!

Ich suche in meinem Gästebuchscript bein Einträgen nach bestimmten Wörtern, die zur Ablehnung des Eintrages führen.
Bisher hat das immer wie folgt geklappt:

  
$verbot = array  
  (  
  "<a href=" ,  
  "Viagra" ,  
  "[url" ,  
  );  
  
$cuss = 0;  
  
foreach ($verbot as $v)  
 {  
 if (preg_match("/$v/i" , $eintrag))  
  {  
  $cuss = $cuss + 1;  
  }  
 if (!preg_match("/$v/i", $eintrag))  
  {  
  $cuss = $cuss + 0;  
  }  
 }  

Später prüfe ich dann, ob $cuss > 1, was zur Ablehnung des Eintrages führt.

Irgendwie bekomme ich jetzt aber neuerdings die Fehlermeldung:
"Warning: preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 4 ...", obwohl ich eigentlich nichts - zumindest nicht bewusst - an dem Script geändert habe.

Findet jmd. den Fehler?

Freundliche Grüße

zwerg Alex

  1. $verbot = array
      (
      "<a href=" ,
      "Viagra" ,
      "[url" ,
      );

      
    Mir fällt nur auf, dass du beim Array nach dem letzten Element einen Beistrich hast.
    
    1. Glück auf Finalplayer_Ryu!

      Mir fällt nur auf, dass du beim Array nach dem letzten Element einen Beistrich hast.

      Danke für den Hinweis. Das Komma habe ich entfernt. Daran lag es aber leider nicht :-(

      Freundliche Grüße

      zwerg Alex

    2. echo $begrüßung;

      Mir fällt nur auf, dass du beim Array nach dem letzten Element einen Beistrich hast.

      Das macht nichts. Kann man so notieren, gibt keinen Syntax-Fehler und auch kein neues Element. Ist aber für Copy und Paste von Zeilen hilfreich, weil man so keine Extrawurst für die letzte Zeile benötigt.

      echo "$verabschiedung $name";

    3. Hallo Finalplayer_Ryu.

      $verbot = array
        (
        "<a href=" ,
        "Viagra" ,
        "[url" ,
        );

      
      >   
      > Mir fällt nur auf, dass du beim Array nach dem letzten Element einen Beistrich hast.  
        
      Interessehalber: bist du Österreicher?  
        
        
      Einen schönen Donnerstag noch.  
        
      Gruß, Mathias  
      
      -- 
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
        
      debian/rules
      
  2. Hier mal der komplette Code, für den Fall, dass der Fehler nicht in dem v.g. Auszug zu finden ist.
    Ich weiß, ist ziemlich lang und es ist spät, aber vlt. macht sich ja doch wer die Mühe und hilft mir bei der Fehlersuche.

      
    <?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'];  
      
    $grenzwert = 1000;  
    $anzeigen = true;  
    $fehler = "";  
      
    $verbot = array  
      (  
      "<a href=" ,  
      "Viagra" ,  
      "[url"  
      );  
      
    $cuss = 0;  
      
    foreach ($verbot as $v)  
     {  
      if (preg_match("/$v/i" , $eintrag))  
      {  
      $cuss = $cuss + 1;  
      }  
      if (!preg_match("/$v/i", $eintrag))  
      {  
      $cuss = $cuss + 0;  
      }  
     }  
      
    if (empty($eintrag) && !empty($status)) $fehler .= "<li>Dein Eintrag ist leer</li>";  
    if (empty($autor) && !empty($status)) $fehler .= "<li>Du hast keinen Namen eingetragen</li>";  
    if (($cuss > 0) && !empty($status)) $fehler .= "<li>Du verwendest unerlaubte Zeichen oder W&ouml;rter</li>";  
    if (strlen($eintrag) > $grenzwert) $eintrag = substr($eintrag,0,$grenzwert);  
    if (!strpos($eintrag," ") or strpos($eintrag," " > 60)) $eintrag = wordwrap($eintrag, 60, " ", 1);  
    ?>  
      
      
        <!-- Beginn Eintragungen -->  
        <h3>G&auml;stebuch</h3>  
      
        <?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");  
         ?>  
         <p><b>So sieht dein Eintrag derzeit aus:</b></p>  
         <hr />  
         <br />  
         <p><?php echo nl2br(htmlentities($eintrag)) ?></p>  
         <p><small><b><? echo htmlentities($autor)," ", "$datum" ?></b></small></p>  
         <br />  
         <hr />  
         <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) {  
         ?>  
         <p><b>Ich freue mich auf eure Beitr&auml;ge. Ihr k&ouml;nnt diese mit dem Formular am Ende der Seite abgeben.  
         Aber beachtet bitte das <a href="impress.html">Impressum</a>, da eure Beitr&auml;ge ansonsten gel&ouml;scht werden.<br />  
         &raquo; zum <a href ="#anker"> Eingabeformular</a></b></p>  
      
      
          <hr />  
          <br />  
         <?php  
         $query = "SELECT DATE_FORMAT(datum, 'am %e. %c. %Y um %k:%i')  
         AS datum, eintrag, autor, kommentar FROM guestbook WHERE YEAR(datum) = 2007 ORDER BY guestbook.datum DESC";  
         $sql = mysql_query($query)  
         or die (mysql_error());  
         while ($ds = mysql_fetch_object($sql)) {  
          $eintrag = $ds->eintrag;  
          $autor = $ds->autor;  
          $kommentar = $ds->kommentar;  
          $datum = $ds->datum;  
          ?>  
          <p><?php echo nl2br(htmlentities($eintrag)) ?></p>  
          <p><small><b><? echo htmlentities($autor)," ", "$datum" ?></b></small></p>  
          <?php if (!empty($kommentar)) {  
           echo "<p><span style=\"font-size: 9pt;\"><br /><i>&raquo;&nbsp;<b>Kommentar</b>: " , nl2br(htmlentities($kommentar)) , "</i></span></p>";  
           } echo "";?>  
          <br />  
          <hr />  
          <br />  
          <?php  
         }  
        unset($eintrag,$autor);  
        }  
        ?>  
        <a name="anker" id="runter" >&nbsp;</a>  
        <table border="0" style="width: 500px">  
         <tr>  
         <td>  
          <form action="guestbook.php" method="post">  
           <p>  
            <br />  
            <br />  
            <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 htmlentities($eintrag) ?></textarea>  
           </p>  
           <p>  
            <input type="submit" name="status" value="Vorschau" />  
            <input type="submit" name="status" value="Eintragen" />  
           </p>  
          </form>  
         </td>  
         </tr>  
        </table>  
        <!-- Ende Eintragungen -->  
    
    

    Danke schonmal an alle, die bis hierher gelesen haben :-)

  3. Hallo zwerg.

    $verbot = array
      (
      "<a href=" ,
      "Viagra" ,
      "[url" ,
      );

    […]

    
    >   
    > Später prüfe ich dann, ob $cuss > 1, was zur Ablehnung des Eintrages führt.  
    >   
    > Irgendwie bekomme ich jetzt aber neuerdings die Fehlermeldung:  
    > "Warning: preg\_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 4 ...", obwohl ich eigentlich nichts - zumindest nicht bewusst - an dem Script geändert habe.  
    >   
    > Findet jmd. den Fehler?  
      
    Dir wurde bereits exakt gesagt, wo der Fehler steckt. In regulären Ausdrücken wird mittels „[“ eine Zeichenklasse eröffnet. Da dies hier offenbar nicht gewünscht ist, musst du dieses Zeichen mit einem Backslash maskieren.  
      
    Mich erstaunt lediglich, dass du bisher keine Warnung deswegen bekommen hast.  
      
      
    Einen schönen Donnerstag noch.  
      
    Gruß, Mathias  
    
    -- 
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
      
    debian/rules
    
    1. Glück auf Mathias!

      Dir wurde bereits exakt gesagt, wo der Fehler steckt. In regulären Ausdrücken wird mittels „[“ eine Zeichenklasse eröffnet. Da dies hier offenbar nicht gewünscht ist, musst du dieses Zeichen mit einem Backslash maskieren.

      Die Fehlermeldungen verstehe ich in den seltensten Fällen :-(
      Vielen Dank für deinen Hinweis, genau daran lag es.

      Mich erstaunt lediglich, dass du bisher keine Warnung deswegen bekommen hast.

      Naja, mich gerade auch etwas. Aber vlt. habe ich das mit der "[url" auch nur irgendwann geändert und noch nicht hochgeladen. Weiß es ehrlich gesagt nicht mehr.

      Jedenfalls nochmal vielen Dank für die späte/frühe Hilfe :-)

      Freundliche Grüße

      zwerg Alex

  4. $verbot = array
      (
      "<a href=" ,
      "Viagra" ,
      "[url" ,
      );

    $cuss = 0;

    Wofür steht "cuss"? Der Name einer Variable sollte etwas über ihre Bedeutung aussagen. Abkürzungen sind in den meisten Fällen zu vermeiden.

    foreach ($verbot as $v)

    Siehe oben. (was ist "v"? "value"?)
    Falls du vorhast, dich ernsthafter mit PHP und dem Programmieren zu beschäftigen, solltest du deinen Variablen englische Bezeichnungen geben.

    $cuss = $cuss + 1;

    Besser: ++$cuss; Tut das gleiche.

    if (!preg_match("/$v/i", $eintrag))
      {
      $cuss = $cuss + 0;
      }

    das hättest du dir auch ganz sparen können ;)

    }

      
    
    > Später prüfe ich dann, ob $cuss > 1, was zur Ablehnung des Eintrages führt.  
    >   
    > Irgendwie bekomme ich jetzt aber neuerdings die Fehlermeldung:  
    > "Warning: preg\_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 4 ...", obwohl ich eigentlich nichts - zumindest nicht bewusst - an dem Script geändert habe.  
      
    Dann war es ein Geist. Aber die Meldung sagt doch alles. "missing terminating ]" - aha, es fehlt ein schließendes "]". "[" und "]" werden angegeben um Zeichenklassen zu beschreiben. "[a-z]" sind z.B. alle Buchstaben von "a" bis "z". Und warum fehlt jetzt ein "]"? Na weil in deinem Array der vierte Eintrag ein "[" enthält. ("[url")  
    Folglich musst du dieses "[" mit einem vorangestellen Backslash maskieren.
    
    1. Glück auf Glory!

      Auch an dich vielen Dank für den Hinweis auf das vergessene Escape.

      Ferner sehr nett, dass du mich auch auf einige andere "Unfeinheiten" hingewiesen hast. Werde mir das zu Herzen nehmen :-)

      Achja, ich finde $cuss ganz passend, weil der "Filter" bei Bedarf noch um weitere "Schimpfwörter" ergänzt werden soll.

      Freundliche Grüße

      zwerg Alex

      1. Achja, ich finde $cuss ganz passend, weil der "Filter" bei Bedarf noch um weitere "Schimpfwörter" ergänzt werden soll.

        Oha, mea culpa. *das englische Wörterbuch nochmal von vorne bis hinten durchles*

    2. hallo Glory,

      Falls du vorhast, dich ernsthafter mit PHP und dem Programmieren zu beschäftigen, solltest du deinen Variablen englische Bezeichnungen geben.

      Warum denn?

      Dann war es ein Geist.

      Achso. Bei mir kommen allerdings seit 25 Jahren immer nur Holundergeister mal vorbei, mit denen ich meistens gar nix anfangen kann. Immerhin sind die Kumpels höflich und tun so, als ob sie nicht gemerkt hätten, daß ich gemerkt habe, daß sie wissen, daß ich sie für extrem langweilig halte.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
      1. hallo Glory,

        Falls du vorhast, dich ernsthafter mit PHP und dem Programmieren zu beschäftigen, solltest du deinen Variablen englische Bezeichnungen geben.

        Warum denn?

        Hilft schon deshalb, weil man an englische Namen gewöhnt ist, wenn man sich mal fremden (und somit meist) englischen Code durchliest.

        Dann war es ein Geist.

        Achso. Bei mir kommen allerdings seit 25 Jahren immer nur Holundergeister mal vorbei, mit denen ich meistens gar nix anfangen kann. Immerhin sind die Kumpels höflich und tun so, als ob sie nicht gemerkt hätten, daß ich gemerkt habe, daß sie wissen, daß ich sie für extrem langweilig halte.

        Das hat mir jetzt (nach dem Flash) den Rest gegeben. Ich bin an der Matratze horchen.

        1. hi,

          Bei mir kommen allerdings seit 25 Jahren immer nur Holundergeister mal vorbei, mit denen ich meistens gar nix anfangen kann. Immerhin sind die Kumpels höflich und tun so, als ob sie nicht gemerkt hätten, daß ich gemerkt habe, daß sie wissen, daß ich sie für extrem langweilig halte.
          Das hat mir jetzt (nach dem Flash) den Rest gegeben.

          Oh. War aber gut und verständlich formuliert, gelle?

          Ich bin an der Matratze horchen.

          Interessant. Meine ist grade mal ganz neu (vier Tage alt), da gibts leider noch keine Untermieter, auf die zu horchen sich lohnen würde :-(

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
        2. Hallo!

          Falls du vorhast, dich ernsthafter mit PHP und dem Programmieren zu beschäftigen, solltest du deinen Variablen englische Bezeichnungen geben.

          Warum denn?

          Hilft schon deshalb, weil man an englische Namen gewöhnt ist, wenn man sich mal fremden (und somit meist) englischen Code durchliest.

          Dem Ratschlag, englische Bezeichnungen zu verwenden, kann ich nur zustimmen: Es hat einige Vorteile:

          • Die Verwendung von englischen Bezeichnungen passt harmonisch in die englischen Begriffe der Programmiersprachen.

          • Bei Verwendung von Fachbegriffen kommt es schnell zu Sprachvermischungen ("geisterURL", "HauptFrame").

          • Umlaute, Sonderzeichen die ausserhalb dem "Standard-ASCII"-Zeichenvorrat liegen, kommen im englischen nicht vor.

          Ohne Weitblick betrachtet erscheint die Verwendung von deutschen Ausdruecken zwar unproblematisch; wer aber schonmal Code angeschaut hat, bei dem Bezeichner und Kommentare in der jeweiligen Landessprache verfasst waren, derer man nicht maechtig ist (weil der Programmierer sich ebenfalls gedacht hat: "Wieso englische Begriffe verwenden?"), der denkt anders darueber.
          Auch wenn ich deswegen ab und zu in das Woerterbuch schauen muss, verwende ich selbst durchgaengig die englische Sprache - selbst bei Kommentaren.