mattfi: PHP-Input-Skript "Datei XY laden"

Hallo,

hat jemand ein PHP-Skript, welches es dem Benutzer ermöglicht, über ein Eingabefeld einen Begriff einzugeben, der dann dazu führt, dass (in einem Unterverzeichnis) eine Datei geöffnet wird? (Im einfachsten Fall, der in meinem Anwendungsfall durchaus Sinn macht, gibt es eine Datei für jeden Suchbegriff.)

  1. n'abend,

    hat jemand ein PHP-Skript, welches es dem Benutzer ermöglicht, über ein Eingabefeld einen Begriff einzugeben, der dann dazu führt, dass (in einem Unterverzeichnis) eine Datei geöffnet wird? (Im einfachsten Fall, der in meinem Anwendungsfall durchaus Sinn macht, gibt es eine Datei für jeden Suchbegriff.)

    willst du ein fertiges script, oder hilfe, wie du deines zu programmieren hast?

    weiterhin schönen abend...

    --
    wer braucht schon großbuchstaben?
    1. Moin...

      n'abend,

      Ein fertiges, da kein Programmierer...

      willst du ein fertiges script, oder hilfe, wie du deines zu programmieren hast?

    2. Am Besten ein fertiges. Alles andere bedeutet eigentlich, dass einer einen Job erledigt, den er nicht kann.

      willst du ein fertiges script, oder hilfe, wie du deines zu programmieren hast?

      In Ermangelung von Tipps, und weil ich so ein Skript brauche, habe ich mal gesehen, was sich aus dem Netz ziehen lässt. Wie erwartet kriege ich dann irgendwann die erste Fehlermeldung und weiß nicht weiter.

      Dieses Skript bringt einen Fehler.

      Aufruf: http://www.fachterminologie.info/TestForm.php

      Skript:

      <?php
      $Fname = $_POST["Fname"];
      ?>

      <html>
      <head>
      </head>

      <body>
      <form method="post" action="<?php include($Fname.".php"); ?>">
      Begriff: <input type="text" size="12" maxlength="36" name="Fname">

      <input type="submit" value="Suche" name="submit"><br />
      </form>

      </body>
      </html>

      Was muss ich ändern? Für hilfreiche Antworten bin ich dankbar.

      1. hi,

        Dieses Skript bringt einen Fehler.
        Aufruf: http://www.fachterminologie.info/TestForm.php

        Na das ist ja auch kein Wunder ...

        <form method="post" action="<?php include($Fname.".php"); ?>">

        Warum zum Henker willst du den Inhalt der Datei als Wert des action-Attributes des Formulars ausgeben?

        Und da $fname beim ersten Aufruf noch gar nicht definiert ist, führt dass dann zu

        action="<br />
        <b>Warning</b>:  main(.php): failed to open stream: No such file or directory in <b>/srv/www/htdocs/web17/html/Fachterminologie/TestForm.php</b> on line <b>8</b><br />
        <br />
        <b>Warning</b>:  main(): Failed opening '.php' for inclusion (include_path='.:/usr/share/php') in <b>/srv/www/htdocs/web17/html/Fachterminologie/TestForm.php</b> on line <b>8</b><br />
        "

        Dass das kein sonderlich sinnvoller Wert für das action-Attribut ist, sollte dir aber wenigstens klar sein.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Na das ist ja auch kein Wunder ...

          Sag ich doch...

          Warum zum Henker willst du den Inhalt der Datei als Wert des action-Attributes des Formulars ausgeben?

          Ich bin kein PHP-Programmierer, sondern Technischer Redakteur. Ich will anderen Redakteuren und Fachübersetzern einen Gefallen tun und mehrsprachige Terminologie frei verfügbar machen.

          Und da $fname beim ersten Aufruf noch gar nicht definiert ist, führt dass dann zu

          Wenn ich jetzt wüsste, was ich daraufhin ändern muss, dann würde ich das tun...

          Dass das kein sonderlich sinnvoller Wert für das action-Attribut ist, sollte dir aber wenigstens klar sein.

          Angesichts der meterlangen Fehlermeldung drängt sich eine solche Vermutung auf... ;-)

          Back to square 1,
          mattfi

        2. Nach dem Blindes-Huhn-und-Korn-Prinzip habe ich mal gekuckt, was ich wohl aus dem ursprünglichen Script zuviel rausgeschmissen habe. Ich habe es soweit wieder hergestellt, dass dies nun der Code ist:

          <?php
           $Fname = $_POST["Fname"];
           if (!isset($_POST['submit'])) { // if page is not submitted to itself echo the form
          ?>
          <html>
          <head>
          <title>Datei aufrufen</title>
          </head>

          <body>
          <form method="post" action="<?php echo $PHP_SELF;?>">
          Begriff: <input type="text" size="36" name="Fname" value="Fachterminologie">
          <input type="submit" value="Suche" name="submit">
          </form>

          <?
          } else {
          include($Fname.".php");
          )
          ?>

          </body>
          </html>

          Jetzt kriege ich folgende Fehlermeldung: "Parse error: parse error, unexpected ')' in /srv/www/htdocs/web17/html/Fachterminologie/TestForm.php on line 19"
          Wenn ich die Klammer (die aber im Originalscript da ist) weglasse, meckert der Parser über ein '$' in der letzten Zeile (die mit dem HTML-Schluss-Tag).

          Ich bitte um Hilfe, da ich wirklich nicht weiter weiß. Danke.

          1. Hallo mattfi.

            $Fname = $_POST["Fname"];

            Diese Zuweisung ist unsinnig; du kannst im Script direkt $_POST["Fname"] verwenden.

            <form method="post" action="[code lang=php]<?php echo $PHP_SELF;?>">[/code]

            Hier wäre $_SERVER['PHP_SELF'] besser geeignet; du verlässt dich hier auf register_globals.

            <?

            Auf Short-Open-Tags solltest du besser auch verzichten

            [code lang=php]} else {

            include($Fname.".php");
            )
            ?>

            
            >   
            > </body>  
            > </html>[/code]  
            >   
            > Jetzt kriege ich folgende Fehlermeldung: "Parse error: parse error, unexpected ')' in /srv/www/htdocs/web17/html/Fachterminologie/TestForm.php on line 19"  
            > Wenn ich die Klammer (die aber im Originalscript da ist) weglasse, meckert der Parser über ein '$' in der letzten Zeile (die mit dem HTML-Schluss-Tag).  
              
            Ersetze die „)“ durch die fehlende „}“ des else-Zweiges.  
              
            Zudem solltest du überprüfen, ob der Inhalt von `$_POST["Fname"]`{:.language-php} wirklich dem entspricht, was du erwartest.  
            (Mittels [file_exists](http://de2.php.net/manual/de/function.file-exists.php) in Bezug auf das Dokumentenwurzelverzeichnis `$_SERVER['DOCUMENT_ROOT']`{:.language-php} beispielsweise.)  
              
            
            > Ich bitte um Hilfe, da ich wirklich nicht weiter weiß.  
              
            Möchtest du dies nicht ändern?  
              
              
            Einen schönen Donnerstag noch.  
              
            Gruß, Ashura  
            
            -- 
            [The End of an Era...](http://www.nightwish.com/english/lettertotarjaen.html)
            
            1. Hallo Ashura,

              das verstehe ich nicht -- soll ich Gleiches durch Gleiches ersetzen?

              Ersetze die „)“ durch die fehlende „}“ des else-Zweiges.

              Hier gilt erst recht: VERSTEHE$="Bahnhof";

              Zudem solltest du überprüfen, ob der Inhalt von $_POST["Fname"] wirklich dem entspricht, was du erwartest.

              Ich habe keine grundsätzlichen Vorbehalte. Aber weißt du, ich versuche schon seit Jahren programmiertechnische Dinge zu verstehen, die mir nützlich sind, aber verschiedene Menschen sind wohl unterschiedlich konfiguriert.
              Natürlich habe ich nicht die Kohle, um einfach einen Programmierer zu beauftragen, aber auch nicht die Zeit, wenn ich meinen Kindern irgendwie ein paar Brocken nach Hause tragen soll.

              Möchtest du dies nicht ändern?

              Ich würde gerne diese Sch...-Suchfunktion abschließen können...

              Einen schönen Donnerstag noch.

              Gruß,
              mattfi

              1. hi,

                das verstehe ich nicht -- soll ich Gleiches durch Gleiches ersetzen?

                Ersetze die „)“ durch die fehlende „}“ des else-Zweiges.

                Besorg dir eine Brille, oder vergrößere die Schrift.

                Und wenn du dann diese _unterschiedlichen_ Klammern auseinanderzuhalten gelernt hast, dann dürfte sich auch deine zweite Frage erledigt haben.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Besorg dir eine Brille, oder vergrößere die Schrift.

                  Strategie Nr. 2 hat bereits zum gewünschten Erfolg geführt (was aber doch für die Lernfähigkeit von mattfi spricht...).
                  So langsam nimmt das Ding auch Form an.

                  Jetzt bewegen mich 3 Dinge:
                  (1) Statt die Datei zu includen würde ich gerne die Eingabedatei durch die Zieldatei ersetzen (also im selben Browserfenster aufrufen). Im Internet habe ich dazu "header("Location: "); exit;" gefunden ist das der geeignete Befehl?
                  (2) Wie fange ich den Fall ab, dass ein begriff eingegeben wird, für den es keine entsprechende Datei gibt?
                  (3) Wie gehe ich mit Begriffen um, die Leerzeichen und/oder Umlaute enthalten? Dateinamen mit Umlauten / Leerzeichen? Besser wohl nicht, oder? Wenn aber nicht, wie dann?

                  Im Voraus Danke für eure Hilfe.

                  1. hi,

                    (1) Statt die Datei zu includen würde ich gerne die Eingabedatei durch die Zieldatei ersetzen (also im selben Browserfenster aufrufen). Im Internet habe ich dazu "header("Location: "); exit;" gefunden ist das der geeignete Befehl?

                    Ja, das kannst du nehmen.
                    Beachte, dass ein Location-Header einen absoluten URL inkl. Protokollangabe verlangt.

                    (2) Wie fange ich den Fall ab, dass ein begriff eingegeben wird, für den es keine entsprechende Datei gibt?

                    Prüfe vorher mit file_exists() o.ä.

                    (3) Wie gehe ich mit Begriffen um, die Leerzeichen und/oder Umlaute enthalten? Dateinamen mit Umlauten / Leerzeichen? Besser wohl nicht, oder? Wenn aber nicht, wie dann?

                    Entweder überlegst du dir ein Schema, nach dem du solche Sonderzeichen ersetzt (z.B. Leerzeichen durch _),
                    oder du kodierst solche Sonderzeichen URL-gerecht. Dabei hilft rawurlencode().

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
                    1. Danke.

                      Wieder einmal kriege ich einen Fehler ("unexpected T_ENCAPSED_AND_WHITESPACE") in der Zeile:
                      else {header("Location: 'http://www.fachterminologie.info/'.(($_REQUEST['BEGRIFF']).'.php')"); exit; }

                      Kann mir bitte jemand einen entsprechenden Ausdruck schreiben?

                      Prüfe vorher mit file_exists() o.ä.

                      Thema Dateinamen: Das schaue ich mir inzwischen an.

                      Gruß,
                      mattfi

                      1. Hallo mattfi.

                        Wieder einmal kriege ich einen Fehler ("unexpected T_ENCAPSED_AND_WHITESPACE") in der Zeile:
                        else {header("Location: 'http://www.fachterminologie.info/'.(($_REQUEST['BEGRIFF']).'.php')"); exit; }

                        Irgendwie bekomme ich den Eindruck, dass du ein Klammerfanatiker bist.

                        Fange doch schrittweise an (das else lasse ich nun einmal weg):

                        1. header();

                        2. header('Location: http://www.fachterminologie.info/');

                        3. header('Location: http://www.fachterminologie.info/'.$_REQUEST['BEGRIFF']);

                        4. header('Location: http://www.fachterminologie.info/'.$_REQUEST['BEGRIFF'].'.php');

                        Einen schönen Donnerstag noch.

                        Gruß, Ashura

                    2. Hallo,

                      else {header("Location:
                              http://".$_SERVER['HTTP_HOST']
                              .dirname($_SERVER['PHP_SELF'])
                              ."/".($_REQUEST['BEGRIFF'])
                              .".php");
                            exit; }

                      scheint soweit zu funktionieren.

                      Jetzt wird aber die neue Datei nicht aufgerufen, sondern bevor der Aufruf erfolgt (oder bevor er abgeschlossen wird), erfolgt in der Ecke der HTML-Seite, in der Formular und PHP-Aufruf platziert sind, die Fehlermeldung:

                      Warning: Cannot modify header information - headers already sent by (output started at /srv/www/htdocs/web17/html/Fachterminologie/TestForm.php:10) in /srv/www/htdocs/web17/html/Fachterminologie/TestForm.php on line 100

                      In Zeile 100 meiner HTML-Datei steht:
                              .".php");

                      Sniff...

                      1. Hallo mattfi.

                        Warning: Cannot modify header information - headers already sent by (output started at /srv/www/htdocs/web17/html/Fachterminologie/TestForm.php:10) in /srv/www/htdocs/web17/html/Fachterminologie/TestForm.php on line 100

                        Du hast dir mittlerweile die Informationen zu header angeschaut?

                        Dort steht:

                        „Beachten Sie, dass header() aufgerufen werden muss, bevor eine Ausgabe gesendet wurde, egal ob normale HTML Tags, leere Zeilen in einer Datei oder von PHP.“

                        Einen schönen Donnerstag noch.

                        Gruß, Ashura

                        1. Hallo Ashura,

                          ja, natürlich. Und ich interpretiere das so, dass ich den PHP-Aufruf an den Dateianfang (unter DOCTYPE?) stellen muss.
                          Aber wie soll er da oben funktionieren, wenn da noch gar kein FORM-Element ausgelesen worden sein kann?

                          Du hast dir mittlerweile die Informationen zu header angeschaut?

                          Gruß,
                          mattfi

                          1. Hallo mattfi.

                            ja, natürlich. Und ich interpretiere das so, dass ich den PHP-Aufruf an den Dateianfang (unter DOCTYPE?) stellen muss.

                            Dann fehlinterpretierst du.

                            Die header-Funktion muss aufgerufen werden, bevor irgend ein Zeichen ausgegeben wurde.
                            So lange dies noch nicht geschehen ist, kannst du den HTTP-Header beliebig beeinflussen.

                            Wird auch nur ein einziges Zeichen an den Client gesandt, so wird der Header implizit geschlossen und kann damit nicht mehr beeinflusst werden.

                            Aber wie soll er da oben funktionieren, wenn da noch gar kein FORM-Element ausgelesen worden sein kann?

                            Was interessiert sich PHP für form-Elemente?

                            Sende den header doch einfach nur dann, wenn dein Formular den gewünschten Wert (per POST oder GET) übermittelt.

                            Einen schönen Donnerstag noch.

                            Gruß, Ashura

                            1. Hallo Ashura,

                              du vergibst mir, aber ich kann dir nicht folgen. Was muss ich genau schreiben / weglassen / verschieben, damit dem so ist?

                              Sende den header doch einfach nur dann, wenn dein Formular den gewünschten Wert (per POST oder GET) übermittelt.

                              Gruß,
                              mattfi

                              1. Hallo mattfi.

                                Sende den header doch einfach nur dann, wenn dein Formular den gewünschten Wert (per POST oder GET) übermittelt.

                                du vergibst mir, aber ich kann dir nicht folgen. Was muss ich genau schreiben / weglassen / verschieben, damit dem so ist?

                                Frage einfach mit isset() ab, ob das von dir gewünschte übermittelt wurde und prüfe gegebenenfalls den Inhalt.
                                Erst danach lässt du den header (vor der Ausgabe) senden.

                                Einen schönen Freitag noch.

                                Gruß, Ashura

            2. Ach so, das habe ich vergessen hinzuzufügen: Ich habe natürlich versucht im Internet Infos zu bekommen, wie ich aus der Situation herauskomme. Deine Hinweise habe ich, soweit ich sie verstanden habe, hier auch schon eingearbeitet. Mein Code sieht jetzt so aus (im oder vor dem HTML- und dem HEAD-Tag befindet sich nun kein PHP mehr).

              Natürlich kriege ich wieder eine Fehlermeldung ("unexpected T_ECHO on line 13").

              <body>
               <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
               Begriff: <input type="text" size="36" name="BEGRIFF" value="Fachterminologie">
               <input type="submit" value="Suche" name="submit">
              </form>

              <?php
               if (!isset($_REQUEST['submit'])) (echo ("Bohnensuppe"); )
               else {include(($_REQUEST['BEGRIFF']).".php"); )
              ?>

              </body>

              1. Hallo,

                <?php
                if (!isset($_REQUEST['submit'])) (echo ("Bohnensuppe"); )
                else {include(($_REQUEST['BEGRIFF']).".php"); )
                ?>

                du wirfst lustig die verschiedenen Klammertypen (...) und {...} durcheinander. Die sind keineswegs austauschbar!

                Merke:

                1. Runde Klammern () werden verwendet bei Funktionsaufrufen und Kontrollstrukturen wie if(), while() etc., und soweit nötig, um Teilausdrücke zusammenzufassen (ähnlich wie bei mathematischen Termen).

                2. Eckige Klammern [] werden verwendet, um Arrays und array-ähnliche Strukturen zu indizieren.

                3. Geschweifte Klammern {} werden verwendet, um mehrere Anweisungen zu einem Block zusammenzufassen.

                So long,

                Martin

                --
                Success should be measured not so much by the position that one has reached in life,
                but by the obstacles one has overcome while trying to succeed.
    3. Verstehst du nun, globe, wieso ich ein fertiges Skript wollte?
      4 Stunden verdödelt, und nix als blöde Sprüche!

      willst du ein fertiges script, oder hilfe, wie du deines zu programmieren hast?