Steffi: planetsearch - Das angegebene Skript konnte nicht fehlerfrei aus

Hallo an Alle,

kennt jemand das Script planetsearch???

Also ich habe das Teil nach deren Anweisungen bei mir eingebaut...

Es ist so programmiert, dass Fehlermeldungen kommen, falls man das Suchfeld leer lässt, bzw. nur 1 oder 2 Buchstaben rein schreibt.

Die Fehlermeldungen funtkionieren, aber wenn ich ein Wort eingebe und auf den Button klicke kommt nur das:
Das angegebene Skript konnte nicht fehlerfrei ausgeführt werden!

Woher weiß ich jetzt, was falsch ist???

Hier der Link zu dem Suchfeld: http://www.katzenundhundetipps.de/Test/suchfeld.htm

Danke schon mal für Eure Hilfe...

LG

Steffi

  1. hallo,

    kennt jemand das Script planetsearch?

    Nein. Woher auch?

    Es ist so programmiert, dass Fehlermeldungen kommen, falls man das Suchfeld leer lässt, bzw. nur 1 oder 2 Buchstaben rein schreibt.

    Das sind keine echten Fehlermeldungen, sondern Scriptmeldungen.

    Die Fehlermeldungen funtkionieren, aber wenn ich ein Wort eingebe und auf den Button klicke kommt nur das:
    Das angegebene Skript konnte nicht fehlerfrei ausgeführt werden!

    Wichtiger als dieser Satz ist die Mitteilung, daß es sich um Error 500 handelt.

    Woher weiß ich jetzt, was falsch ist?

    Du schaust dir dein Script an, prüfst, was passieren soll, wenn ein Wort eingegeben wird, und korrigierst genau diese Stelle so lange, bis das passiert, was du gerne haben möchtest.

    Hier der Link zu dem Suchfeld: http://www.katzenundhundetipps.de/Test/suchfeld.htm

    Erstens ist das kein Link (wie das mit Links geht, steht in der Forums-FAQ), zweitens nutzt das gar nichts. Du müßtest schon den entsprechenden Teil deines Scripts posten.

    Grüße aus Berlin

    Christoph S.

    1. hallo,

      kennt jemand das Script planetsearch?

      Nein. Woher auch?

      Aus dem Internet.

      Es ist so programmiert, dass Fehlermeldungen kommen, falls man das Suchfeld leer lässt, bzw. nur 1 oder 2 Buchstaben rein schreibt.

      Das sind keine echten Fehlermeldungen, sondern Scriptmeldungen.

      Okay, bin leider nicht so firm in der Computersprache.

      Die Fehlermeldungen funtkionieren, aber wenn ich ein Wort eingebe und auf den Button klicke kommt nur das:
      Das angegebene Skript konnte nicht fehlerfrei ausgeführt werden!

      Wichtiger als dieser Satz ist die Mitteilung, daß es sich um Error 500 handelt.

      Und was bedeutet der Error 500???

      Woher weiß ich jetzt, was falsch ist?

      Du schaust dir dein Script an, prüfst, was passieren soll, wenn ein Wort eingegeben wird, und korrigierst genau diese Stelle so lange, bis das passiert, was du gerne haben möchtest.

      Wenn man etwas davon versteht, ist das bestimmt kein Problem, aber wenn ich es könnte, hätte ich hier nicht gepostet.

      Hier der Link zu dem Suchfeld: http://www.katzenundhundetipps.de/Test/suchfeld.htm

      Erstens ist das kein Link (wie das mit Links geht, steht in der Forums-FAQ), zweitens nutzt das gar nichts. Du müßtest schon den entsprechenden Teil deines Scripts posten.

      Hier ist der entsprechende Teil:

      Suchbegriffe in Array umwandeln und zählen

      $search_arr = explode(" ",$search_exp);
      $search_count = count($search_arr);

      "Dummy"-Array für Such-Array erzeugen

      $arr = array();
      $arr_all = array();

      Template laden

      $tmpl = join('', file("./tmpl/search_result.htm"));

      Bereich der Trefferanzeige aus dem Template ziehen

      preg_match_all("=[SEARCH_START](.*)[SEARCH_STOP]=siU", $tmpl, $between);

      $search_pages = 0;

      $cont_part = walk_dir($root_dir);  // Verzeichnisdurchlauf starten

      $search_pages = count($cont_part); // Anzahl der Trefferseiten

      rsort($cont_part); // Array sortieren

      for ($j=0; $j<$search_pages; $j++) { // Arrays auslesen
       list($anz_searchexp, $title, $descr, $new_path) = $cont_part[$j];
       $content = preg_replace("=[SEARCH_TITLE]=", "$title", $between[1][0]);
       $content = preg_replace("=[SEARCH_LINK]=", "$from_dir"."$new_path", $content);
       $content = preg_replace("=[SEARCH_DESC]=", "$descr", $content);
       $content = preg_replace("=[SEARCH_COUNT]=", "$anz_searchexp", $content);
       $cont_x .= $content;
      }

      // Suchergebnis zusammenstellen und anzeigen
      $tmpl = preg_replace("=[SEARCH_START](.*)[SEARCH_STOP]=siU", $cont_x, $tmpl);
      $search_exp = str_replace('\', '', $search_exp);
      $tmpl = preg_replace("=[SEARCH_WORDS]=", $search_exp, $tmpl);
      $tmpl = preg_replace("=[SEARCH_PAGES]=", $search_pages, $tmpl);

      if (empty($cont_part)) {
          $tmpl = preg_replace("=[NO_MATCH]=", $no_match, $tmpl);
      } else {
          $tmpl = preg_replace("=[NO_MATCH]=", "", $tmpl);
      }

      eval('?>' .  $tmpl);

      #################################################

      Logdatei schreiben

      foreach ($search_arr as $search_exp) {

      $zeilen = file("./_log/search_log.txt");
      $anz_zeilen = sizeof($zeilen);

      $x=0;

      Datenfile auslesen

      for ($i=0; $i<$anz_zeilen; $i++) {

      list ($search_word, $search_num) = split("\|", chop($zeilen[$i]));

      // wenn Suchbegriff gefunden wird
       if ($search_exp==$search_word) {
        $search_num++;
        $i-2;
        $x++;
       }
           $new_log .= "$search_word|$search_num\n";
      }

      // wenn der Suchbegriff nicht schon geloggt wurde
      if ($x==0) {
       $search_num = "1";
          $new_log .= "$search_exp|$search_num\n";
      }

      $data = fopen("./_log/search_log.txt","w+");
      flock($data,1);
      fwrite($data, $new_log);
      flock($data,3);
      fclose($data);
      unset($new_log);
      }
      #################################################

      Gruß

      Steffi

      Grüße aus Berlin

      Christoph S.

      1. hallo,

        kennt jemand das Script planetsearch?
        Nein. Woher auch?
        Aus dem Internet.

        Das Internet ist relativ groß. Und ich hatte bisher keinen Anlaß, es nach einem Script mit diesem Namen zu durchsuchen.

        Das angegebene Skript konnte nicht fehlerfrei ausgeführt werden!
        Wichtiger als dieser Satz ist die Mitteilung, daß es sich um Error 500 handelt.
        Und was bedeutet der Error 500?

        Dasselbe ;-) Aber es "bedeutet" das eben nur, der Wortlaut könnte auch sehr anders lauten. Diese Zeile ist lediglich eine freundliche Zutat.

        Hier ist der entsprechende Teil:
        [...]
        $cont_part = walk_dir($root_dir);  // Verzeichnisdurchlauf starten
        $search_pages = count($cont_part); // Anzahl der Trefferseiten

        Hier _könnte_ es bereits einen Einbruch geben. Dieses "walk_dir" ist möglicherweise eine Funktion, die noch irgendwoanders in deinem Script definiert worden sein müßte. Und der Wert von $root_dir ist in dem von dir jetzt angegebenen Scriptausschnitt ebenfalls nicht enthalten. Es könnte sein, daß diese Zeilen etwas verlangen, was unmöglich ist, daher der Error 500.

        if (empty($cont_part)) {
            $tmpl = preg_replace("=[NO_MATCH]=", $no_match, $tmpl);
        } else {
            $tmpl = preg_replace("=[NO_MATCH]=", "", $tmpl);
        }

        Hier hast du zumindest die Erklärung dafür, daß bei leer gelassenem Suchfeld etwas angezeigt wird.

        Logdatei schreiben

        Wunderbar. Wird denn in diese Protokolldatei etwas geschrieben, und wenn ja, was steht da drin?

        Grüße aus Berlin

        Christoph S.

        1. hier die HP zu dem Script: http://www.planetc.de

          Hier ist der entsprechende Teil:
          [...]
          $cont_part = walk_dir($root_dir);  // Verzeichnisdurchlauf starten
          $search_pages = count($cont_part); // Anzahl der Trefferseiten

          Hier _könnte_ es bereits einen Einbruch geben. Dieses "walk_dir" ist möglicherweise eine Funktion, die noch irgendwoanders in deinem Script definiert worden sein müßte.

          Hier ist nochmal das walk_dir enthalten.

          Function für den Verzeichnisdurchlauf und die Trefferermittlung

          function walk_dir($dir, $pos=2)
          {

          global $search_exp, $search_arr, $search_count, $arr, $ignore_dir, $dat_type, $root_dir, $search_area, $cont_part, $no_title, $search_pages, $arr_all;

          $handle = @opendir($dir);
               while ($file = @readdir ($handle))
               {
                  if (preg_match("=^.{1,2}$=",$file))
                  {
                    continue;
                  }

          $cut_dir = preg_replace("=$root_dir=siU", "", $dir); // Verzeichnisse zum Vergleich anpassen
            if (in_array($cut_dir, $ignore_dir)) continue; // zu ignorierende Verzeichnisse auslassen
            if (preg_match('=(_vti_cnf|_notes)=i', $cut_dir)) continue;

          if(is_dir($dir.$file))
                  {
                    walk_dir($dir.$file."/", $pos + 3);
                  }
                  else
                  {

          Und der Wert von $root_dir ist in dem von dir jetzt angegebenen Scriptausschnitt ebenfalls nicht enthalten. Es könnte sein, daß diese Zeilen etwas verlangen, was unmöglich ist, daher der Error 500.

          Das root_dir ist in der Datei config.inc.php enthalten.

          if (empty($cont_part)) {
              $tmpl = preg_replace("=[NO_MATCH]=", $no_match, $tmpl);
          } else {
              $tmpl = preg_replace("=[NO_MATCH]=", "", $tmpl);
          }

          Hier hast du zumindest die Erklärung dafür, daß bei leer gelassenem Suchfeld etwas angezeigt wird.

          Logdatei schreiben

          Wunderbar. Wird denn in diese Protokolldatei etwas geschrieben, und wenn ja, was steht da drin?

          Nein, die ist ratzputz leer.

          Kennst Du ein Script, das läuft und für einen Deppen wie mich besser zu verstehen ist?? Bzw. einfacher ist???

          Das ganze besteht aus vielen Dateien und ich weiß leider nicht so genau, was ich Dir schicken soll...

          Gruß

          Steffi

          Grüße aus Berlin

          Christoph S.

          1. hallo,

            hier die HP zu dem Script: http://www.planetc.de

            Ich empfehle dir nochmals dringlich, dir die Forums-FAQ anzuschauen, um zu erfahren, wie du hier Links schreiben solltest. Diese Lektüre erklärt dir auch, was, wie und wieviel du aus einem vorangegangenen posting zitieren solltest.

            Dieses "walk_dir" ist möglicherweise eine Funktion, die noch irgendwoanders in deinem Script definiert worden sein müßte.
            Hier ist nochmal das walk_dir enthalten.

            Erscheint mir als etwas umständlich, mag aber so angehen.

            Und der Wert von $root_dir ist in dem von dir jetzt angegebenen Scriptausschnitt ebenfalls nicht enthalten.
            Das root_dir ist in der Datei config.inc.php enthalten.

            Und welchen Wert hast du dort eingetragen?

            Kennst Du ein Script, das läuft und für einen Deppen wie mich besser zu verstehen ist?

            Es gibt jede Menge PHP-Suchscripts im Internet. Such dir eins aus. Besser ist es allerdings, wenn du PHP lernst und dir selber eins schreibst.

            Das ganze besteht aus vielen Dateien

            Nein. Es sind lediglich zwei Dateien bzw. Scripts, die die gesamte "Arbeit" machen.

            Schau dir nochmal diesen Teil deines Scrips an:

            if (empty($cont_part)) {
                $tmpl = preg_replace("=[NO_MATCH]=", $no_match, $tmpl);
            } else {
                $tmpl = preg_replace("=[NO_MATCH]=", "", $tmpl);
            }

            Der erste Teil legt fest, was das Script ausgeben soll, wenn bei der Auswertung der Eingabe kein Suchergebnis zustandekam oder die Eingabe nicht erlaubt (leer oder zuwenig Buchstaben) war. Dann soll der Wert der Variablen $no_match gemeinsam mit der eingelesenen Vorlage ausgegeben werden  -  und das passiert auch teilweise. $no_match wird in deiner config.inc.php mit dem Wert "keine Treffer" vorbelegt, das heißt, wenn ein "falsches" Suchwort eingegeben wird, das es auf deinen Seiten nicht gibt, soll eigentlich diese Anzeige "keine Treffer" kommen, aber stattdessen kommt Error 500. $tmpl kann bei leerem Formular oder zuwenig Buchstaben außer der eingelesenen Vorlage unterschiedliche Werte erhalten. Dann ist $no_match nicht vorhanden und es erscheint das, was du "Fehlermeldung" genannt hattest - und das passiert auch, es gibt keinen Error 500.
            Der zweite Teil, nach dem "else", legt fest, was angezeigt werden soll, wenn es für den Suchbegriff irgendeine Entsprechung in deinem Webangebot gibt. Dafür wird keine Variable $no_match benötigt, aber der Inhalt der Variablen $tmpl muß die gefundenen Stellen enthalten.
            Schlußfolgerung: Dort, wo deine Variable $tmpl mit dem (verarbeiteten) Wert von $search_exp gefüllt wird, muß irgendetwas "kaputt" sein. Also suche dir alle diese Stellen und schau nach, was da passieren soll. Du mußt verstehen lernen, wie dein Script arbeitet, es macht keinen Sinn, dir irgendein "funktionierendes" anderes Script anzubieten.

            Grüße aus Berlin

            Christoph S.

            1. Hello,

              Du mußt verstehen lernen, wie dein Script arbeitet, es macht keinen Sinn, dir irgendein "funktionierendes" anderes Script anzubieten.

              sehe ich auch so.
              Heißt aber auch, dass wir Steffi gerne dabei unterstützen, ein Konzept zu machen und es dann zu coden.

              Als erstes mal sollte die strikte Trennung von

              • Definitionen
              • Datenübergabe (Eingaben, Posts,...)
              • Verarbeitung und Speicherung
              • Browserausgaben

              eingeführt werden.

              Dann steigt man da nämlich auch euf einem Blick durch.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
          2. Hello,

            gib doch bitte mal eine Funktionsbeschreibung des Scriptes mit Deinen Worten.
            Was soll das Ding denn leisten?

            Es erscheint mir nämlich so, als wäre es einfacher, das Script neu zu schreiben, anstatt dieses Chaos aus Globals, Sicherheitslücken und Programmierfehlern sicher zum Laufen zu bringen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. hallo Tom,

              Es erscheint mir nämlich so, als wäre es einfacher, das Script neu zu schreiben

              Das ist die bessere Idee. Es geht ziemlich kreuz und quer da zu (ich habs mir natürlich inzwischen angeschaut), man sieht sehr deutlich, daß es ein "gewachsenes" Script ist. Das heißt: der Autor hat zu einer ursprünglich kleineren Fassung immer mal irgendwas irgendwo dazugeschrieben. Daher passieren teilweise im Konfigurationsscript Dinge, die erst im "Hauptprogramm" erledigt werden sollten, und die Überschaubarkeit des Ganzen hat sehr gelitten.

              Grüße aus Berlin

              Christoph S.

      2. Hello,

        #################################################

        Logdatei schreiben

        foreach ($search_arr as $search_exp) {

        $zeilen = file("./_log/search_log.txt");
        $anz_zeilen = sizeof($zeilen);

        $x=0;

        Datenfile auslesen

        for ($i=0; $i<$anz_zeilen; $i++) {

        list ($search_word, $search_num) = split("\|", chop($zeilen[$i]));

        // wenn Suchbegriff gefunden wird
        if ($search_exp==$search_word) {
          $search_num++;
          $i-2;
          $x++;
        }
             $new_log .= "$search_word|$search_num\n";
        }

        // wenn der Suchbegriff nicht schon geloggt wurde
        if ($x==0) {
        $search_num = "1";
            $new_log .= "$search_exp|$search_num\n";
        }

        $data = fopen("./_log/search_log.txt","w+");
        flock($data,1);
        fwrite($data, $new_log);
        flock($data,3);
        fclose($data);
        unset($new_log);
        }
        #################################################

        Woher der 500er kommt, sehe ich auch nicht auf den ersten Blick. Könnte evtl. an preg_match() liegen. Aber dass das Locking falsch ist, sehe ich auf einen Blick. Das musst Du reparieren.

        Es muss der gesamte Vorgang im Schutze des Exclusive Locks stattfinden.

        Sperre anfordern
          Daten lesen
          Daten verändern
          Daten wegschreiben
          Sperre aufheben

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau