inspiron: POST submit

Hallo,
ich bin am verzweifeln.
Ich möchte mit dem "Löschen" Button "....führe diesen Codeaus!" ausführen.
Dieser Testcode zeigt mir aber die echo-Zeile nicht an. was ist falsch?

Gruß

  
<?php  
echo "	<form method=\"POST\" target=\"_self\" enctype=\"text/plain\">  
		<input type=\"submit\" name=\"submit\" value=\"L&ouml;schen\" />  
		</form>  
		";  
if (isset($_POST['submit'])) {  
    echo " Mach das endlich, führe diesen Code aus! ";  
  }  
?>  

  1. hi,

    echo " <form method="POST" target="_self" enctype="text/plain">
    if (isset($_POST['submit'])) {

    Du hast keine action-note. Z.B. könnte

    form action="/script.php"

    bewirken, dass im Script script.php die Variable $_POST['fieldname'] einen Inhalt bekommt.

    Hotti

  2. Hi!

    echo " <form method="POST" target="_self" enctype="text/plain">
    Dieser Testcode zeigt mir aber die echo-Zeile nicht an. was ist falsch?

    Das enctype-Attribut im form. Es muss auf application/x-www-form-urlencoded stehen (Default-Wert) oder multipart/form-data (bei Datei-Uploads).

    Außerdem ist das action-Attribut "required". Es kann aber auch leer sein (action=""), dann entspricht das der aktuellen URL.

    Lo!

    1. Hallo,
      Dankeschön es hat geholfen!

      Nun bin ich ein Schritt weiter.
      Mit dem Löschen-Button möchte ich Dateien vom Server löschen was ja funktioniert. Leider werden alle Dateien in dem Verzeichnis gelöscht.
      Es sollen alle Dateien aufgelistet werden und hinter jeder aufgelisteten Zeile befindet sich ein "Löschen" Button. Mit diesem möchte ich die jeweilige Datei löschen.
      Was muß ich da noch verändern?

        
      <script language="php">  
        
      $verzeichnisname = "./doku/pdf/";  
        
      $verzeichnis = opendir($verzeichnisname);  
      while($eintrag = readdir ($verzeichnis))  
      {  
        $test = $verzeichnisname . "/" . $eintrag;  
        if(is_dir($test) or (($eintrag==".htaccess") or ($eintrag=="verboten.html")))  
          {  
           /* echo "<!-- $eintrag -->\n"; */  
          }  
        else  
           {  
           echo "<tr>\n<td align=\"left\"><a href=\"doku/pdf/$eintrag\">$eintrag</a></td>\n";  
           echo "<td align=\"right\">" . filesize($test) . " Byte</td>\n";  
           echo "<td align=\"center\">";  
         	 echo "</td>\n";  
           echo "<td align=\"left\">" . strftime("%d. %b. %Y, %H:%M", filemtime($test)) . "</td>\n";  
           echo "<td align=\"center\">";  
           /* if (isset($_GET['admin'])) echo" <input type=\"submit\" value=\"L&ouml;schen\" />"; */  
        
           echo "<form method=\"POST\" target=\"_self\" enctype=\"multipart/form-data\" action=\"\">  
      		   <input type=\"hidden\" name=\"del\" value=\"$eintrag\" />  
      		   <input type=\"submit\" name=\"submit\" value=\"L&ouml;schen\" />  
      		   </form>  
      		  ";  
        
      	if (isset($_POST['submit'])) {  
      		$datei = $file;  
        
      		if(!empty($datei)) {  
      			if(file_exists('doku/pdf/' . $datei))  
      			{  
      			@unlink('doku/pdf/' . $datei);  
      			echo "Datei erfolgreich gelöscht!<br />\n";  
      			}  
      			else  
      			{  
      			echo "Datei existiert nicht mehr!<br />\n";  
      			}  
      	}  
      		}  
           }  
      }  
      closedir($verzeichnis);  
      </script>  
      
      

      1. Hi!

        Dankeschön es hat geholfen!

        Warum hast du denn das enctype-Attribut immer noch drin? Du benötigst es nur, wenn du einen Datei-Upload haben möchtest (<input type=file>), ansonsten gar nicht.

        Mit dem Löschen-Button möchte ich Dateien vom Server löschen was ja funktioniert. Leider werden alle Dateien in dem Verzeichnis gelöscht.

        Debugging! Dann sähest du vielleicht, dass der Anweisungsblock von if (isset($_POST['submit'])) in jedem Schleifendurchlauf abgearbeitet wird, weil du nicht zwischen den Submit-Buttons unterscheidest, wozu sie unterschiedliche Werte oder Namen haben müssten. Aber du hast da ein Hidden-Element, in dem bereits der Name der zu löschenden Datei steht, das du aber nicht auswertest.

        Es sollen alle Dateien aufgelistet werden und hinter jeder aufgelisteten Zeile befindet sich ein "Löschen" Button. Mit diesem möchte ich die jeweilige Datei löschen.

        Mach dir nochmal das Request-Response-Spiel zwischen Browser und Server klar, denn das was du da vermutlich vor deinem geistigen Auge hast wird in mehreren Zyklen abgearbeitet und die kann man ruhig im Ablauf getrennt behandeln. Strukturiere dein Script möglichst nach dem EVA-Prinzip:

        1. Eingabedaten auswerten
        2. Verarbeitung
        3. Ausgabe

        Das kann man nicht immer klar und deutlich voneinander trennen, oder es ist bei kleinen Scripten nicht effizient, aber anstrebenswert ist das Prinzip immer (wenn man nicht mit anderen Kalibern à la MVC-Frameworks arbeitet). Ich würde es so strukturieren: Wenn POST, dann Hidden-Eintrag löschen. Verzeichnis lesen (mit glob()). Ausgabe erstellen.

        <script language="php">

        $verzeichnisname = "./doku/pdf/";

        $verzeichnis = opendir($verzeichnisname);
        while($eintrag = readdir ($verzeichnis))
        {
          $test = $verzeichnisname . "/" . $eintrag;
          if(is_dir($test) or (($eintrag==".htaccess") or ($eintrag=="verboten.html")))
            {
             /* echo "<!-- $eintrag -->\n"; /
            }
          else
             {
             echo "<tr>\n<td align="left"><a href="doku/pdf/$eintrag">$eintrag</a></td>\n";
             echo "<td align="right">" . filesize($test) . " Byte</td>\n";
             echo "<td align="center">";
            echo "</td>\n";
             echo "<td align="left">" . strftime("%d. %b. %Y, %H:%M", filemtime($test)) . "</td>\n";
             echo "<td align="center">";
             /
        if (isset($_GET['admin'])) echo" <input type="submit" value="L&ouml;schen" />"; */

        echo "<form method="POST" target="_self" enctype="multipart/form-data" action="">
           <input type="hidden" name="del" value="$eintrag" />
           <input type="submit" name="submit" value="L&ouml;schen" />
           </form>
          ";

        if (isset($_POST['submit'])) {
        $datei = $file;

          if(!empty($datei)) {  
          	if(file_exists('doku/pdf/' . $datei))  
          	{  
          	@unlink('doku/pdf/' . $datei);  
          	echo "Datei erfolgreich gelöscht!<br />\n";  
          	}  
          	else  
          	{  
          	echo "Datei existiert nicht mehr!<br />\n";  
          	}  
        

        }
        }
             }
        }
        closedir($verzeichnis);
        </script>

        
        >   
        >   
          
          
        Lo!
        
        1. ...danke, kannst Du mir bitte zum "Debugging!" einen Tip geben?

          Gruß

          1. Hi!

            ...danke, kannst Du mir bitte zum "Debugging!" einen Tip geben?

            Zwei einfache, aber wirkungsvolle Mittel:

            var_dump($variable) oder var_dump(ausdruck) zum Anzeigen von Werten oder Ergebnissen. var_dump() ist gegenüber einem echo deutlich genauer. Bei echo kann man nicht zwischen null, false und Leerstring unterscheiden, alles erzeugt keine Ausgabe. var_dump() zeigt immer was an. Und gerade bei komplexen Strukturen (Arrays, Objekte) empfiehlt sich vorher ein <pre> auszugeben (oder in die Quelltextansicht des Browsers zu schauen).

            Meist reicht eine Kontrollausgabe schon, um den Ablauf zu verdeutlichen, beispielsweise wenn man sehen will, welcher Zweig von if-else genommen wird. Aber auch mit echo 'bin in if'; versus echo 'bin in else'; kann man sich Abläufe verdeutlichen.

            Lo!

            1. Hallo,
              danke ich habe es endlich geschafft, eins habe ich aber noch.
              Wenn ich mit einem Button eine Datei gelöscht habe, wäre es schön, wenn die Seite dann auch aktualisiert wird.

              Wie kann ich das denn realisieren?

              Gruß

              1. Hi,

                Wenn ich mit einem Button eine Datei gelöscht habe, wäre es schön, wenn die Seite dann auch aktualisiert wird.

                Wie kann ich das denn realisieren?

                In dem du die Daten in der Serverantwort auf den Formularrequest wieder ausgibst.

                Stichwort: Affenformular.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. ...mhh,
                  gibt es keine möglichkeit statt anzuzeigen "Datei erfolgreich gelöscht!";
                  dort ein Befehl zum aktualisieren der Seite einzufügen?

                  Gruß

                    
                  echo "<form method=\"POST\" target=\"_self\" action=\"\">  
                  		       <input type=\"hidden\" name=\"del\" value=\"$eintrag\" />  
                  		       <input type=\"submit\" name=\"submit\" value=\"L&ouml;schen\" />  
                  		      </form>  
                  		      ";  
                  	 echo "</td>\n";  
                  	 }  
                  }  
                  closedir($verzeichnis);  
                    
                  	if (isset($_POST['submit'])) {  
                  	  
                  		$datei = $_POST['del'];  
                  		  
                    
                  		if(!empty($datei)) {  
                  			if(file_exists('doku/pdf/' . $datei))  
                  			{  
                  			@unlink('doku/pdf/' . $datei);  
                    
                  			echo "Datei erfolgreich gelöscht!<br />\n";  
                       >>>> HIER BEFEHL SEITE AKTUALISIEREN <<<<  
                  			}  
                  			else  
                  			{  
                  			echo "Datei existiert nicht mehr!<br />\n";  
                  			}  
                  		}  
                  	}  
                  
                  
                  1. Hi!

                    gibt es keine möglichkeit statt anzuzeigen "Datei erfolgreich gelöscht!";
                    dort ein Befehl zum aktualisieren der Seite einzufügen?

                    Nein, denn an der Stelle bist du schon mitten in der Ausgabe und da kannst du nur noch Javascript einfügen, das sowas kann. Aber du strukturierst dein Projekt nicht richtig, denn sonst hättest du das Problem gleich gar nicht. Ich wies ja schon auf das EVA-Prinzip hin. Werte zuerst die Eingbedaten aus und lösch die Datei. Erstelle dann die Ausgabe, denn dann ist die gelöschte Datei nicht mehr im Dateilisting enthalten.

                    Lo!

                    1. Aber du strukturierst dein Projekt nicht richtig, denn sonst hättest du das Problem gleich gar nicht. Ich wies ja schon auf das EVA-Prinzip hin. Werte zuerst die Eingbedaten aus und lösch die Datei. Erstelle dann die Ausgabe, denn dann ist die gelöschte Datei nicht mehr im Dateilisting enthalten.

                      Lo!

                      Danke,
                      ich habe es zwar gelesen, wurde abelenkt und habe es dann vergessen.

                      Folgende Änderung funktioniert, ist das so o.k.?

                        
                      <script language="php">  
                      	  
                        if (isset($_POST['submit'])) {  
                      	    $datei = $_POST['del'];  
                      	  
                      		if(!empty($datei)) {  
                      			if(file_exists('doku/pdf/' . $datei))  
                      			{  
                      			@unlink('doku/pdf/' . $datei);  
                        
                      			echo "";  
                      			}  
                      			else  
                      			{  
                      			echo "Datei existiert nicht mehr!<br />\n";  
                      			}  
                      		}  
                      	}  
                        
                      $verzeichnisname = "./doku/pdf/";  
                        
                      $verzeichnis = opendir($verzeichnisname);  
                      while($eintrag = readdir ($verzeichnis))  
                      {  
                        $test = $verzeichnisname . "/" . $eintrag;  
                        if(is_dir($test) or (($eintrag==".htaccess") or ($eintrag=="verboten.html")))  
                          {  
                           /* echo "<!-- $eintrag -->\n"; */  
                          }  
                        else  
                           {  
                           echo "<tr>\n<td align=\"left\"><a href=\"doku/pdf/$eintrag\">$eintrag</a></td>\n";  
                           echo "<td align=\"right\">" . filesize($test) . " Byte</td>\n";  
                           echo "<td align=\"center\">";  
                         	 echo "</td>\n";  
                           echo "<td align=\"left\">" . strftime("%d. %b. %Y, %H:%M", filemtime($test)) . "</td>\n";  
                           echo "<td align=\"center\">";  
                           echo "<form method=\"POST\" target=\"_self\" action=\"\">  
                      	    <input type=\"hidden\" name=\"del\" value=\"$eintrag\" />  
                                  <input type=\"submit\" name=\"submit\" value=\"L&ouml;schen\" />  
                                 </form>  
                      	  ";  
                      	 echo "</td>\n";  
                      	 }  
                      }  
                      closedir($verzeichnis);  
                        
                      </script>  
                      
                      
                      1. Hi!

                        Folgende Änderung funktioniert, ist das so o.k.?

                        Wenn es funktioniert kann es schon mal nicht ganz verkehrt sein, oder? Verbessern kann man immer noch ...

                        $datei = $_POST['del'];

                        Es ist nicht nötig, Array-Inhalte in Variablen umzukopieren. Du kannst genauso gut gleich $_POST['del'] verwenden.

                          	if(file\_exists('doku/pdf/' . $datei))  
                          	@unlink('doku/pdf/' . $datei);  
                        

                        Hier findet keine Prüfung statt, ob sich die zu löschende Datei tatsächlich im gewollten Verzeichnis befindet. Man kann trotz Vorsatz immer noch mit Konstrukten wie ../ das Verzeichnis verlassen. Ermittle mit realpath('doku/pdf/' . $_POST['del']) den wirklichen Dateinamen und vergleiche dessen dirname() mit dem von dir vorgegebenen Verzeichnis. Außerdem kann man so immer noch Dateien wie die .htaccess löschen. Löschen ist eine Schreiboperation im Verzeichnis, egal was sich darin befindet und welche Rechte die einzelnen Dateien haben. Wenn du das nicht willst, solltest du weitere Bedingungen - vielleicht die Dateiendung - prüfen.

                        Lo!

                        1. Dankeschön!!! :-)