Eric: Datei-Upload

0 48

Datei-Upload

Eric
  • php
  1. 0
    frankx
    1. 0
      paierlep
      1. 0
        frankx
        1. 0
          Malcolm Beck´s
          1. 0
            frankx
            1. 0
              Malcolm Beck´s
              1. 0
                dedlfix
                1. 0
                  Malcolm Beck´s
                  1. 0
                    dedlfix
                    1. 0
                      Malcolm Beck´s
                      1. 0

                        Frameworks

                        dedlfix
                        1. 0
                          Malcolm Beck´s
                          1. 0
                            dedlfix
                            1. 0
                              Malcolm Beck´s
                              1. 0
                                frankx
                                1. 0
                                  at
                                  1. 0

                                    Zend-Framework - wie gemeinsam Artikel erstellen?

                                    frankx
                                2. 0
                                  Malcolm Beck´s
                                  1. 0
                                    dedlfix
                                    1. 0
                                      frankx
                                      1. 0
                                        Malcolm Beck´s
                                        • menschelei
                                        1. 0
                                          Malcolm Beck´s
                                          • php
                                          1. 0
                                            dedlfix
                                            1. 0
                                              Malcolm Beck´s
                                              1. 0
                                                dedlfix
                                                1. 0
                                                  Malcolm Beck´s
                                                  1. 0
                                                    dedlfix
                                                    1. 0
                                                      Malcolm Beck´s
                                                      1. 0
                                                        dedlfix
                                                        1. 0
                                                          Malcolm Beck´s
                                                          1. 0
                                                            dedlfix
                                                            1. 0
                                                              Malcolm Beck´s
                                              2. 0
                                                frankx
                                          2. 0
                                            frankx
    2. 0
      Eric
      1. 0
        frankx
        1. 0
          Eric
      2. 0

        Datei-Upload - Verzeichnis und Rechtevergabe

        frankx
        1. 0
          dedlfix
          1. 0
            frankx
            1. 0
              dedlfix
  2. 0
    Rouven
    1. 0
      frankx
  3. 0
    Eric
    1. 0
      dedlfix
      1. 0
        Eric
        1. 0
          dedlfix

Ich hab versucht, ein Tutorial von dieser Seite anzuwenden und daraus ein einfaches Beispiel zu machen.
Leider klappt es nicht so wie es soll, wenn die Datei hochgeladen ist kommt wieder das Formular. Hier mein Code, ich hoffe es sieht jemand den Fehler:

<html>  
<head>  
<title>Dateiupload-Test</title>  
</head>  
<body>  
  
<?php  
header("Content-type:text/html;charset=utf-8");  
  
if(isset($_POST['submit']) && $_POST['submit']=="Senden")  
  {  
  
  //Formular wurde abgesendet  
    echo $_FILES['datei']['size'];  
  
  }  
  else  
  {  
  //Formular muss angezeigt werden  
  
?>  
  
  <form enctype="multipart/form-data" action="<?php echo htmlspecialchars ($_SERVER['PHP_SELF']); ?>" method="post">  
  <input type="hidden" name="max_file_size" value="10000000">  
  Datei auswählen:<br> <input name="datei" type="file"><br><br>  
  <input type="submit" value="Senden">  
  </form>  
  
  
  
  <?php } ?>  
  
  
</body>  
</html>

Vielen Dank für eure Bemühungen,
Eric

  1. Hellihello

    weil du als "action" die seite selbst angibst. Interessant ja eher dann, was auf dem Server passiert.

    sowas in der art habe ich letztlich ge"proggt" (;-).

      
    <?php  
     if (isset($_POST['submit']) && $_POST['submit']=="upload") {  
      $upload_try = true;  
      $upload_success = false;  
     }  
     if ($upload_try  
      && isset($_FILES['thefile']['tmp_name'])  
       && move_uploaded_file($_FILES['thefile']['tmp_name'],$_FILES['thefile']['name'])  
      ) {  
      $upload_success = true;  
     }  
    ?>  
     <form enctype="multipart/form-data" action="" method="post">  
      <input type="hidden" name="max_file_size" value="1000000">  
      file zum hochladen: <input name="thefile" type="file">  
      <input type="submit" name="submit" value="upload" id="submit">  
     </form>  
     <?php if ($upload_try):;?>  
      <p style="color:blue;border:1px solid blue;padding:1em;">  
       <?php if ($upload_success) :;?>  
        Die Datei  
        "<strong><?= $_FILES['thefile']['name'];?> </strong>"  
        wurde hochgeladen. </p>  
       <? elseif($_FILES['thefile']['name']==""):;?>  
         Bitte Dateinamen angeben! </p>  
       <? else:;?>  
         Fehler beim Kopieren, Mail an den Admin: <a href="mailto:mail@exmaple.de?&Subject=Fehler beim Upload">mai@example.com</a></p>  
       <?php endif;?>  
     <?php endif;?>  
      
      
    
    

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. Nur so als verständinisfrage (für mich ...)

      Was ist das?

      <?php if ($upload_try):;?>
        <p style="color:blue;border:1px solid blue;padding:1em;">
         <?php if ($upload_success) :;?>
          Die Datei
          "<strong><?= $_FILES['thefile']['name'];?> </strong>"
          wurde hochgeladen. </p>
         <? elseif($_FILES['thefile']['name']==""):;?>
           Bitte Dateinamen angeben! </p>
         <? else:;?>
           Fehler beim Kopieren, Mail an den Admin: <a href="mailto:mail@exmaple.de?&Subject=Fehler beim Upload">mai@example.com</a></p>
         <?php endif;?>
      <?php endif;?>

      Vorallem die Sache mit :; ist mir nicht bekannt...

      wäre es nicht schöner wenn es so ist (ich hoffe ich mach jetzt keine flüchtigkeitsfehler...):

      <?php  
       if($upload_try)  
       {  
         echo '<p style="color:blue;border:1px solid blue;padding:1em;">';  
        
         if($upload_success)  
         {  
           echo 'Die Datei <strong>'.$_FILES['thefile']['name'].' </strong> wurde hochgeladen. </p>';  
         }  
         else if($_FILES['thefile']['name']=="")  
           echo 'Bitte Dateinamen angeben! </p>';  
         //etc...  
       }  
        
      ?>
      
      1. Hellihello

        Vorallem die Sache mit :; ist mir nicht bekannt...

        Alternative Syntax.

        wäre es nicht schöner wenn es so ist (ich hoffe ich mach jetzt keine flüchtigkeitsfehler...):

        Nee, eine Templatsprache macht ja Sinn, weil ich HTML als solches schreiben kann, wo es frei von dynamischer Logik ist. Und es nicht in ein echo "wrappen" muss mit der Nachsorge bezüglich Escapisierung und dem Einbinden von Code", abgesehen vom fehlenden Syntaxhighlighting.

        Dank und Gruß,

        frankx

        --
        tryin to multitain  - Globus = Planet != Welt
        1. hi,

          Nee, eine Templatsprache macht ja Sinn, weil ich HTML als solches schreiben kann, wo es frei von dynamischer Logik ist. Und es nicht in ein echo "wrappen" muss mit der Nachsorge bezüglich Escapisierung und dem Einbinden von Code", abgesehen vom fehlenden Syntaxhighlighting.

          Da greife ich gerne auf <<<EOT EOT; zurück. Das Scipt erledigt seine arbeit, alle Variablen werden gefüllt und <<<EOT :)

          echo <<<EOT  
           <form enctype="multipart/form-data" action="" method="post">  
            <input type="hidden" name="max_file_size" value="1000000">  
            file zum hochladen: <input name="thefile" type="file">  
            <input type="submit" name="submit" value="upload" id="submit">  
           </form>  
            $upload_try  
            $upload_try_style  
            $upload_success  
            $error_meldung  
          EOT;
          

          Der Vorteil ist, die fertigen Variablen können auch direkt an ein Template (.tpl) übergeben werden.

          holla holla

          1. Hellihello

            heredoc hat beim Syntaxhighlighting ja das selbe "Problem".

            echo <<<EOT

            <form enctype="multipart/form-data" action="" method="post">
              <input type="hidden" name="max_file_size" value="1000000">
              file zum hochladen: <input name="thefile" type="file">
              <input type="submit" name="submit" value="upload" id="submit">
            </form>
              $upload_try
              $upload_try_style
              $upload_success
              $error_meldung
            EOT;

            
            >   
            > Der Vorteil ist, die fertigen Variablen können auch direkt an ein Template (.tpl) übergeben werden.  
              
            Mh, kapier ich nicht ganz. Bei der Variante mit der alternativen Syntax handelt es sich ja im Grunde bereits um das Template. Zend-Framework "macht" das auch so, wenn ich das recht sehe, also in den Beispielen zumindest.  
              
              
            Dank und Gruß,  
              
            [frankx](http://community.de.selfhtml.org/visitenkarten/view.php?key=82)
            
            -- 
            [tryin to](http://sauer-ernst.de) [multitain](http://multitain.de)  - Globus = Planet != Welt 
            
            1. hi,

              heredoc hat beim Syntaxhighlighting ja das selbe "Problem".

              Das stimmt allerdings.

              Mh, kapier ich nicht ganz. Bei der Variante mit der alternativen Syntax handelt es sich ja im Grunde bereits um das Template.

              Meine Scripte erledigen ihre arbeit vor der Ausgabe ; mit Vorteil meinte ich, dass es übersichtlicher aussieht, für mich zumindest.

              Zend-Framework "macht" das auch so, wenn ich das recht sehe, also in den Beispielen zumindest.

              Soweit bin ich noch nicht, Frameworks kommen noch ... Hoffe ich :)

              holla holla

              1. echo $begrüßung;

                @frankx:

                Mh, kapier ich nicht ganz. Bei der Variante mit der alternativen Syntax handelt es sich ja im Grunde bereits um das Template.

                Nur das ; bei <?php if (bedingung): ;?> und den anderen Teilen (else, endif) ist überflüssig. Zum einen benötigt man vor dem schließenden ?> kein ; mehr, zum anderen erzeugst du bei if und else damit nur eine zusätzliche leere Anweisung.

                Meine Scripte erledigen ihre arbeit vor der Ausgabe ; mit Vorteil meinte ich, dass es übersichtlicher aussieht, für mich zumindest.

                Das ist ja im prinzip auch gut so. Nur gibt es eben auch bei der Ausgabe etwas Logik, die man dann ruhig im Ausgabe-Teil notieren kann. Ein Beispiel wäre das Ausgeben eines Arrays mit Daten, die du vorher zusammengetragen hast. Du könntest aus dem Array einen auszugebenden String auch "vor der Ausgabe" erzeugen, nur hast du dann vielleicht Ausgabelogik im Geschäftslogikteil untergebracht. Stattdessen könntest du das Auseinandernehmen und kontextgerechte Bearbeiten für die Ausgabe im Template-Teil unterbringen. PHP ist als Template-System gut geeignet, als ein solches ist es ja konzipiert. Sag nicht, das wäre unübersichtlich. Übersichtlichkeit ist größtenteils eine Frage der Schreibweise.

                Zend-Framework "macht" das auch so, wenn ich das recht sehe, also in den Beispielen zumindest.
                Soweit bin ich noch nicht, Frameworks kommen noch ... Hoffe ich :)

                Dann werden dir Dinge wie das Model-View-Controller-Prinzip über den Weg laufen. Das trennt nach Datenhaltung, wofür das Model zuständig ist, die View für Ausgabe inklusive Ausgabelogik und den Controller, der dafür sorgt, dass die Daten gemäß der Anforderung in die richtigen Kanäle kommen und gegebenenfalls noch bearbeitet werden.

                echo "$verabschiedung $name";

                1. hi,

                  Du könntest aus dem Array einen auszugebenden String auch "vor der Ausgabe" erzeugen, nur hast du dann vielleicht Ausgabelogik im Geschäftslogikteil untergebracht.

                  Das habe ich auch derzeit so gelöst, nur habe ich keine andere Möglichkeit, da während der Abarbeitung des Scriptes Variablen „On the Fly“ geändert werden.
                  Die Änderungen nehme ich lieber im Programm vor statt während der Ausgabe, ist leichter für mich.

                  Sag nicht, das wäre unübersichtlich. Übersichtlichkeit ist größtenteils eine Frage der Schreibweise.

                  Das stimmt, unübersichtlich liegt in der Hand des Programmierers.
                  Ich hab mal meine derzeitige index.php aus meinem CMS hochgeladen, wenn du lust hast, könntest du ja mal drüber schauen.
                  Die Funktionen, die vereinzelte Aufgaben übernehmen lasse ich mal außen vor, da sie nur ein Paar Ersetzungen der Variablen vornehmen und nicht „so wichtig“ sind.

                  http://start-navi.de/beispiele/source-index.php

                  Dann werden dir Dinge wie das Model-View-Controller-Prinzip über den Weg laufen. Das trennt nach Datenhaltung, wofür das Model zuständig ist, die View für Ausgabe inklusive Ausgabelogik und den Controller

                  Ich hab mir neulich Zend runtergeladen aber leider nicht zum laufen gekriegt ; was mich aber am meisten beschäftigt ist, was die Aufgabe eines Frameworks ist, was macht so ein Framework und in wieweit ist es nützlich für mich?

                  holla holla

                  1. echo $begrüßung;

                    Ich hab mal meine derzeitige index.php aus meinem CMS hochgeladen, wenn du lust hast, könntest du ja mal drüber schauen.
                    http://start-navi.de/beispiele/source-index.php

                    Ich meinte eher, dass man auch ohne eine extra Template-Engine übersichtlich HTML und den PHP-Code der Ausgabelogik mischen kann. Das ist ja da nicht der Fall, weil du Smarty den Ausgabeteil überlasst.

                    Was mir aber aufgefallen ist. Für Einrückungen hatte ich in meinen Anfangstagen auch nur ein Zeichen verwendet, weil der freigehaltene linke Platz ja Verschwendung ist und von der Nutzbreite abgeht. Doch das erwies sich als nicht wirklich hilfreich beim Lesen. Zwei Zeichen ist mein Optimum, ein guter Kompromiss zwischen Lesbarkeit und Platzverbrauch.

                    Die Template-Variablen würde ich nicht einzeln rumliegen lassen, sondern ein assiziatives Array dafür anlegen. Das kann man auch Smartys assign() übergeben.

                    if ($kein_badword_in_request_uri == true)

                    "Wenn es wahr ist, dass $kein_badword_in_request_uri wahr ist" ist ja schon umständlich formuliert, aber

                    $site_exists = ($aktuelle_gruppe == true) ? true : false;

                    "Wenn es wahr ist, dass $aktuelle_gruppe wahr ist, dann setz $site_exists auf wahr ansonsten falsch" kann man kaum überbieten. Ein

                    $site_exists = $aktuelle_gruppe;

                    reicht, wenn $aktuelle_gruppe eine boolsche Aussage enthält. Ansonsten kann man typecasten, um garantiert ein Boolean zu erhalten.

                    $site_exists = (bool)$aktuelle_gruppe;

                    Ein Vergleich mit true ist nur dann sinnvoll, wenn man einen Vergleich mit Typberücksichtigung (===) braucht, beispielsweise bei strpos().

                    Ein SQL-Statement mit LIMIT 1 braucht keine Abfrageschleife. Das verwirrt nur, wenn man noch dazu in dieser ein

                    header("HTTP/1.1 200 ok");

                    findet und sich erstmal fragt: "Warum will er das denn mehrfach ausgeben?" Ein einfaches if auf das fetch-Ergebnis ist ausreichend und verständlicher.

                    Ich hab mir neulich Zend runtergeladen aber leider nicht zum laufen gekriegt ; was mich aber am meisten beschäftigt ist, was die Aufgabe eines Frameworks ist, was macht so ein Framework und in wieweit ist es nützlich für mich?

                    Ein Framework ist ein Rahmen, der dir Zugriff auf diverse Funktionalität gibt, die er mitliefert und die du immer wieder benötigst, um eine Anwendung aufzusetzen. So ein Rahmen zwingt dich auch mehr oder weniger, eine Form einzuhalten, wobei schlechte Framworks sie dir auch aufzwingen. Am Anfang steht wie bei jedem neuen Ding eine Einarbeitungszeit. Doch dann fügst du einfach nur noch deine Inhalte und Logik in den Rahmen ein und bist "schon" fertig.

                    echo "$verabschiedung $name";

                    1. hi,

                      Ich meinte eher, dass man auch ohne eine extra Template-Engine übersichtlich HTML und den PHP-Code der Ausgabelogik mischen kann. Das ist ja da nicht der Fall, weil du Smarty den Ausgabeteil überlasst.

                      Smarty habe ich auch erst seit knapp einer Woche, vorher hatte ich das „Template“ am ende des Scriptes mittels <<<EOT EOT; ausgegeben.
                      Da Smarty aber seit längerem eine Magische Anziehungskraft auf mich ausgeübt hat, habe ich es einfach mal ausprobiert.

                      Zwei Zeichen ist mein Optimum, ein guter Kompromiss zwischen Lesbarkeit und Platzverbrauch.

                      Danke für den Tipp ; in diesem Punkt war ich sehr unschlüssig, mit Zwei Zeichen sieht es sehr gut aus.

                      Die Template-Variablen würde ich nicht einzeln rumliegen lassen, sondern ein assiziatives Array dafür anlegen. Das kann man auch Smartys assign() übergeben.

                      Ich hatte mich noch nicht richtig in Smarty eingearbeitet, Danke für den Tipp, das habe ich gleich umgesetzt (ich hoffe mal, ich habe es richtig angewendet).

                      if ($kein_badword_in_request_uri == true)
                      "Wenn es wahr ist, dass $kein_badword_in_request_uri wahr ist" ist ja schon umständlich formuliert, aber

                      Achja, erwischt  :) Das war mir auch schon aufgefallen, war aber zu Faul zum korrigieren.

                      Ein
                        $site_exists = $aktuelle_gruppe;
                      reicht, wenn $aktuelle_gruppe eine boolsche Aussage enthält.

                      Das Funktioniert, war mir nicht bewusst, bei Gelegenheit habe ich noch ein paar Korrekturen vorgenommen, sieht jetzt ein wenig übersichtlicher aus.

                      Ein SQL-Statement mit LIMIT 1 braucht keine Abfrageschleife. Das verwirrt nur, wenn man noch dazu in dieser ein
                        header("HTTP/1.1 200 ok");
                      findet und sich erstmal fragt: "Warum will er das denn mehrfach ausgeben?"

                      Wieder erwischt, auch korrigiert, ich hatte mich die Tage mit der Optimierung der Tabellen beschäftigt und die index.php kaum berührt, Danke dass du mal drüber geschaut hast.

                      So sieht es jetzt aus.

                      Ein Framework ist ein Rahmen, der dir Zugriff auf diverse Funktionalität gibt, die er mitliefert und die du immer wieder benötigst, um eine Anwendung aufzusetzen. Am Anfang steht wie bei jedem neuen Ding eine Einarbeitungszeit.

                      Hast du vielleicht einen Tipp welches Framework sich für „einfache Webseiten“ eignet und mit einem deutschsprachigem Tutorial ausgestattet ist?

                      holla holla

                      1. echo $begrüßung;

                        Ein Framework ist ein Rahmen, der dir Zugriff auf diverse Funktionalität gibt, die er mitliefert und die du immer wieder benötigst, um eine Anwendung aufzusetzen. Am Anfang steht wie bei jedem neuen Ding eine Einarbeitungszeit.
                        Hast du vielleicht einen Tipp welches Framework sich für „einfache Webseiten“ eignet und mit einem deutschsprachigem Tutorial ausgestattet ist?

                        Als PHP-Framework ist mir nur das Zend Framework näher bekannt (gewesen). (PEAR ist ja kein Framework in dem Sinne.) Das ZF ist vor allem ein modernes, das keine PHP4-Altlasten bedienen muss. Für "einfache Webseiten" eignen sich sicherlich alle Frameworks. Es sind eher die individuellen Anwendungsfälle, die Schwierigkeiten machen können, wenn man sie mit dem gewählten Framwork umzusetzen versucht. Beispielsweise ist Django ein gutes Framework für Python. Einfache Websites sind schnell aufgesetzt, auch bringt es ein Admin-Interface für die Datenhaltung mit. Aber wenn man mehr als eine Datenbank braucht, ist man an eine Grenze gestoßen, denn von Haus aus lässt sich pro Anwendung nur eine konfigurieren.

                        echo "$verabschiedung $name";

                        1. hi,

                          Als PHP-Framework ist mir nur das Zend Framework näher bekannt (gewesen).

                          Über Zend hatte ich mich garnicht näher schlau gemacht, da gibt es ein sehr Ausführliches Referenzhandbuch, daran habe ich ja Ordentlich was zu kauen ;)

                          Da bin ich mal gespannt, was so ein Framework alles macht.

                          Beispielsweise ist Django ein gutes Framework für Python. Einfache Websites sind schnell aufgesetzt, auch bringt es ein Admin-Interface für die Datenhaltung mit.

                          Ist das so eine art CMS oder wie darf ich das verstehen?

                          Aber wenn man mehr als eine Datenbank braucht, ist man an eine Grenze gestoßen, denn von Haus aus lässt sich pro Anwendung nur eine konfigurieren.

                          Das Problem werde ich wohl in näherer Zukunft nicht haben  ;)

                          holla holla

                          1. echo $begrüßung;

                            Da bin ich mal gespannt, was so ein Framework alles macht.
                            Ist das so eine art CMS oder wie darf ich das verstehen?

                            Man kann ein Framework schon mit einem CMS vergleichen. Allerdings kommen nicht allzu viele Gemeinsamkeiten dabei raus. Ein Framework ist nicht nur auf die Pflege mehr oder weniger statischer Daten ausgelegt. Es setzt eigentlich noch weiter unten an. Du machst wie beim Erstellen normaler Scripte den Hauptteil selbst, aber die Werkzeuge sind schon deutlich spezialisierter als es das nackte PHP mitbringt. Einige Dinge beschränken sich auf das Spezifizieren von Eigenschaften. Für ein Formular definierst du, welche Felder vorhanden sind, welcher Art Daten eingegeben werden dürfen und den Rest erledigt das Formularhandling des Frameworks. Du schreibst die formalen Prüfroutinen nicht mehr selbst sondern nimmst die vorhandenen. Du kannst dich dann um die Verarbeitung der Daten kümmern und sparst dir nicht nur die Zeit der Implementierung sondern auch der Prüfung auf gewünschte und gegen unerwünschte Arbeitsweise. Lediglich die Prüfung gemäß deiner Geschäftslogik musst du selbst implementieren.

                            Das war nur ein möglicher Aspekt eines Frameworks. Schnupper einfach mal rein, und bekomme ein Gefühl, was so ein Framework zu leisten vermag.

                            echo "$verabschiedung $name";

                            1. hi,

                              Das war nur ein möglicher Aspekt eines Frameworks. Schnupper einfach mal rein, und bekomme ein Gefühl, was so ein Framework zu leisten vermag.

                              Das werde ich machen, probieren geht ja bekanntermaßen über das Studieren hinaus.

                              Danke für die Tipps und die Hilfe.

                              holla holla

                              1. Hellihello Zusammen,

                                Das war nur ein möglicher Aspekt eines Frameworks. Schnupper einfach mal rein, und bekomme ein Gefühl, was so ein Framework zu leisten vermag.

                                Das werde ich machen, probieren geht ja bekanntermaßen über das Studieren hinaus.

                                Zend-Framework hinter den Kulissen ist nach wie vor für mich noch nicht ganz nachvollziehbar. Wobei die Fragen dann schon eher ins Detail gehen (s.a. http://forum.de.selfhtml.org/archiv/2008/8/t175534/#m1154285 und http://forum.de.selfhtml.org/archiv/2008/9/t177101/#m1166105).

                                Schlussendlich bleibt aber mein Gedanke, dass eine kleine Einführung hier in selfhtml gut platziert wäre (s.a. http://forum.de.selfhtml.org/archiv/2008/9/t176360/#m1160402), oder vielleicht auch eine ausbaufähige. Ein bisschen könnte ja sogar ich schon verfassen, aber bestimmt oder vermutlich blieben da noch Fragen offen, die ich erst in einiger Zeit beantworten könnte. Gibts denn die Möglichkeit, Artikel in Gruppenarbeit zu erstellen?  Sozusagen: ich leg mal einen Grundstein, formuliere Fragen da rein, dedlfix kann da bei der ein oder anderen vielleicht behilflich sein und Malcolm liest gegen und sagt immer, was er immer noch nicht kapiert oder wie ers besser kapieren würde und oder.

                                Die Freunde des ZF sind hier ja sowieso ausgeprochen rar gesät (s.a. http://forum.de.selfhtml.org/archiv/2008/8/t175534/#m1154676.

                                Dank und Gruß,

                                frankx

                                --
                                tryin to multitain  - Globus = Planet != Welt
                                1. Hallo.

                                  Gibts denn die Möglichkeit, Artikel in Gruppenarbeit zu erstellen?  Sozusagen: ich leg mal einen Grundstein, formuliere Fragen da rein, dedlfix kann da bei der ein oder anderen vielleicht behilflich sein und Malcolm liest gegen und sagt immer, was er immer noch nicht kapiert oder wie ers besser kapieren würde und oder.

                                  Ihr müsstest doch nur einen Thread -- vielleicht diesen hier -- am laufen halten.
                                  MfG, at

                                  1. Hellihello at,

                                    Ihr müsstest doch nur einen Thread -- vielleicht diesen hier -- am laufen halten.

                                    Im Grunde schon, aber das hieße ja, Überarbeitungen immer neu zu Posten.

                                    Dank und Gruß,

                                    frankx

                                    --
                                    tryin to multitain  - Globus = Planet != Welt
                                2. hi,

                                  ich leg mal einen Grundstein, formuliere Fragen da rein, dedlfix kann da bei der ein oder anderen vielleicht behilflich sein und Malcolm liest gegen und sagt immer, was er immer noch nicht kapiert oder wie ers besser kapieren würde und oder.

                                  Ich bin gerne dabei, nur in den kommenden Tagen werde ich nichts machen können, ich leide seit gestern an unerklärlichen Rückenschmerzen.

                                  Heute besuche ich erstmal irgendeinen Arzt (was für ein Arzt ist für den Rücken zuständig?), dann weiss ich, ob ich dabei bin oder vorerst nicht.
                                  Aber ein Artikel auf SELFHTML wäre definitiv nicht verkehrt, am besten mit kleinen beispielen, was man damit alles machen kann.

                                  holla holla

                                  1. echo $begrüßung;

                                    Heute besuche ich erstmal irgendeinen Arzt (was für ein Arzt ist für den Rücken zuständig?),

                                    Gemäß Hausarztmodell ist ebenjener dein erster Ansprechpartner. Der überweist dich, wenn er es nicht selbst hinbekommt an den teureren Spezialisten.

                                    Aber ein Artikel auf SELFHTML wäre definitiv nicht verkehrt, am besten mit kleinen beispielen, was man damit alles machen kann.

                                    Der Framework-Artikel-Wunsch liegt vor allem in eurer derzeitigen Interessenslage begründet und generell ist dagegen nichts einzuwenden. Ich sehe jedoch dringenderen Bedarf an einem Artikel zur grundsätzlichen Lösungsfindung oder zumindest -vorklärung im Allgemeinen (beispielsweise mittels Kontrollausgaben). Diese Grundlagen scheinen mir wesentlich öfter zu fehlen, wenn ich die Anzahl der Fragen, bei denen man mit einfachen Fehlersuchstrategien deutlich weiter gekommen wäre mit denen die mit Frameworkempfehlungen beantwortet werden können vergleiche. In Anfängertutorials sah ich solche Abschnitte bisher noch nicht. Zu "Zend Framework Tutorial" findet Google 220.000 Seiten und selbst auf deutsch immerhin noch 8000. Ist da wirklich ein weiteres nötig?

                                    Auch wie man Struktur in Wald- und Wiesen-Scripte bringt wäre wichtig, denn sich selbst erstmal zu organisieren ist nicht nur Voraussetzung für das erfolgreiche Verwenden von "Framework-Monstern" sondern auch für die Wartbarkeit von Scripten mittlerer Größe.

                                    Und (fehlerhafter) Umgang mit Zeichenkodierungen ist auch ein beliebtes Thema zu dem ich nichts Verweisbares im Tutorial-Format kenne.

                                    Diese Artikel-Ideen hege ich schon eine Weile, nur ....................... [1]

                                    [1] hier bitte Ausrede einfügen.

                                    echo "$verabschiedung $name";

                                    1. Hellihello

                                      Der Framework-Artikel-Wunsch liegt vor allem in eurer derzeitigen Interessenslage begründet und generell ist dagegen nichts einzuwenden. Ich sehe jedoch dringenderen Bedarf an einem Artikel zur grundsätzlichen Lösungsfindung oder zumindest -vorklärung im Allgemeinen (beispielsweise mittels Kontrollausgaben). Diese Grundlagen scheinen mir wesentlich öfter zu fehlen, wenn ich die Anzahl der Fragen, bei denen man mit einfachen Fehlersuchstrategien deutlich weiter gekommen wäre mit denen die mit Frameworkempfehlungen beantwortet werden können vergleiche.

                                      Das kann wohl sein. Für mich ist nicht wirklich klar, wie man gemeinsam an einem Artikel arbeiten könnte. Wenn der Kreis der Mitwirker überschaubar ist, kann man ja auch auf irgendeinem Webspace das immer wieder hochladen, runterladen, hochladen die neue Version. Möglichst schon im Forums-Tutorial-Style. Dass grundlegende Herangehen (testen in einzelteilen - erst mal datenbank-connecten, dann was passendes ausechoen, dann eine query absetzen, dann das ergebnis mal var_dumpen um erstaunt festzustellen, dass es ein objekt vom typ resource ist etc.pp. ist wohl bei vielen Problemen "das Problem" - wenn ich dich hier recht verstehe).

                                      In Anfängertutorials sah ich solche Abschnitte bisher noch nicht. Zu "Zend Framework Tutorial" findet Google 220.000 Seiten und selbst auf deutsch immerhin noch 8000. Ist da wirklich ein weiteres nötig?

                                      Naja, einige sind veraltet, die paar nützlichen, die ich fand, lassen aus meiner Sicht einiges an Grundlagen-know-how aus bzw. setzen es voraus. Es gibt auf der frameworkseite selbst auch videotutorials, die helfen auch, sind aber in englisch und wohl auch eher für fortgeschrittene. Mein Überlegung war ja eher die: wenn ich mich da nach Lust und Laune schlau mache, und davon nicht Teile festhalte/-schreib, riskier ich, dass ich in ein paar wochen das zu Teilen vielleicht schon wieder vergessen habe. Wenn ich aber schon Notizen machen sollte, teilweise auch der allgemeineren Art zur SPL, diversen Funktionen darin (die ja auch nach Relevanz gefiltert werden könnten) dann könnte dieser Erkenntnisprozess, wenn gescheit dokumentiert, ja vielleicht auch für andere hilfreich sein.

                                      Auch wie man Struktur in Wald- und Wiesen-Scripte bringt wäre wichtig, denn sich selbst erstmal zu organisieren ist nicht nur Voraussetzung für das erfolgreiche Verwenden von "Framework-Monstern" sondern auch für die Wartbarkeit von Scripten mittlerer Größe.

                                      Jau. Wobei man sich da bei Zend, wenn man denn soweit das kapiert, was koding-Style und Trennung von Zuständigkeiten angeht eine Scheibe wird abschneiden können.

                                      Und (fehlerhafter) Umgang mit Zeichenkodierungen ist auch ein beliebtes Thema zu dem ich nichts Verweisbares im Tutorial-Format kenne.

                                      Das aber eine anderes Pflaster, oder?

                                      Diese Artikel-Ideen hege ich schon eine Weile, nur

                                      Zeit, Mitstreiter, wie-herangehen
                                      ....................... [1]

                                      [1] hier bitte Ausrede einfügen.

                                      Dank und Gruß,

                                      frankx

                                      --
                                      tryin to multitain  - Globus = Planet != Welt
                                      1. hi,

                                        sorry das ich mich hier ausklinken muss, aber ich kann zurzeit nichts machen, mein Rücken erlaubt es mir nicht mal zu sitzen.

                                        holla holla

                                        1. hi,

                                          mein Rücken erlaubt es mir nicht mal zu sitzen.

                                          Diagnose der Notfallstation: Muskelzerrung, ich bin wieder im Spiel :)
                                          Placebo-Effekt, es tut noch Weh, aber ich fühl mich besser.

                                          Zurück zum Zend-Framework ; ich habe mir das ZF gerade runtergeladen und auf meinen Rechner gepackt, danach noch den include_path in der php.ini angepasst,

                                          include_path = ".;E:\x-seiten\seitentest\library"

                                          nur bekomme ich beim Aufruf der Demos-Dateien Fehlermeldungen, eine sieht wie folgt aus:

                                          Warning: domdocument::domdocument() expects at least 1 parameter, 0 given in E:\x-seiten\seitentest\library\Zend\Feed.php on line 195

                                          Was mache ich falsch?
                                          Oder besser, wie muss ich vorgehen, um es zu testen?

                                          Hier wird die Installation erklärt, aber nicht, wie man es testet.

                                          holla holla

                                          1. echo $begrüßung;

                                            Oder besser, wie muss ich vorgehen, um es zu testen?

                                            Mach mit dem Quickstart weiter.

                                            Hier wird die Installation erklärt, aber nicht, wie man es testet.

                                            Deutsche Übersetzung halt. Hat nicht nur eine teilweise schreckliche Wortwahl, sondern verlinkt auch noch das Quickstart-Tutorial falsch.

                                            echo "$verabschiedung $name";

                                            1. hi,

                                              Oder besser, wie muss ich vorgehen, um es zu testen?
                                              Mach mit dem Quickstart weiter.

                                              Das hatte ich gesucht, Danke für den Link.

                                              Deutsche Übersetzung halt. Hat nicht nur eine teilweise schreckliche Wortwahl, sondern verlinkt auch noch das Quickstart-Tutorial falsch.

                                              Ich hatte mich auch schon gewundert, warum das Quickstart-Tutorial auf sich selbst verlinkt, es läuft jetzt.
                                              Ich arbeite mich jetzt erstmal ein.

                                              Danke euch beiden für die Mühen.

                                              Interessant ist ja schonmal, das die Scripte keine schliessenden
                                              ?>
                                              brauchen, mal sehen, was da noch alles kommt.

                                              holla holla

                                              1. echo $begrüßung;

                                                Interessant ist ja schonmal, das die Scripte keine schliessenden ?> brauchen

                                                Das ist eine Fehlerquelle weniger, wenn man in inkludierten Dateien keine Ausgabe erzeugen will. Es kann sich schließlich hinter ein nicht vorhandenes ?> kein Whitespace einschmuggeln. Und am Dateiende ein ?> unbedingt fordern zu wollen wäre Formalismus ohne praktischen Nutzen.

                                                mal sehen, was da noch alles kommt.

                                                Noch eine Kleinigkeit aus der gleichen Ecke: Das letzte ; vor einem ?> oder Dateiende kann auch wegbleiben. Das wegzulassen bedingt aber höhere Aufmerksamkeit, wenn man weiteren Code anfügen will oder Code hin- und herschiebt und dabei das Ende mit betroffen ist.

                                                echo "$verabschiedung $name";

                                                1. hi,

                                                  Jau, den coding standard bzw. die "best practices" find ich auch lehrreich http://framework.zend.com/manual/en/coding-standard.html

                                                  Danke für den Link, sehr aufschlussreich.

                                                  Das ist eine Fehlerquelle weniger, wenn man in inkludierten Dateien keine Ausgabe erzeugen will. Es kann sich schließlich hinter ein nicht vorhandenes ?> kein Whitespace einschmuggeln.

                                                  Das hatte ich vor ein paar Wochen in meinem CMS, da hatte ich ausgerechnet in der DB_Connect Datei 5-6 Leerzeilen, die dann natürlich im erzeugten HTML waren ; ich hatte mir einen Wolf gesucht, bis ich das gefunden hatte.
                                                  Das es Grundsätzlich in PHP geht finde ich ja sehr interessant, da ich es bisher nirgends gesehen hatte.

                                                  Noch eine Kleinigkeit aus der gleichen Ecke: Das letzte ; vor einem ?> oder Dateiende kann auch wegbleiben. Das wegzulassen bedingt aber höhere Aufmerksamkeit, wenn man weiteren Code anfügen will oder Code hin- und herschiebt und dabei das Ende mit betroffen ist.

                                                  Das erinnert mich an CSS, da geht es ja auch, ich bleib aber wohl bei den schliessenden ;, hat es denn irgendeinen nutzen, darauf zu verzichten?

                                                  Nach 8 Stunden habe ich endlich mal das ZF zum laufen gekriegt, das war ein Akt.

                                                  holla holla

                                                  1. echo $begrüßung;

                                                    ich bleib aber wohl bei den schliessenden ;, hat es denn irgendeinen nutzen, darauf zu verzichten?

                                                    Keinen wirklichen. Man spart sich ein Zeichen, wenn man seine Templates direkt mit PHP erstellt und öfter
                                                    <?php echo h($variable) ?>
                                                    zu notieren hat. (h = Funktion, die htmlspecialchars() aufruft. Tippeffizienz siegt über Performance!)

                                                    echo "$verabschiedung $name";

                                                    1. hi,

                                                      zu notieren hat. (h = Funktion, die htmlspecialchars() aufruft. Tippeffizienz siegt über Performance!)

                                                      Das ist Interessant, ist das in Frameworks schon enthalten oder schreibst du dir solche Funktionen selbst?

                                                      Welche PHP-Funktionen könnte man auf diese Weise Sinnvoll kürzen?

                                                      Und, ich habe noch Probleme mit dem Framework ; was muss ich runterladen und wie muss ich den include_path einstellen?
                                                      Ständig versucht ZF auf irgendwas zuzugreifen, das bei mir nicht auf der Platte ist, dabei habe ich schon alles mögliche runtergeladen.

                                                      Aktuell:

                                                      Writing Database Guestbook in (control-c to cancel): 5 4 3 2 1  
                                                      Warning: file_get_contents(./schema.sqlite.sql) [function.file-get-contents]: failed to open stream:
                                                      

                                                      Ich kann nirgends ein „./schema.sqlite.sql“ finden.

                                                      holla holla

                                                      1. echo $begrüßung;

                                                        zu notieren hat. (h = Funktion, die htmlspecialchars() aufruft. Tippeffizienz siegt über Performance!)
                                                        Das ist Interessant, ist das in Frameworks schon enthalten oder schreibst du dir solche Funktionen selbst?

                                                        Da ich das Framwork nicht verwende und die letzten PHP-Projekte eher "Kleinkram" waren, hab ich nur ein paar kleine Helferlein für den Ausgabeteil benötigt. Speziell das ZF müsste im Zend_View-Umfeld Helper-Functions haben, die diese Aufgaben erledigen. Allerdings sind die à la $this->escape() aufzurufen.

                                                        Welche PHP-Funktionen könnte man auf diese Weise Sinnvoll kürzen?

                                                        Alles was man häufig benötigt und bei dem man zu faul ist, es jedes Mal auszuschreiben. Einen kleinen Zusatzwert haben meine Abkürzungen allerdings. Durch die Übergabe des Parameters als Referenz (&) gibt es keine Notice beim Zugreifen auf nicht vorhandene Variablen. Was aber im Produktivbetrieb sinnvoll ist, erschwert das Entwickeln, bekommt man doch nun keinen Hinweis auf Tippfehler mehr. Intensiveres Testen ist also angesagt. (Außerdem ist entgegen meinem Beispiel das echo schon eingebaut, also ist nur noch
                                                        <?php h($variable) ?> nötig.)

                                                        Hier mal ein paar Beispiele:

                                                        function u(&$str) {  
                                                          echo isset($str) ? urlencode($str) : '';  
                                                        }  
                                                        function r(&$str) {  
                                                          echo isset($str) ? rawurlencode($str) : '';  
                                                        }  
                                                        function h(&$str) {  
                                                          echo isset($str) ? htmlspecialchars($str) : '';  
                                                        }  
                                                        function ht(&$str) {  
                                                          echo isset($str) ? htmlspecialchars(trim($str)) : '';  
                                                        }  
                                                        function e(&$str) {  
                                                          echo isset($str) ? $str : '';  
                                                        }  
                                                        function i(&$str) {  
                                                          echo isset($str) ? intval($str) : 0;  
                                                        }  
                                                          
                                                        function m($m) {  
                                                          static $monthNames = array('', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',  
                                                            'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');  
                                                          return $m < 13 ? $monthNames[$m] : $monthNames[date('n', $m)];  
                                                        }  
                                                        function w($d, $abbr = true) {  
                                                          static $weekdayNames = array('', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag',  
                                                            'Freitag', 'Sonnabend', 'Sonntag');  
                                                          static $weekdayNamesShort = array('', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So');  
                                                          if ($abbr)  
                                                            return $d < 8 ? $weekdayNamesShort[$d] : $weekdayNamesShort[date('N', $d)];  
                                                          return $d < 8 ? $weekdayNames[$d] : $weekdayNames[date('N', $d)];  
                                                        }
                                                        

                                                        Und, ich habe noch Probleme mit dem Framework ; was muss ich runterladen

                                                        Minimal das Minimal-Paket von der Download-Seite. Ob zip oder tar.gz ist Geschmackssache.

                                                        und wie muss ich den include_path einstellen?

                                                        Der muss auf .../library zeigen. Darin befindet sich das Zend-Verzeichnis. Die ZF-Dateien inkludieren Zend/..., also muss das Verzeichnis mit dem Zend drin im include_path stehen, und das ist .../library.

                                                        Ständig versucht ZF auf irgendwas zuzugreifen, das bei mir nicht auf der Platte ist, dabei habe ich schon alles mögliche runtergeladen.

                                                        Beschreib es mal nachvollziehbar.

                                                        echo "$verabschiedung $name";

                                                        1. hi,

                                                          Speziell das ZF müsste im Zend_View-Umfeld Helper-Functions haben, die diese Aufgaben erledigen. Allerdings sind die à la $this->escape() aufzurufen.

                                                          Dann werden sie mir vermutlich schon bald über den Weg laufen.

                                                          Durch die Übergabe des Parameters als Referenz (&) gibt es keine Notice beim Zugreifen auf nicht vorhandene Variablen. Was aber im Produktivbetrieb sinnvoll ist, erschwert das Entwickeln, bekommt man doch nun keinen Hinweis auf Tippfehler mehr. Intensiveres Testen ist also angesagt.

                                                          Das ist kein Problem, um das Intensive testen komm ich ja eh nicht drum rum.

                                                          Danke für die Beispiele, die lassen sich sicherlich gut erweitern, mal sehen, was mir da so einfällt.

                                                          Der muss auf .../library zeigen. Darin befindet sich das Zend-Verzeichnis. Die ZF-Dateien inkludieren Zend/..., also muss das Verzeichnis mit dem Zend drin im include_path stehen, und das ist .../library.

                                                          Ich hatte es schon richtig, es läuft auch schon,  aber

                                                          Ständig versucht ZF auf irgendwas zuzugreifen, das bei mir nicht auf der Platte ist,
                                                          Beschreib es mal nachvollziehbar.

                                                          Es handelt sich hier um den sqlite driver, der fehlt.

                                                          AN ERROR HAS OCCURED: The sqlite driver is not currently installed

                                                          Jetzt habe ich mir das sqlite Zip-Archive runtergeladen, da sind aber nur ein Paar Dateien die auf „.c“ enden, wie man das unter Xampp auf Windows zum laufen kriegt, steht auch nirgends beschrieben.
                                                          Aber an sich kann ich ja auch auf sqlite verzichten oder?
                                                          Ich arbeite mit MySQL ; muss ich sqlite haben, um mit ZF arbeiten zu können?

                                                          holla holla

                                                          1. echo $begrüßung;

                                                            Ich arbeite mit MySQL ; muss ich sqlite haben, um mit ZF arbeiten zu können?

                                                            sqlite ist keine Voraussetzung für das ZF an sich. Vielleicht sind einige Demos darauf aufgebaut. Ich denke, wenn du nach dem Quickstart vorgehst und das Demo-Verzeichnis links liegen lässt, solltest du nicht auf solche Probleme stoßen.

                                                            echo "$verabschiedung $name";

                                                            1. hi,

                                                              Ich denke, wenn du nach dem Quickstart vorgehst und das Demo-Verzeichnis links liegen lässt, solltest du nicht auf solche Probleme stoßen.

                                                              Stimmt, ich habe jetzt endlich auch einen Einstieg gefunden, mal sehen, wie ich vorankomme.

                                                              Vielen Dank noch mal für die Tipps und die Hilfe.

                                                              holla holla

                                              2. Hellihello

                                                Interessant ist ja schonmal, das die Scripte keine schliessenden
                                                ?>
                                                brauchen, mal sehen, was da noch alles kommt.

                                                Jau, den coding standard bzw. die "best practices" find ich auch lehrreich http://framework.zend.com/manual/en/coding-standard.html

                                                Dank und Gruß,

                                                frankx

                                                --
                                                tryin to multitain  - Globus = Planet != Welt
                                          2. Hellihello

                                            die Videotutorials http://framework.zend.com/docs/multimedia auf der Zendseite finde ich auch prima. Sowie die Anleitung von Lyndon Babtiste http://www.developertutorials.com/tutorials/php/zend-framwork-tutorial-8-08-13/page1.html.

                                            Dank und Gruß,

                                            frankx

                                            --
                                            tryin to multitain  - Globus = Planet != Welt
    2. Ich hab versucht dieses Script einfach mal zu kopieren.
      Danach kommt allerdings eine Fehlermeldung. Was müsste ich denn ändern, damit es funktionieren kann?

      Gruß Eric

      1. Hellihello

        welche Fehlermeldung?

        Dank und Gruß,

        frankx

        --
        tryin to multitain  - Globus = Planet != Welt
        1. Hellihello

          welche Fehlermeldung?

          Dank und Gruß,

          frankx

          Hat sich erledigt, mit 777 als Rechte ging es dann :)

      2. Hellihello,

        wenn Du bekommst:

        Warning: move_uploaded_file(copy.bat) [function.move-uploaded-file]: failed to open stream: Permission denied in /var/www/[.../mydir]/upload.php on line 8

        Dann musst Du Schreibrechte für Jedermann in dem Verzeichnis setzen.

        Frage in die Runde: Wenn der Ordner per FTP angelegt wurde, ist der Besitzer der FTP-User, die Gruppe heißt bei mir in dem Fall "psacln" was irgendwas mit dem Plesk zu tun hat "plesk system administration client" (?), dann braucht es eine öffentliches Schreibrecht, weil PHP mit wwwrun als "Besitzer" und Gruppenzugehörigekeit "www" daher kommt (so ists wohl auf meinem Server)? Naja, fast keine Frage mehr sondern eher logisch. Wer legt denn fest, als welcher Besitzer php daherkommt? Der Server vermutlich, also Mr. Apache, und der heißt hier scheints "wwwrun".

        Dank und Gruß,

        frankx

        --
        tryin to multitain  - Globus = Planet != Welt
        1. echo $begrüßung;

          Frage in die Runde: Wenn der Ordner per FTP angelegt wurde, ist der Besitzer der FTP-User, die Gruppe heißt bei mir in dem Fall "psacln" was irgendwas mit dem Plesk zu tun hat "plesk system administration client" (?),

          Das acl könnte auch für Access Control List stehen.

          dann braucht es eine öffentliches Schreibrecht, weil PHP mit wwwrun als "Besitzer" und Gruppenzugehörigekeit "www" daher kommt (so ists wohl auf meinem Server)? Naja, fast keine Frage mehr sondern eher logisch. Wer legt denn fest, als welcher Besitzer php daherkommt? Der Server vermutlich, also Mr. Apache, und der heißt hier scheints "wwwrun".

          In einer Multiuser-Umgebung sollte man PHP eigentlich als CGI laufen lassen. Es gibt Wrapper, die den PHP-Prozess dann unter dem Benutzeraccount des Kunden laufen lassen. Provider, die aus <del>Kosten</del><ins>Performance</ins>gründen PHP als Apachemodul laufen lassen, um mehr Kunden pro Maschine laufen lassen zu können, haben das Problem, dass alles PHP unter der Webserverkennung läuft. Sie greifen dann zu solch fragwürdigen Features wie dem Safe Mode, der für diese ungünstige Konstellation trotzdem eine Separierung nach Kunden realisieren soll. Und die Kunden öffnen Scheunentore, weil sich die unterschiedlichen Kennungen und Gruppenzugehörigkeiten gegenseitig behindern. Da es den Safe Mode ab PHP 6 nicht mehr gibt, werden die Provider alle auf die CGI-Variante umsteigen müssen, wenn sie nicht wollen, dass sich die Kunden gegenseitig die Dateien löschen.

          echo "$verabschiedung $name";

          1. Hellihello

            echo $begrüßung;

            Frage in die Runde: Wenn der Ordner per FTP angelegt wurde, ist der Besitzer der FTP-User, die Gruppe heißt bei mir in dem Fall "psacln" was irgendwas mit dem Plesk zu tun hat "plesk system administration client" (?),

            Das acl könnte auch für Access Control List stehen.

            Jau. Allerdings gibts hier das pendant "psaserv"

            In einer Multiuser-Umgebung sollte man PHP eigentlich als CGI laufen lassen. Es gibt Wrapper, die den PHP-Prozess dann unter dem Benutzeraccount des Kunden laufen lassen. Provider, die aus <del>Kosten</del><ins>Performance</ins>gründen PHP als Apachemodul laufen lassen, um mehr Kunden pro Maschine laufen lassen zu können, haben das Problem, dass alles PHP unter der Webserverkennung läuft. Sie greifen dann zu solch fragwürdigen Features wie dem Safe Mode, der für diese ungünstige Konstellation trotzdem eine Separierung nach Kunden realisieren soll. Und die Kunden öffnen Scheunentore, weil sich die unterschiedlichen Kennungen und Gruppenzugehörigkeiten gegenseitig behindern. Da es den Safe Mode ab PHP 6 nicht mehr gibt, werden die Provider alle auf die CGI-Variante umsteigen müssen, wenn sie nicht wollen, dass sich die Kunden gegenseitig die Dateien löschen.

            In dem Fall ist es "mein" virtueller Server. Ist das denn "unschlau", hier php als Modul laufen zu lassen? Im Grunde ist das Ding ja auch nicht nur für micht, sondern soll (oder ist auch schon so) ja auch von verschiedenen Personen mit eingen FTP-Zugängen und vhosts genutzt werden können.

            cgi - hieße dann aber, dass alles PHP-Dateien im cgi-Ordner liegen müssten oder das entsprechend in der vhosts-Konfiguration angegeben werde muss und alle Scripte mit Sheban "!#/bin/php" oder sowas beginnen müssten?

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
            1. echo $begrüßung;

              In dem Fall ist es "mein" virtueller Server. Ist das denn "unschlau", hier php als Modul laufen zu lassen? Im Grunde ist das Ding ja auch nicht nur für micht, sondern soll (oder ist auch schon so) ja auch von verschiedenen Personen mit eingen FTP-Zugängen und vhosts genutzt werden können.

              Dann bist du sozusagen Provider und müsstest die Trennung nach Projekten/Kunden vornehmen.

              cgi - hieße dann aber, dass alles PHP-Dateien im cgi-Ordner liegen müssten oder das entsprechend in der vhosts-Konfiguration angegeben werde muss und alle Scripte mit Sheban "!#/bin/php" oder sowas beginnen müssten?

              Mitneffen. Beispiel aus dem PHP-Handbuch und für Windows und ohne Wrapper:

              ScriptAlias /php/ "c:/php/"
                AddType application/x-httpd-php .php
                # For PHP 5
                Action application/x-httpd-php "/php/php-cgi.exe"

              Für .php-Dateien wird der Typ application/x-httpd-php festgelegt, der als Aktion einen Aufruf von /php/php-cgi.exe ergibt, wobei das /php/ ein Alias für das Verzeichnis c:/php/ ist. Beim Einsatz eines Wrappers (z.B. suPHP) steht sicher in dessen Anleitung, wie vorzugehen ist.

              echo "$verabschiedung $name";

  2. Hello,

    <head>
    <title>Dateiupload-Test</title>
    </head>
    <body>

    <?php
    header("Content-type:text/html;charset=utf-8");

    da sehe ich mal einen: du kannst keinen Header versenden, nachdem du bereits Inhalt ausgegeben hast. Dies sollte dir PHP aber eigentlich mit einem "Warning: Cannot modify header information - headers already sent" quittieren.

    Ansonsten wird hier davon ausgegangen, dass ein Parameter "submit" übermittelt wird. Dein Submitbutton trägt keinen besonderen Namen, da würde ich mich also nicht drauf verlassen wollen. Gib dem Submit mal einen name="abc" und prüfe auf $_POST["abc"]

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    I will never understand why Germans feel the need to kill trees  --  Arbeitskollege aus UK zum Thema ob eine Dokumentation elektronisch oder auf Papier ausgeliefert wird
    1. Hellihello

      Ansonsten wird hier davon ausgegangen, dass ein Parameter "submit" übermittelt wird. Dein Submitbutton trägt keinen besonderen Namen, da würde ich mich also nicht drauf verlassen wollen. Gib dem Submit mal einen name="abc" und prüfe auf $_POST["abc"]

      Mag sein dass das kleine How-to hier in Selfhtml nicht ganz korrekt ist. Bezüglich des Buttons und auch der File-Bewegung auf dem Server?

      Dank und Gruß,

      frankx

      --
      tryin to multitain  - Globus = Planet != Welt
  3. So, mithilfe einiger Forenbeiträge und eigener Recherche hab ich nun ein bei mir funktionierendes Script für einen einfachen Dateiupload auf die Beine gestellt.
    Für ein Änfänger wie mich waren das mehrere Stunden Arbeit :P

    Einiges im Code könnte man sicher eleganter lösen, aber gibt es grundsätzliche Fehler?

    Ich hab alles komplett kommentiert, damit dürfte es nicht zu schwer sein die Zusammenhänge zu erkennen.

    Hinweis: Das Script ist nur für einen internen Bereich auf einer Seite gedacht. Böswillige Schädigungsversuche wird es also kaum geben, höchstens versehentliche.
    Falls ein Dateiname durch fehlende Konvertierung von seltenen Sonderzeichen nicht so schön aussehen würde ist das egal, solange es keine dauerhaften Fehler auf dem Server auslöst.
    Ich würde die Leute schon anweisen, passende Namen zu benutzen.

    Hier nun endlich der Code:

    <?php header("Content-type:text/html;charset=utf-8"); ?>  
    <html>  
    <head>  
    <title>Dateiupload-Test</title>  
    </head>  
    <body>  
      
    <?php  
      
      
    if (isset($_POST['submit']) && $_POST['submit']=="Senden") // Wurde was abgeschickt?  
      {  
      $uploadversuch = true;     //Formular wurde abgesendet  
      $uploadfertig = false;     //Aber im Verzeichnis sind sie noch nicht...  
      }  
      
      
    $oname = $_FILES['datei']['name'];  
      
    $replacearray = array("ä" => "ae", "ö" => "oe", "ü" => "ue", "ß" => "ss", "$" => "s", "ÄE" => "A", "Ö" => "OE", "Ü" => "UE", "&" => "and");  
    $oname = strtr($oname, $replacearray);  
    $oname = strtolower($oname);  
      
    $dateiname = substr($oname, 0, strripos($oname, '.')); //Alles nach dem letzten Punkt wird weggeschnitten  
    $dateiendung = substr($oname, strlen($dateiname)); // Der Dateiname wird weggeschnitten indem die Länge des Strings aus der vorigen Operation genutzt wird --> nur noch Endung mit Punkt  
    $endung_ohne_punkt = substr($oname, strlen($dateiname) +1); //Die Dateiendung ohne den Punkt für einfacheren array  
      
    $erlaubte_endungen = array("jpg", "jpeg", "gif", "png", "bmp", "psd", "txt", "rar", "zip", "7z", "mp3", "wav", "ogg"); // bei Bedarf zu ergänzen, hauptsache kein .php und co  
      
    if(!in_array($endung_ohne_punkt, $erlaubte_endungen)) // Prüfen ob die Endung in Ordnung geht, ansonsten Upload abbrechen und Fehlermeldung generieren.  
      {  
      $uploadversuch = false;  
      $falsche_endung = true;  
      }  
      
    if($_FILES['datei']['size'] > 10000000) // Dateigröße überprüfen, falls zu groß Upload abbrechen und passende Fehlermeldung setzen  
      {  
      $uploadversuch = false;  
      $zu_gross = true;  
      }  
      
      
      
    // Zufallszahl durch Unix-Zeitstempel. Bei Bedarf könnte man das Upload-Datum der Datei zuverlässig feststellen.  
      
    $zufall = "_". time() ."";  
      
      
      
    $fullname = "$dateiname$zufall$dateiendung"; //zu einem Namen zusammenfügen  
      
    if ($uploadversuch && isset($_FILES['datei']['tmp_name']) && move_uploaded_file($_FILES['datei']['tmp_name'],"data/$fullname"))  
      {  
      $uploadfertig = true;  
      }  
      
      // Falls es einen Uploadversuch gab, die Datei auf dem Server aufgetaucht ist, ins Verzeichnis Data geschoben wurde und den alten Namen + Zufallszahlen + Endung bekommen hat, dann hats funktioniert  
      
    ?>  
      
      <form enctype="multipart/form-data" action="<?php echo htmlspecialchars ($_SERVER['PHP_SELF']); ?>" method="post">  
      <input type="hidden" name="max_file_size" value="10000000">  
      Datei auswählen:<br> <input name="datei" type="file"><br><br>  
      <input type="submit" value="Senden" name="submit">  
      </form>  
      <br><br>  
      
    <?php  
      
    //Das wars Formular zum Upload, dürfte klar sein  
      
      
      
    // Nachricht ausgeben:  
      
     if (isset($_POST['submit']) && $_POST['submit']=="Senden" && !$uploadfertig &&!$falsche_endung && !$zu_gross) // Es wurde was abgeschickt, aber die Datei ist nicht bis zum Ziel gekommen. Dabei waren nicht Größe oder Name schuld.  
      {  
      echo "Der Upload ist aus unbekannten Gründen leider fehlgeschlagen. Kontaktieren Sie den Admin unter xy@mail.com";  
      }  
      elseif ($uploadfertig) // Alles paletti  
       {  
       echo "Der Upload ist gelungen, die Datei <b>", $_FILES['datei']['name'] ,"</b> ist nun im Verzeichnis.<br> Sie ist unter dem Pfad <a href=\"http://x-y.com/abc/data/", $fullname ,"\">http://x-y.com/abc/data/", $fullname ,"</a> erreichbar.";  
       }  
      elseif (isset($_POST['submit']) && $_POST['submit']=="Senden" && empty($_GET['datei'])) // Wurde da etwas nichts gewählt?  
       {  
       echo "Es muss eine Datei ausgewählt werden!";  
       }  
      elseif (isset($_POST['submit']) && $_POST['submit']=="Senden" && !$uploadversuch && $falsche_endung) // Nana, nichts Verbotenes hochladen...  
       {  
       echo "Diese Dateiendung ist nicht erlaubt!";  
       }  
       elseif (isset($_POST['submit']) && $_POST['submit']=="Senden" && !$uploadversuch && $zu_gross) // Falls es zu groß war  
       {  
       echo "Die Dateigröße darf 10 Megabyte nicht überschreiben!";  
       }  
      
      
      
      
    ?>  
      
    </body>  
    </html>
    

    Gruß Eric

    1. echo $begrüßung;

      Einiges im Code könnte man sicher eleganter lösen, aber gibt es grundsätzliche Fehler?

      Du solltest prüfen, ob der Upload erfolgreich war. Das steht in $_FILES['userfile']['error']. Für Datei-Upload-Fehlercodes und deren Bedeutung gibt es ein eigenes Unterkapitel im Handbuchkapitel Handling file uploads. Es gibt einige Fallstricke, die durch verschiedene PHP-Konfigurationen bei zu großen Dateien zuschlagen können, beschrieben unter Common Pitfalls.

      if (isset($_POST['submit']) && $_POST['submit']=="Senden") // Wurde was abgeschickt?

      Das Formular wurde also abgeschickt. Ob aber eine Datei dabei war, prüfst du nicht. Die Post-Prüfung führst du im Script noch einige weitere Male aus. Jedoch führst du einige Verarbeitungsschritte unabhängig vom Erfolg des abgeschickten Formulars beziehungsweise des Uploads aus. Im Grunde genommen brauchst du die Post-Prüfung nur einmal und solltest es um den kompletten Teil der Eingabeüberprüfung und Verarbeitung legen (Teile E und V des EVA-Prinzips). Die den Upload betreffenden Teile solltest du nochmal extra vom Fehlerstatus abhängig machen.

      $oname = $_FILES['datei']['name'];

      Dieses Umkopieren ist überflüssig. Du kannst

      $replacearray = array("ä" => "ae", "ö" => "oe", "ü" => "ue", "ß" => "ss", "$" => "s", "ÄE" => "A", "Ö" => "OE", "Ü" => "UE", "&" => "and");
      $oname = strtr($oname, $replacearray);

      das $_FILES… gleich direkt an der Stelle notieren:
        $oname = strtr($_FILES['datei']['name'], $replacearray);

      und das strtolower() gleich mit einbauen:
        $oname = strtolower(strtr($_FILES['datei']['name'], $replacearray));

      Deine Ä-Ersetzung hat übrigens einen Tippfehler. Ich persönlich würde die Dateinamensveränderung komplett weglassen und stattdessen nur eine Prüfung auf nicht erlaubte Zeichen im extrahierten Dateinamen (siehe nachfolgend) vornehmen, wenn dann noch welche übrig sind. Voraussetzung ist, dass es keine weiteren Probleme beim Ablegen der Datei mit UTF-8-kodierten Dateinamen gibt.

      $dateiname = substr($oname, 0, strripos($oname, '.')); //Alles nach dem letzten Punkt wird weggeschnitten
      $dateiendung = substr($oname, strlen($dateiname)); // Der Dateiname wird weggeschnitten indem die Länge des Strings aus der vorigen Operation genutzt wird --> nur noch Endung mit Punkt
      $endung_ohne_punkt = substr($oname, strlen($dateiname) +1); //Die Dateiendung ohne den Punkt für einfacheren array

      Mit der Funktion pathinfo() (und/oder der dort unter See also aufgeführten) kannst du dir hier Arbeit sparen.

      Du prüfst nicht, ob jemand einen Pfad (../../relativ/woandershin) mit dem Dateinamen mitschickt und fügst das dann ungeprüft zusammen: "data/$fullname". Du könntest beim Auftauchen von / oder \ die Verarbeitung wegen Betrugsversuchs abbrechen oder stillschweigend vom pathinfo()-Ergebnis nur die pfadlosen Teile weiterverarbeiten.

      $erlaubte_endungen = array("jpg", "jpeg", "gif", "png", "bmp", "psd", "txt", "rar", "zip", "7z", "mp3", "wav", "ogg"); // bei Bedarf zu ergänzen, hauptsache kein .php und co

      Normalerweise ist eine Prüfung nach Dateiendung oder -namen gleichzusetzen mit dem Versuch anhand des Namens einer Person auf dessen Charakter zu schließen. Für den internen Gebrauch mag diese "Prüfung" ausreichend sein. Wenn du das jedoch später mal in ein anderes, öffentliches Projekt übernehmen willst, reicht das nicht mehr. Eine Prüfung nach Inhalt wäre angebrachter. Leider ist die fileinfo-Extension derzeit nur als PECL erhältlich und erst in der demnächst erscheinenden Version 5.3 als "ordentliche" Extension erhältlich. Derzeit gibt es nur die Mimetype-Extension, die aber zugunsten von fileinfo deprecated ist.

      Diese Inhaltsprüfung will und kann jedoch keine absolute Sicherheit bieten. Sie prüft lediglich auf markante Teile innerhalb der Datei. Ob das Öffnen und Verarbeiten mit irgendeinem beliebigen Programm fehlerfrei gelingt oder nicht kann damit keinesfalls garantiert werden.

      // Zufallszahl durch Unix-Zeitstempel. Bei Bedarf könnte man das Upload-Datum der Datei zuverlässig feststellen.
      $zufall = "_". time() ."";

      Das Anhängen eines Nichts ist nicht erforderlich. Wenn du übrigens einen besseren Zufallsnamengenerator haben möchtest, nimm uniqid().

      <input type="hidden" name="max_file_size" value="10000000">

      Das kannst du komplett streichen. Dieses PHP-Feature hat keinen Einfluss auf Browser und die Größe der von denen gesendeten Dateien. PHP prüft zwar beim Bearbeiten des Uploads diesen Wert und die Dateigröße, jedoch ist der vom Client beliebig manipulierbar. Verlas dich lieber auf die von dir durchgeführte Prüfung oder die in der php.ini eingestellten Begrenzungswerte. Außerdem ist MAX_FILE_SIZE im Handbuch immer groß geschrieben. Vielleicht hat das auch noch einen Einfluss auf diese Funktionalität. Weiterhin würde ich das Formular mit an den anfänglichen HTML-Teil angliedern. So mittendrin und bedingungslos ausgegeben ist es zu nichts nütze als zur Verwirrung des Lesers, der sich fragt, warum das an der Stelle steht. Es erfolgt ja auch keine weitere Ausgabe vorher.

      Ansonsten habe ich nichts weiter gefunden, außer dass du einen real existierenden Domainnamen für Beispielzwecke missbrauchst. Dafür gibt es doch extra reservierte Domain-Namen, die nicht mit anderen kollidieren.

      echo "$verabschiedung $name";

      1. Das meiste werde ich jetzt versuche umzusetzen, nur hierzu hab ich eine Frage:

        Normalerweise ist eine Prüfung nach Dateiendung oder -namen gleichzusetzen mit dem Versuch anhand des Namens einer Person auf dessen Charakter zu schließen. Für den internen Gebrauch mag diese "Prüfung" ausreichend sein. Wenn du das jedoch später mal in ein anderes, öffentliches Projekt übernehmen willst, reicht das nicht mehr. Eine Prüfung nach Inhalt wäre angebrachter.

        Ich kenn mich zwar nicht besonders gut aus, aber meines bisherigen Wissens nach ist der Inhalt der Datei doch egal, solange sie keine php-Datei ist.
        Vorrausgesetzt es gibt keine Rechte zum Umbenennen der Datei auf dem Server, kann der User doch seine .txt oder sonstwie genannten Dateien mit schädlichem php-Inhalt ausführen wie er möchte - solange sie keine php-Dateien sind werden sie nicht also solche verarbeitet und sind daher nutzlos.

        Grüße und vielen Dank schon für die Hilfe,

        Eric

        1. echo $begrüßung;

          Ich kenn mich zwar nicht besonders gut aus, aber meines bisherigen Wissens nach ist der Inhalt der Datei doch egal, solange sie keine php-Datei ist.

          Das kann man so nicht sagen. Der Apache hat diverse Grundeinstellungen, Dateien unterschiedlich zu behandeln, je nachdem, welche Endungen sie haben. Du müsstest entweder das Download-Verzeichnis nicht im DocumentRoot liegen haben und ein Zugriffsscript haben, das die Datei zum Download durchreicht. Oder das Download-Verzeichnis liegt im DocumentRoot und du schaltest sämtliche Default-Behandlung aus und lässt nur einfaches Ausliefern zu.

          echo "$verabschiedung $name";