einsiedler: Mit PHP Bild-Daten aus einem Ordner auslesen

070

Mit PHP Bild-Daten aus einem Ordner auslesen

  1. 0
    1. 0
      1. 0
        1. 0
    2. 0
  2. 0
    1. 0
      1. 0
  3. 1
  4. 0
    1. 0
      1. 0
        1. 0
          1. 0
            1. 0
              1. 0
                1. 0
                  1. 0
                    1. 0
                    2. 0
                      1. 0
  5. 1
    1. 0
  6. 0
    1. 0
      1. 0
    2. 0
  7. 0
    1. 0
      1. 0
        1. 0
          1. 0
          2. 0
            1. 0
              1. 0
                1. 0
                  1. 0
                    1. 0
                      1. 0
                      2. 0

                        Debuggen

                      3. 0
                        1. 0
                          1. 0
                            1. 0
                              1. 0
                                1. 0
                                  1. 0

                                    Letzter Versuch?

                                    1. 0
                                      1. 0
                                        1. 0
                                          1. 0
                                            1. 0
                                              1. 0
                                                1. 0
                                                  1. 0
                                                    1. 0
                                                    2. 0
                                    2. 0
                                      1. 0
                                        1. 0
                                          1. 0
                                            1. -1
                                              1. 0
                                                1. 0
                        2. 0
                          1. 3

                            Aufforderung zu mehr Geduld

          3. 0
    2. 1
    3. 0

Ich sollte lieber in`s Bett gehen... irgendwie begreif ich jetzt gar nix mehr… Folgendes:

<?php $i = 0; $verzeichnis = "img/"; $handle = openDir($verzeichnis); while ($datei = readDir($handle)) { if ($datei != "." && $datei != ".." && !is_dir($datei)) { if (strstr($datei, ".gif") || strstr($datei, ".png") || strstr($datei, ".jpg")) { $verzeichnis_datei [$i] = $verzeichnis . $datei; $verzeichnis_datei [$i] [0] = getImageSize($verzeichnis_datei [$i]); echo "<img src=\"$verzeichnis_datei[$i]\" width=\"$verzeichnis_datei [$i] [0] [0]\" height=\"$verzeichnis_datei [$i] [0] [1]\"> <br>\n"; $i++; } } } closeDir($handle); ?>

Ja, es scheint ganz einfach, aber es läuft nicht…

Ich möchte schlicht A) ein Ordnerverzeichnis mit Bildern auslesen…

(Achso und das genau der Reihenfolge nach, ich hab sie mit A__Demobild, B__Demobild, C__Demobild, D__Demobild... sortiert hochgeladen und so sollten sie auch erscheinen.

B) Den Bildtitel ins Array $verzeichnis_datei [$i] speichern

C) Die Bildinformationen / Grössen in ein weiteres Array $verzeichnis_datei [$i] [1] (Also die Breite und Höhe)

Und C) kommt nocht ein weiteres Array $verzeichnis_datei [$i] [2] hinzu…

Aber irgendwie bin ich grad zu doof dafür.... irgendwie.…

Erstmal gute N8 der einsiedelnde

Akzeptierte Antworten zum Thema:

  1. Hi,

    echo "<img src="$verzeichnis_datei[$i]" width="$verzeichnis_datei [$i] [0] [0]" height="$verzeichnis_datei [$i] [0] [1]"> <br>\n";

    Entweder mehrere Werte an echo kommmagetrennt übergeben:

    echo "<img src="", $verzeichnis_datei[$i], "" width="", …

    oder, weil's nicht nur einfache Variablen sind, mit {} arbeiten:

    echo "<img src="${verzeichnis_datei[$i]}, " width=" …

    (wobei ich grad nicht sicher bin, ob's ${bla[x]} oder {$bla[x]} sein muß)

    cu,
    Andreas a/k/a MudGuard

    1. Hallo MudGuard,

      echo "<img src=\"$verzeichnis_datei[$i]\" width=\"$verzeichnis_datei [$i] [0] [0]\" height=\"$verzeichnis_datei [$i] [0] [1]\"> <br>\n";

      Entweder mehrere Werte an echo kommmagetrennt übergeben:

      Oder auch die gute alte Konkatenation mit .

      echo "<img src=" . $verzeichnis_datei[$i] ." width=" . $verzeichnis_datei[$i][0][0] . " height=" . $verzeichnis_datei[$i][0][1] . ">;

      oder – besser – den PHP-Code im HTML schachteln.

      <img src="<?=$verzeichnis_datei[$i]?>" width="<?=$verzeichnis_datei[$i][0][0]?>" height="<?=verzeichnis_datei[$i][0][1]?>">

      Und das br ist sicher auch nicht notwendig.

      Bis demnächst
      Matthias

      -- Rosen sind rot.
      1. Lieber Matthias,

        oder – besser – den PHP-Code im HTML schachteln.

        das empfinde ich als keineswegs besser (nur anders). Wirklich besser ist eine Ausgabe, die sich um HTML-Syntax nicht scheren muss. Da kommen dann die DOM-Objekte und -Methoden ins Spiel. Will man HTML5 so richtig gut unterstützen, benötigt man sogar noch einen auf DOM aufsetzenden HTML5-Parser, wie z. B. Masterminds/html5-php. Aber für den OP wäre das sicherlich Overkill...

        Liebe Grüße,

        Felix Riesterer.

        1. Für mich sicherlich "zu professionell" , momentan noch!

          Könnte ich das selbst auf meinem Host installieren oder muss das mein Hoster machen?

          Sollte er von dieser Installation wissen ( Wegen der Sicherheit etc.?) ?

          Fragende Grüße der einsiedler

    2. Ja, alles GUT, danke Leute! ;o) Aber was mich brennend interessiert ist: Ist mein Vorgehen in Sachen Arrays hier so richtig?

      Denn selbst da zweifel ich schon?

      Ich benötige:

      A) als $verzeichnis_datei [$i] [1] = den Filenamen! B) als $verzeichnis_datei [$i] [2] = Sowohl die Breite als auch die Höhe des Bildes ( ansonsten die HÖHE in ein weiteres ) ( $verzeichnis_datei [$i] [3] gepackt !!! ) C) als weitere Berechnung später : $verzeichnis_datei [$i] [3 bzw. 4]

      Wobei <$i> dann von 0 bis zum letzten Bild im Ordner ist!!!

      Umständlich ausgedrückt, ich weiß! Kann es halt nicht anders!

      Hoffentlich nun verständlich! Aber ich glaube das das was ich da hab das noch nicht "macht"!

      Fragende Grüsse der einsiedenlde

  2. Tach!

    <?php $i = 0; $verzeichnis = "img/"; $handle = openDir($verzeichnis); while ($datei = readDir($handle)) { if ($datei != "." && $datei != ".." && !is_dir($datei)) { if (strstr($datei, ".gif") || strstr($datei, ".png") || strstr($datei, ".jpg")) { $verzeichnis_datei [$i] = $verzeichnis . $datei; $verzeichnis_datei [$i] [0] = getImageSize($verzeichnis_datei [$i]); echo "<img src=\"$verzeichnis_datei[$i]\" width=\"$verzeichnis_datei [$i] [0] [0]\" height=\"$verzeichnis_datei [$i] [0] [1]\"> <br>\n"; $i++; } } } closeDir($handle); ?>

    Den Code kann man bei Verwendung von glob() (zusammen mit foreach) deutlich verschlanken und vereinfachen. glob() sortiert ja nach Flag auch alphabetisch oder liest in der Reihenfolge im Verzeichnis aus. Letztere ist aber nicht garantiert.

    Brauchst du überhaupt das Array, beispielsweise für eine nachfolgende Aufgabe? Wenn nicht, dann nimm einfache Variablen für Dinge, die nur für den jeweiligen Schleifendurchlauf zwischenzuspeichern sind. Wenn ja, wäre es sinnvoll, die Array-Variable einmalig mit einem leeren Array vorzubelegen und sich nicht darauf zu verlassen, dass sie nicht existiert.

    dedlfix.

    1. Doch, leider brauche ich die Arrays zu spätere weitere Berechnungen.

      Wie sähe das GANZE dann aus?

      Und werden diese Variablen später einfach "vergessen"?

      Fragend, der einsiedelnde

      1. Tach!

        Doch, leider brauche ich die Arrays zu spätere weitere Berechnungen.

        Wie sähe das GANZE dann aus?

        Grundlegend so wie im Beispiel auf verlinkter Handbuchseite, zuzüglich Flags. Du wirst GLOB_BRACE brauchen, um mehrere Dateiendungen filtern zu können. Beispiele gibts in den Kommentaren.

        Und werden diese Variablen später einfach "vergessen"?

        Variablen innerhalb einer Schleife werden nicht vergessen. Eine Schleife bildet keinen eigenen Scope. Das spielt sich alles im Scope der Umgebung ab. Aber innerhalb einer Funktion wäre das der Fall. Da gibts nur den Rückgabewert, der am Ende überlebt (zuzüglich per Referenz übergebener Variablen, aber das ist ein anderes Thema).

        dedlfix.

  3. Hallo einsiedler,

    Ich sollte lieber in`s Bett gehen...

    Hoffe, du hast gut geschlafen :)

    $verzeichnis_datei [$i] = $verzeichnis . $datei; $verzeichnis_datei [$i] [0] = getImageSize($verzeichnis_datei [$i]);

    Das kann prinzipiell nicht funktionieren. Die erste Zeile weist dem Array an $i-ter Stelle einen String zu, der den vollständigen Dateinamen beschreibt. Die zweite Zeile würde nun versuchen, diesem String an Position 0 die Bildgröße zuzuweisen. Ich weiß gar nicht, ob Strings auf diese Weise indexierbar sind - jedenfalls ist das nicht das, was Du brauchst. Du kannst einem String keine zusätzlichen Eigenschaften anhängen.

    Was du brauchst, ist ein gemeinsamer Container für alle Eigenschaften der Datei, also Name, getImageSize-Ergebnis, und diese weitere Info von der Du sprachst. Den kannst Du auf 3 Arten umsetzen: - Du schreibst ein eigenes Objekt - Du verwendet ein Array mit numerischen Indizes - Du verwendest ein assoziatives Array

    Mit einem assoziativen Array sähe es so aus:

    while ($datei = readDir($handle)) { if ($datei != "." && $datei != ".." && !is_dir($datei)) { if (strstr($datei, ".gif") || strstr($datei, ".png") || strstr($datei, ".jpg")) { $entry = [ 'name' => $verzeichnis . $datei, 'groesse' => getImageSize($verzeichnis_datei [$i]), 'dings' => 'bums' ]; echo "<img src=\"{$entry['name']}\" width=\"{$entry['groesse'][0]}\" height=\"{$entry['groesse'][1]}\"> <br>\n"; $verzeichnis[] = $entry; } } }

    Zu beachten dabei:

    • $hugo = [ 1, 2, 3 ] erzeugt ein Array mit numerischen Indizes.

    • $otto = [ 'a'=>1, 'b'=>2, 'c'=>3 ] erzeugt ein Array ohne numerische Indizes, die Werte werden namentlich über $otto['a'], $otto['b'], $otto['c'] angesprochen. Das ist ein assoziatives Array.

    • 'dings' => 'bums' steht für diese weiteren Werte, von denen du sprachst…

    • Assoziative Arrays und indizierte Arrays kann man beliebig ineinander schachteln, deswegen greift $entry['groesse'][2] im aktuell gebauten Eintrag auf den Schlüssel 'groesse' zu und darin auf den 3. Wert, den getImageSize geliefert hat.

    • Man kann Werte automatisch ans Ende eines Arrays anhängen, indem man $verzeichnis[] = $entry schreibt. Deswegen habe ich den neuen Eintrag erstmal in $entry erzeugt, diesen Wert dann für den echo verwendet und ihn zum Schluss ins Ergebnisarray gehängt. Ist kompakter.

    • Bemerkung am Rande: Ein Array kann numerische UND alphabetische Indexe gleichzeitig haben. count($array) zählt meines Wissens beide Arten von Einträgen.

    • Will man auf ein solches Array per String Parsing zugreifen (also "Hallo $welt" und ähnliches), funktioniert die einfache Syntax nicht mehr, man braucht die "komplexe Syntax", wie das PHP Handbuch es nennt. Meint: Ein solcher Array-Zugriff muss in geschweifte Klammern gesetzt werden, sonst weiß PHP nicht, wo die Welt beginnt und endet.

    Rolf

    -- sumpsi - posui - clusi
  4. Hello,

    ~~~php <?php $i = 0; $verzeichnis = "img/"; $handle = openDir($verzeichnis);

    Fehlerhandlung fehlt

    while ($datei = readDir($handle)) {

    Du besorgst hier Dateinamen. Bei einer Datei mit Namen "0" wäre hier Ende!

    if ($datei != "." && $datei != ".." && !is_dir($datei)) {

    hier wird im Prinzip doppelt geprüft, ob es sich um ein Verzeichnis handelt.

    if (strstr($datei, ".gif") || strstr($datei, ".png") || strstr($datei, ".jpg")) { $verzeichnis_datei [$i] = $verzeichnis . $datei; $verzeichnis_datei [$i] [0] = getImageSize($verzeichnis_datei [$i]);

    ich würde dann lieber mittels stristr() prüfen, um auch andere Schreibweisen für die Endungen zu ermöglichen ".Jpg, .JPG, ...). Das ist hier aber eigentlich ohnehin die falsche Funktion, denn Du willst doch wissen, wie die ENDUNG lautet, und nicht, ob ".jpg" irgendwo in der Mitte vorkommt.

    Nimm deshalb lieber if (strtolower([substr(](http://sg2.php.net/manual/en/function.substr.php)$datei,-4) == '.jpg')) oder eine ähnliche Konstruktion.

    echo "<img src="$verzeichnis_datei[$i]" width="$verzeichnis_datei [$i] [0] [0]" height="$verzeichnis_datei [$i] [0] [1]"> <br>\n"; $i++; } } } closeDir($handle); ?> ~~~

    Wie dedlfix schon schrieb, kannst auch ganz bequem glob() benutzen. Aber den Filter GLOB_BRACE würde ich trotzdem nicht unbedingt nutzen, solange das nicht caseinsensitive nutzbar ist. Ich würde lieber das erhaltene Array aller Dateien mittels eines Foreach() und dem oben schon erwähnten Filter durchgehen (alle nicht passenden Dateien aus dem Array herauslöschen).

    So könnte man dann das ganze Konstrukt auch wirklich modular (in Funktionen oder Methoden) aufbauen, die jeweils die Daten in einem Array weiterreichen. Erst zum Schluss müsste dann in einer separaten Funktion die Ausgabe aus dem Array produziert werden. Die könnte man dann zu gegebener Zeit auch gegen eine mit DOM-Parser/Composer ersetzen, so wie Felix das fürs "HighEnd" gefordert hat.

    Jedenfalls würde ich immer vermeiden, Datenbeschaffung und Ausgabegenerierung zu mischen. Das hat man nur solange getan, wie man insgesamt nur 8KByte Speicher zur Verfügung hatte. Die Zeiten sind vorbei!

    Liebe Grüße
    Tom S.

    -- Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.

    Folgende Nachrichten verweisen auf diesen Beitrag:

    1. Tach!

      Wie dedlfix schon schrieb, kannst auch ganz bequem glob() benutzen. Aber den Filter GLOB_BRACE würde ich trotzdem nicht unbedingt nutzen, solange das nicht caseinsensitive nutzbar ist.

      Ist es aber: glob('*.{[aA][bB][cC],[dD][eE][fF]}', GLOB_BRACE)

      dedlfix.

      1. Hello,

        Wie dedlfix schon schrieb, kannst auch ganz bequem glob() benutzen. Aber den Filter GLOB_BRACE würde ich trotzdem nicht unbedingt nutzen, solange das nicht caseinsensitive nutzbar ist.

        Ist es aber: glob('*.{[aA][bB][cC],[dD][eE][fF]}', GLOB_BRACE)

        Reingebastelt ja. Aber das habe ich nicht gemeint.

        Wenn die erlaubten Endungen aus einer Konfigurationsdatei kommen, möchte ich mal deine Funktion sehen, die die Konfiguration in die obige Syntax von Glob() überführt! :-|

        Liebe Grüße
        Tom S.

        -- Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Tach!

          Ist es aber: glob('*.{[aA][bB][cC],[dD][eE][fF]}', GLOB_BRACE)

          Reingebastelt ja. Aber das habe ich nicht gemeint.

          Wenn die erlaubten Endungen aus einer Konfigurationsdatei kommen, möchte ich mal deine Funktion sehen, die die Konfiguration in die obige Syntax von Glob() überführt! :-|

          War jetzt nicht sonderlich schwierig:

          $extensions = ['abc', 'DEF']; echo globPattern($extensions); function globPattern($extensions) { return '*.{' . implode(',', array_map(function ($ext) { return preg_replace_callback('/./', function ($matches) { return '[' . strtolower($matches[0]) . strtoupper($matches[0]) . ']'; }, $ext); }, $extensions)) . '}'; }

          dedlfix.

          1. Hello,

            Ist es aber: glob('*.{[aA][bB][cC],[dD][eE][fF]}', GLOB_BRACE)

            Reingebastelt ja. Aber das habe ich nicht gemeint.

            Wenn die erlaubten Endungen aus einer Konfigurationsdatei kommen, möchte ich mal deine Funktion sehen, die die Konfiguration in die obige Syntax von Glob() überführt! :-|

            War jetzt nicht sonderlich schwierig:

            $extensions = ['abc', 'DEF']; echo globPattern($extensions); function globPattern($extensions) { return '*.{' . implode(',', array_map(function ($ext) { return preg_replace_callback('/./', function ($matches) { return '[' . strtolower($matches[0]) . strtoupper($matches[0]) . ']'; }, $ext); }, $extensions)) . '}'; }

            Du hast wahrscheinlich heute einen Clown gefrühstückt? :-P

            Das ist weder vollständig, noch wartbar.
            Und verständlich ist es schon gar nicht mehr!

            $extensions = ['abc', 'Abc', 'DEF', 'My_Special'];

            usw...

            Bei den Extensions geht es hier doch in erster Linie um die Bestimmung des MIME-Types und Festlegung der HTTP-Header dafür.

            Liebe Grüße
            Tom S.

            -- Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
            1. Tach!

              Du hast wahrscheinlich heute einen Clown gefrühstückt? :-P

              Nö.

              Das ist weder vollständig, noch wartbar.
              Und verständlich ist es schon gar nicht mehr!

              Präzisiere bitte deine Kritikpunkte. Natürlich kann man das auch iterativ statt funktional und mit deutlich mehr Code und mehr Zwischenschritten schreiben.

              $extensions = ['abc', 'Abc', 'DEF', 'My_Special'];

              Was ist daran das Problem? Dass jemand doppelte Werte konfiguriert? Muss er halt aufpassen. Oder dass andere Zeichen als Buchstaben verwendet werden? Ist nicht tragisch. Jedenfalls gibt das in beiden Fällen das gewünschte Ergebnis.

              Bei den Extensions geht es hier doch in erster Linie um die Bestimmung des MIME-Types und Festlegung der HTTP-Header dafür.

              Nö, das ist Teil der Ausgabe, andere Baustelle. Die Aufgabenstellung war das Pattern für die Ermittlung der Daten mit glob() zu erstellen.

              dedlfix.

              1. Hello,

                Präzisiere bitte deine Kritikpunkte. Natürlich kann man das auch iterativ statt funktional und mit deutlich mehr Code und mehr Zwischenschritten schreiben.

                $extensions = ['abc', 'Abc', 'DEF', 'My_Special'];

                Was ist daran das Problem? Dass jemand doppelte Werte konfiguriert? Muss er halt aufpassen. Oder dass andere Zeichen als Buchstaben verwendet werden? Ist nicht tragisch. Jedenfalls gibt das in beiden Fällen das gewünschte Ergebnis.

                Ich habe mir selbstverständlich das Ganze nochmals angeschaut... :-)

                Deine Funktion könnte durchaus in die Sammlung der Q&D-Lösungen aufgenommen werden. Ich befürchte aber Probleme, wenn die Liste der Dateien im Verzeichnis erheblich länger wird.

                aus

                $extensions = ['abc', 'DEF', 'My_Special123'];

                wird dann ja das Muster

                *.{[aA][bB][cC],[dD][eE][fF],[mM][yY][__][sS][pP][eE][cC][iI][aA][lL][11][22][33]}

                und ich befürchte nun, dass die Regular Expression, die da jedes Mal von Glob angeschmissen werden muss, die Abarbeitung aufhalten wird.

                Gegenhalten könnte man allerdings, dass diese Schleife bei genügend intelligenter Compilation von PHP nach OpCode ohnehin im Reich des L1- und L2-Caches des Prozessors abgehandelt werden wird.

                Das würde mich jetzt wirklich interessieren, ob man hier einen nachhaltigen Geschwindigkeitsunterschied zwischen deiner RegExp/GLOB_BRACE-Variante und einem expliziten Stringvergleich feststellen könnte.

                Ich habe hier ein Verzeichnis mit über 150.000 "Profilen". Die enthalten auch jeweils 0 bis N Bilder mit verschiedenen Extensions. Leider habe ich ich lokal kein PHP auf 64Bit laufen. Wird also mal Zeit...

                Liebe Grüße
                Tom S.

                -- Es gibt nichts Gutes, außer man tut es!
                Das Leben selbst ist der Sinn.
                1. Tach!

                  Ich befürchte aber Probleme, wenn die Liste der Darteien im Verzeichnis erheblich länger wird. [...] und ich befürchte nun, dass die Regular Expression, die da jedes Mal von Glob angeschmissen werden muss, die Abarbeitung aufhalten wird.

                  Wer weiß, was glob() da macht. Jedenfalls macht es nicht PHP sondern delegiert das ans Betriebssystem durch, denn das ist eine Linux/Unix-Funtionalität.

                  Die Eigenprüfung mittels PHP-Code wird vermutlich deutlich länger brauchen. Am Ende wird das bei der von der Website zu verarbeitenden Datenmenge sowieso nicht ins Gewicht fallen.

                  dedlfix.

                  1. Hallo dedlfix,

                    hast Du auch eine Funktion, die Extensions mit Umlauten drin case-insensitive matcht? Da musst Du auf mb-Funktionen umsteigen.

                    Ein manueller Versuch mit glob(".bäh") funktioniert noch, aber glob(".b[äÄ]h") ist mir unter Windows nicht gelungen. Vielleicht ist's ja ein PHP/Windows Problem.

                    Rolf

                    -- sumpsi - posui - clusi
                    1. Hello,

                      hast Du auch eine Funktion, die Extensions mit Umlauten drin case-insensitive matcht? Da musst Du auf mb-Funktionen umsteigen.

                      Ein manueller Versuch mit glob(".bäh") funktioniert noch, aber glob(".b[äÄ]h") ist mir unter Windows nicht gelungen. Vielleicht ist's ja ein PHP/Windows Problem.

                      DAS ist aber jetzt genau wieder das Thema "Dateinamen für interoperatible Nutzung".
                      Windows verwendet vermutlich ja immer noch ISO1252 für seine Dateisysteme.

                      Ab wann man da UTF-8 (eingeschränkt) benutzen darf, weiß ich nicht...

                      Liebe Grüße
                      Tom S.

                      -- Es gibt nichts Gutes, außer man tut es!
                      Das Leben selbst ist der Sinn.
                    2. Hallo,

                      Extensions mit Umlauten drin

                      Das sind jetzt aber Laborbedingungen oder sind dir solche schon mal in freier Wildbahn begegnet?

                      Gruß
                      Kalk

                      1. Hallo,

                        Extensions mit Umlauten drin

                        Das sind jetzt aber Laborbedingungen oder sind dir solche schon mal in freier Wildbahn begegnet?

                        gerne, öfter: [datei].ühü

  5. Moin,

    darauf hat Tom ja schon hingewiesen:

    while ($datei = readDir($handle)) {

    Eine Datei mit dem Namen 0 fällt hier aus dem Raster.

    if ($datei != "." && $datei != ".." && !is_dir($datei)) { if (strstr($datei, ".gif") || strstr($datei, ".png") || strstr($datei, ".jpg")) {

    strstr kann doch neben 0 auch FALSE zurückgeben. Das ist in deinem Fall nicht weiter schlimm, außer, du möchtest doch auch eine Datei .png verwenden.

    $verzeichnis_datei [$i] = $verzeichnis . $datei; $verzeichnis_datei [$i] [0] = getImageSize($verzeichnis_datei [$i]);

    Aber mich wundert, dass hier bislang keiner den Kontextwechsel gesehen hat:

    echo "<img src=\"$verzeichnis_datei[$i]\" width=\"$verzeichnis_datei [$i] [0] [0]\" height=\"$verzeichnis_datei [$i] [0] [1]\"> <br>\n";

    Dateinamen können unter unixoiden Betriebssystemen alle Zeichen außer / und dem NULL-Byte enthalten, also auch ", mit dem du aus dem HTML-Attribut gehst, sowie <>, mit denen du Tags definierst.

    Viele Grüße
    Robert

    Folgende Nachrichten verweisen auf diesen Beitrag:

    1. Hello,

      Aber mich wundert, dass hier bislang keiner den Kontextwechsel gesehen hat:

      echo "<img src=\"$verzeichnis_datei[$i]\" width=\"$verzeichnis_datei [$i] [0] [0]\" height=\"$verzeichnis_datei [$i] [0] [1]\"> <br>\n";

      Dateinamen können unter unixoiden Betriebssystemen alle Zeichen außer / und dem NULL-Byte enthalten, also auch ", mit dem du aus dem HTML-Attribut gehst, sowie <>, mit denen du Tags definierst.

      Dafür einen Extrapunkt!

      Allerdings waren wir ja mir der "Behandlung" des Threads noch nicht fertig. :-)

      Zuerst sollte einsiedler mMn mal einen modularen Aufbau erzeugen. Kurzversionen und Kurzschreibweisen, wie sie durch glob() allerdings schon wieder in den Fokus rücken könnten, sollte man im Sinne einer klaren Aufgabenteilung und leichten Les- und Wartbarkeit der Programme vermeiden!

      Liebe Grüße
      Tom S.

      -- Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
  6. Mit der Bitte um KORREKTUR:

    <?php $i = 0; $verzeichnis = "img/"; $handle = openDir($verzeichnis); while ($datei = readDir($handle)) { if ($datei != "." && $datei != ".." && !is_dir($datei)) { if (strtolower([substr(](http://www.welten-bau.de/test/testseite_uebung1/img/)$datei,-4) == '.gif')) || strtolower(substr(http://www.welten-bau.de/test/testseite_uebung1/img/)$datei,-4)) == ".png" || strtolower(http://www.welten-bau.de/test/testseite_uebung1/img/)$datei,-4)) == ".jpg"{ $entry = [ 'name' => $verzeichnis . $datei, 'bildabmessungen' => getImageSize($verzeichnis_datei [$i]), 'dings' => 'bums' ]; echo "<img src=\"{$entry['name']}\" width=\"{$entry['bildabmessungen'][0]}\" height=\"{$entry['bildabmessungen'][1]}\"> <br>\n"; $verzeichnis[] = $entry; } } }

    Abentliche Grüße

    der einsiedelnde

    1. Hallo,

      Mit der Bitte um KORREKTUR:

      Gerne:

      Abentliche Grüße

      Abendlich wird ohne t geschrieben!

      Gruß
      Kalk

      1. <?php $i = 0; $verzeichnis = "img/"; $handle = openDir($verzeichnis); while ($datei = readDir($handle)) { if ($datei != "." && $datei != ".." && !is_dir($datei)) { if (strtolower([substr(](http://www.welten-bau.de/test/testseite_uebung1/img/)$datei,-4) == '.gif')) || strtolower(substr(http://www.welten-bau.de/test/testseite_uebung1/img/)$datei,-4)) == ".png" || strtolower(http://www.welten-bau.de/test/testseite_uebung1/img/)$datei,-4)) == ".jpg"{ $entry = [ 'name' => $verzeichnis . $datei, 'bildabmessungen' => getImageSize($verzeichnis_datei [$i]), 'dings' => 'bums' ]; echo "<img src=\"{$entry['name']}\" width=\"{$entry['bildabmessungen'][0]}\" height=\"{$entry['bildabmessungen'][1]}\"> <br>\n"; $verzeichnis[] = $entry; } } }

        Ich meinte das hier!!! ddd

    2. D .... ich meinte D.... ;o)))))))

  7. Ein erneuter Versuch!

    <?php $i = 0; $verz = "img/"; $verzeichnis = openDir($verz); while ($datei = readDir($verzeichnis)) { if ($datei != "." && $datei != "..") { $entry[$i] = [ 'name' => $datei, 'verzeichnis+name' => array_merge($verz . $datei), 'bildabmessungen' => getImageSize($datei), 'berechnungen' => 'berechnungen' ]; echo "<a href=\"img/$datei\"> $datei</a><br>\n"; echo '$NAME ' . $datei . "\n"; echo '$Verzeichnis + $NAME ' . $entry[$i] ['verzeichnis+name'] . "\n"; echo '$ENTRY NAME ' . $entry[$i] ['name'] . "\n"; echo 'BILDabmessungen ' . $entry[$i] ['bildabmessungen'[0]] . "\n"; $i++; } } closeDir($verzeichnis); ?>

    Hier sieht man was es macht: DEMO

    Hiermit bin ich aber noch lange nicht zufrieden.

    Es werden alle (Unter)-Ordner angezeigt, aber warum? Es sollen nur die .jpg`s angezeigt werden.

    Das Array mit dem Verzeichnis (Pfad) + Bildname + .jpg wird nicht angezeigt!

    Die Bildgrössen (width & height) werden nicht angezeigt!

    Anscheinend ist irgendetwas fehlerhaft? Aber was?

    Wie bekomme ich es nun hin das genau die Reihenfolge

    A_demobild1, B_demobild_2, C_demobild_3 ... etc. beibehalten wird?

    In diesem Ordner benutze ich NUR .jpg Bilder…

    Ein mehrdimensionales assoziatives Array scheint hier schon richtig zu sein. Ich bekomme es grad nur nicht hin!

    In diesem Ordner befinden sich X IMG`s Für jedes einzelne IMG soll ein mehrdimensionales Array eingerichtet werden mit:

    A) Dateinahme ( A_demobild_800_mal_560.jpg )

    B) Verzeichnis (Pfad) + Dateiname ( img/A_demobild_800_mal_560.jpg )

    C) die Bildabmessungen : also width & height

    D) weitere Berechnungen... (dazu später mehr!!!)

    Es sind mir momentan zu viele Dimensionen,

    Wer kann mir Bitte helfen??? (Eventuell Bezahlung möglich!)

    Gruss der einsiedelnde

    1. Hallo einsiedler,

      bezahlt wird hier nicht, aber Selfhtml hat ein Spendenkonto, falls Du Überdruck im Geldbeutel hast.

      Du hast meinen Vorschlag mit dem $entry etwas anders umgesetzt, das macht aber nichts :)

      Einen Teil deiner Fragen verstehe ich nicht, weil das, was ich auf welten-bau.de angezeigt bekomme, nicht zu deinen Fehlerbeschreibungen passt. Ich sehe auch nicht, dass dein Script eine Liste erzeugt, aber welten-bae.de liefert eine. Offenbar ist das Script mittlerweile weiterentwickelt worden und Du hast die Probleme teilweise schon gelöst.

      Also erstmal nur die „einfachen“ Fehler:

      echo '$Verzeichnis + $NAME ' . $entry[$i] ['verzeichnis+name']

      zeigt deshalb nichts an, weil du bei dem Befüllen dieses Eintrags in $entry[i] die array_merge Funktion verwendest. array_merge erwartet aber zwei Arrays als Eingabe und hängt sie zusammen. DU willst zwei Strings zusammenketten - und dafür reicht $verz . $datei vollkommen aus. Lass den array_merge-Aufruf darum herum einfach weg.

      echo 'BILDabmessungen ' . $entry[$i] ['bildabmessungen'[0]] . "\n";

      zeigt nichts an, weil Du die Array-Zugriffe falsch schachtelst. Was Du geschrieben hast, ist (in der Reihenfolge wie PHP es durchführt)

      • nimm die Zeichenkette 'bildabmessungen'
      • hol die das erste Zeichen davon - also 'b'
      • verwende das als Zugriffsschlüssel für $entry[i] - das findet nichts.

      Richtig ist: $entry[$i] ['bildabmessungen'] [0] . "\n";

      Sortierung nach Name

      Hierfür musst Du den Einlesevorgang von der Ausgabe trennen. D.h. du brauchst zwei Schleifen, die nacheinander laufen. Dazwischen sortierst Du das Array.

      Zum Sortieren bietet es sich an, das $entry-Array NICHT numerisch zu indizieren, sondern den Dateinamen als Index zu verwenden (also ein assoziatives Array). Die ksort-Funktion macht das Sortieren dann leicht (andernfalls müsstest Du mit usort und einem Sort-Callback herumbasteln).

      $entry = []; // $entry als leeres Array vorbereiten while ($datei = readDir($verzeichnis)) { if ($datei != "." && $datei != "..") { $entry[$datei] = [ 'name' => $datei, 'verzeichnis+name' => $verz . $datei, 'bildabmessungen' => getImageSize($datei), 'berechnungen' => 'berechnungen' ]; } } // SORT_NATURAL würde bsw. img2 vor img10 einsortieren (was normalerweise nicht passiert) // SORT_FLAG_CASE sortiert case-insensitive - lass das weg wenn du das nicht willst ksort($entry, SORT_NATURAL | SORT_FLAG_CASE); // Ausgeben foreach ($entry as $datei => $eintrag) { echo "<a href=\"img/$datei\"> $datei</a><br>\n"; echo "Vollst. Name: {$eintrag['verzeichnis+name']}\n"; echo "Bildabmessungen: {$eintrag['bildabmessungen'][0]}\n"; }

      Rolf

      -- sumpsi - posui - clusi
      1. Soweit, so gut!

        Gut sieht es aus, und ich hoffe es ist nun alles richtig!

        <?php $entry = []; if ($handle = opendir('img/')) { while (false !== ($verzeichnis = readdir($handle))) { if ($verzeichnis != "." && $verzeichnis != "..") { $entry[$verzeichnis] = [ 'name' => $verzeichnis, 'verzeichnis+name' => 'img/' . $verzeichnis, 'bildabmessungen' => getImageSize('img/' . $verzeichnis), 'berechnungen' => 'berechnungen' ]; } } ksort($entry, SORT_NATURAL | SORT_FLAG_CASE); foreach ($entry as $verzeichnis => $eintrag) { echo "name : {$verzeichnis}\n"; echo "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \n"; echo "pfad & name : {$entry[$verzeichnis]['verzeichnis+name']}\n"; echo "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \n"; echo "Bildabmessungen == width: {$entry[$verzeichnis]['bildabmessungen'][0]} height: {$entry[$verzeichnis]['bildabmessungen'][1]}\n"; echo "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \n"; echo "<a href=\"img/$verzeichnis\">$verzeichnis</a><br>\n"; } closedir($handle); } ?>

        Er gibt mir folgendes aus: DEMO

        An diese Kurzschreibweise kann ich mich irgendwie nicht gewöhnen!

        Bitte nocheinmal kurz drübergucken…

        Morgen gehts weiter…

        Gruß der einsiedelnde

        1. Hello,

          sieht doch schon besser aus. Ein paar "Kleinigkeiten" sollten aber noch verbessert werden. :-)

          Grundsätzlich solltest Du dich dazu durchringen, abgrenzbare Funktionen aus dem Code zu machen. Dann lassen sich die Fehler, notwenige Änderungen am Code, usw. besser zuordnen. Und auch anderenfalls sollten die "IF-Blöcke" auch immer das umschließen, was sie denn abfragen.

          Beispiel: Wenn kein Handle für das Verzeichnis erstellt werden konnte, kann man auch keinen Kanal für dieses Handle wieder schließen. Es gibt ja keinen!

          Und Variablen sollen das enthalten, was ihre Namen suggerieren. $verzeichnis ist daher ein irreführender Name. Du solltest z. B. lieber $dateiname dafür benutzen.

          Ich ändere deshalb nicht grundsätzlich deinen Code, sondern sortiere ihn nur etwas.

          <?php function get_image_filenames($verzeichnis=false) { if ($verzeichnis === false) return false; ## Daisy-Chain-Skip $verzeichnis = rtrim($verzeichnis, '/') . '/'; ## Normierung nach POSIX $_liste = array(); if ($vhandle = opendir($verzeichnis)) { while (false !== ($filename = readdir($vhandle))) { if (is_file($filename)) { if (false !== ($imgsize = getImageSize($verzeichnis . $filename))) ## ist es ein Bild? { $_liste[$filename] = array( 'name' => $filename, 'pfad' => ($verzeichnis . $filename), 'bildabmessungen' => $imgsize, 'berechnungen' => 'berechnungen' ); ## Berechnungen ist deine nächste Baustelle? } } } ksort($entry, SORT_NATURAL | SORT_FLAG_CASE); closedir($handle); return $_liste } return false; } #------------------------------------------------------------------------------- function html_list_filename($_liste=false) { if (($_liste === false) or (!is_array($_liste)) return false; ## Daisy-Chain-Skip $htmlout = ''; foreach ($_liste as $filename => $_fileinfo) { $htmlout = "\n<pre>\n"; $htmlout .= "name:\t {$filename}\n"; $htmlout .= "\n"; $htmlout .= "pfad & name:\t {$_fileinfo[path]}\n"; $htmlout .= "\n"; $htmlout .= "Bildabmessungen:\n"; $htmlout .= "\twidth:\t {$entry[$verzeichnis]['bildabmessungen'][0]}\n"; $htmlout .= "\theight:\t {$entry[$verzeichnis]['bildabmessungen'][1]}\n"; $htmlout .= "\n"; $htmlout .= "<a href=\"$path\">$path</a>\n"; $htmlout .= "</pre>\n"; } return $htmlout; } #------------------------------------------------------------------------------- $_liste = get_image_filenames('img/'); echo html_list_filename($_liste); ?>

          Das lässt sich bestimmt alles noch viel hübscher schreiben. Mindestens für den Anfang würde ich aber auf jeden Fall von Kurzschreibweisen absehen!

          Man könnte es als nächsts nun noch durch Error-Logging ergänzen, oder den berüchtigten Filter auf MIME-Types. Da getimagesize() hierfür schon sehr viele Informationen zur Verfügung stellt (im zweiten, bisher ungenutzten Parameter), würde ich dort ansetzen.

          Bitte selber den/die Fehler suchen, der/die laut Highlighter noch drinstecken. Ich kann es jetzt so nicht testen.

          Liebe Grüße
          Tom S.

          -- Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
          1. Hello,

            die zweite Funktion tauschen wir mal aus...

            function html_list_filename($_liste) if (($_liste === false) or (!is_array($_liste)) return false; ## Daisy-Chain-Skip $htmlout = ''; foreach ($_liste as $filename => $_fileinfo) { $htmlout = "\n<pre>\n"; $htmlout .= "name:\t {$filename}\n"; $htmlout .= "\n"; $htmlout .= "pfad & name:\t {$_fileinfo['path']}\n"; $htmlout .= "\n"; $htmlout .= "Bildabmessungen:\n"; $htmlout .= "\twidth:\t {$_fileinfo[$filename]['bildabmessungen'][0]}\n"; $htmlout .= "\theight:\t {$_fileinfo[$filename]['bildabmessungen'][1]}\n"; $htmlout .= "\n"; $htmlout .= "<a href=\"". htmlspecialchars($_fileinfo['path'], ENT_QUOTES) . "\">" . htmlspecialchars($_fileinfo['path'], ENT_QUOTES) . "</a>\n"; $htmlout .= "</pre>\n"; } return $htmlout; }

            Ich hoffe, dass nun die Fehler beseitigt sind. Insbesondere bei der Ausgabe von Dateipfaden muss der Kontextwechsel beachtet werden.

            Liebe Grüße
            Tom S.

            -- Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
          2. Vielen Dank! Das sieht prima aus! DANKE!

            Leider steckt da wohl noch ein Fehler drinnen den ich nicht finde!

            Die "Ausgabe-Funktion" braucht eigentlich nicht so umfangreich perfekt sein denn sie diente mir jetzt lediglich dazu, zu sehen ob auch wirklich auch alles in den Variablen enthalten ist. Später brauche ich diese "Ausgabe" nicht, sondern möchte nur mit den Variablen weiter "rechnen" bzw. den Pfad ins '<img scr="'<?php{$_fileinfo['path']}?>'>' hineinschreiben.

            Villeicht findest Du den Fehler!

            Grüsse der einsiedelnde

            1. Hello,

              Vielen Dank! Das sieht prima aus! DANKE!

              Leider steckt da wohl noch ein Fehler drinnen den ich nicht finde!

              wie lauten denn die Fehlermeldungen?

              Liebe Grüße
              Tom S.

              -- Es gibt nichts Gutes, außer man tut es!
              Das Leben selbst ist der Sinn.
              1. Geh mal auf: Fehlerseite NEU

                1. Hello,

                  Geh mal auf: Fehlerseite NEU

                  Ich bekomme gar keine Ausgabe.
                  Also hast Du wohl die Fehlerausgabe abgeschaltet. Das ist für den produktiven Betrieb auch richtig. Fürs Debuggen benötigen wir aber die Fehlermeldungen.

                  Schreib mal (übergangsweise) oben in dein Skript error_reporting(E_ALL); rein. Sonst müsstest Du das ggf. Log anschauen.

                  Liebe Grüße
                  Tom S.

                  -- Es gibt nichts Gutes, außer man tut es!
                  Das Leben selbst ist der Sinn.
                  1. Da tut sich nichts. Wie mache ich das?

                    Anm.: Hab da eventuell etwas: Im developer-tool: Failed to load resource: the server responded with a status of 500 (Internal Server Error)

                    1. Hello,

                      debuggen, debuggen, debuggen ...

                      Die Funktionen einzeln testen. Dazu muss man sich passende Umgebungen schaffen. Du könntest z. B. erst einmal function get_image_filenames()testen, indem Du dir das resultierende Array mit print_r() anzeigen lässt.

                      Aber ich sehe schon einen Fehler:

                      <?php function get_image_filenames($verzeichnis=false) { if ($verzeichnis === false) return false; ## Daisy-Chain-Skip $verzeichnis = rtrim($verzeichnis, '/') . '/'; ## Normierung nach POSIX $_liste = array(); if ($vhandle = opendir($verzeichnis)) { while (false !== ($filename = readdir($vhandle))) { if (is_file($verzeichnis . $filename)) { if (false !== ($imgsize = getImageSize($verzeichnis . $filename))) ## ist es ein Bild? { $_liste[$filename] = array( 'name' => $filename, 'pfad' => ($verzeichnis . $filename), 'bildabmessungen' => $imgsize, 'berechnungen' => 'berechnungen' ); ## Berechnungen ist deine nächste Baustelle? } } } ksort($entry, SORT_NATURAL | SORT_FLAG_CASE); closedir($handle); return $_liste } return false; } #-------------------------------------------------------------— $_liste = get_image_filenames('img/'); echo "<pre>\n"; echo print_r($_liste, 1); echo "</pre>\n"; ?>

                      Es muss wohl if (is_file($verzeichnis . $filename)) heißen, da das Skript ja im aktuellen Working Directory ausgeführt wird, und die Files im Unterverzeichnis "$verzeichnis" liegen.

                      Liebe Grüße
                      Tom S.

                      -- Es gibt nichts Gutes, außer man tut es!
                      Das Leben selbst ist der Sinn.
                      1. Ich werd noch bekloppt!

                        Hab bis jetzt dies:

                        <?php function get_image_filenames($verzeichnis=false) { if ($verzeichnis === false) return false; ## Daisy-Chain-Skip $verzeichnis = rtrim($verzeichnis, '/') . '/'; ## Normierung nach POSIX $_liste = array(); if ($vhandle = opendir($verzeichnis)) { while (false !== ($filename = readdir($vhandle))) { if (is_file($verzeichnis . $filename)) { if (false !== ($imgsize = getImageSize($verzeichnis . $filename))) ## ist es ein Bild? { $_liste[$filename] = array( 'name' => $filename, 'pfad' => ($verzeichnis . $filename), 'bildabmessungen' => $imgsize, 'berechnungen' => 'berechnungen' ); ## Berechnungen ist deine nächste Baustelle? } } } ksort($_liste[$filename], SORT_NATURAL | SORT_FLAG_CASE); closedir($vhandle); return $_liste; } return false; } #------------------------------------------------------------------------------- function html_list_filename($_liste) { if (($_liste === false) or (!is_array($_liste)) return false; ## Daisy-Chain-Skip $htmlout = ''; foreach ($_liste as $filename => $_fileinfo) { $htmlout = "\n<pre>\n"; $htmlout .= "name:\t {$filename}\n"; $htmlout .= "\n"; $htmlout .= "pfad & name:\t {$_fileinfo['path']}\n"; $htmlout .= "\n"; $htmlout .= "Bildabmessungen:\n"; $htmlout .= "\twidth:\t {$_fileinfo[$filename]['bildabmessungen'][0]}\n"; $htmlout .= "\theight:\t {$_fileinfo[$filename]['bildabmessungen'][1]}\n"; $htmlout .= "\n"; $htmlout .= "<a href=\"". htmlspecialchars($_fileinfo['path'], ENT_QUOTES) . "\">" . htmlspecialchars($_fileinfo['path'], ENT_QUOTES) . "</a>\n"; $htmlout .= "</pre>\n"; } return $htmlout; } #------------------------------------------------------------------------------- $_liste = get_image_filenames('img/'); echo html_list_filename($_liste); ?>

                        Aber es geht noch nicht!

                        Link zur Fehlerseite

                        Grüsse T.

                      2. debuggen, debuggen, debuggen …

                        Aus ja. Ich habe heute was schöneres als print_r() gesucht. Und weil ich nichts wirklich schönes gefunden habe, naja, da hab ich mir selbst was gebaut.

                      3. Hello,

                        wenn Du alle Fehler gefunden hast (das dauert keine 60 Sekunden), kommt z. B. sowas dabei heraus:

                        Array ( [gehirn.php.jpg] => Array ( [name] => gehirn.php.jpg [pfad] => img/gehirn.php.jpg [bildabmessungen] => Array ( [0] => 207 [1] => 286 [2] => 2 [3] => width="207" height="286" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) [berechnungen] => berechnungen ) [Gehirn_einschalten.png] => Array ( [name] => Gehirn_einschalten.png [pfad] => img/Gehirn_einschalten.png [bildabmessungen] => Array ( [0] => 165 [1] => 211 [2] => 3 [3] => width="165" height="211" [bits] => 8 [mime] => image/png ) [berechnungen] => berechnungen ) [grunes-hakchen-im-kreis.jpg] => Array ( [name] => grunes-hakchen-im-kreis.jpg [pfad] => img/grunes-hakchen-im-kreis.jpg [bildabmessungen] => Array ( [0] => 540 [1] => 626 [2] => 2 [3] => width="540" height="626" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) [berechnungen] => berechnungen ) [Haustürschloss_978X-652X-TZ-gross.jpg] => Array ( [name] => Haustürschloss_978X-652X-TZ-gross.jpg [pfad] => img/Haustürschloss_978X-652X-TZ-gross.jpg [bildabmessungen] => Array ( [0] => 576 [1] => 800 [2] => 2 [3] => width="576" height="800" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) [berechnungen] => berechnungen ) [IP-Classes.png] => Array ( [name] => IP-Classes.png [pfad] => img/IP-Classes.png [bildabmessungen] => Array ( [0] => 400 [1] => 153 [2] => 3 [3] => width="400" height="153" [bits] => 8 [mime] => image/png ) [berechnungen] => berechnungen ) [LadyBiker.jpg] => Array ( [name] => LadyBiker.jpg [pfad] => img/LadyBiker.jpg [bildabmessungen] => Array ( [0] => 400 [1] => 400 [2] => 2 [3] => width="400" height="400" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) [berechnungen] => berechnungen ) [Neues Bild (1).png] => Array ( [name] => Neues Bild (1).png [pfad] => img/Neues Bild (1).png [bildabmessungen] => Array ( [0] => 795 [1] => 622 [2] => 3 [3] => width="795" height="622" [bits] => 8 [mime] => image/png ) [berechnungen] => berechnungen ) [Neues Bild.png] => Array ( [name] => Neues Bild.png [pfad] => img/Neues Bild.png [bildabmessungen] => Array ( [0] => 605 [1] => 341 [2] => 3 [3] => width="605" height="341" [bits] => 8 [mime] => image/png ) [berechnungen] => berechnungen ) [Protocols.bmp] => Array ( [name] => Protocols.bmp [pfad] => img/Protocols.bmp [bildabmessungen] => Array ( [0] => 590 [1] => 775 [2] => 6 [3] => width="590" height="775" [bits] => 24 [mime] => image/x-ms-bmp ) [berechnungen] => berechnungen ) )

                        Es stecken aber tatsächlich noch ein Schusselfehler drin. Ich hatte es ja vorhin nicht testen können...

                        Und in der zweiten Funktion sind auch noch ein paar Fehler. Wenn man ein Array-Eleemtn mit dem Namen "pfad" anlegt, muss man es nachher auch so benutzten und nicht unter "path" suchen ;-O

                        Viel Erfolg bei den Debug-Übungen.
                        Wenn Du die erst einmal drauf hast, geht in Zukunft alles viel schneller ;-)

                        Liebe Grüße
                        Tom S.

                        -- Es gibt nichts Gutes, außer man tut es!
                        Das Leben selbst ist der Sinn.
                        1. O.K. bei der zweiten Funktion sieht man es auch ohne debuggen:

                          function html_list_filename($_liste) { if (($_liste === false) or (!is_array($_liste)) return false; ## Daisy-Chain-Skip $htmlout = ''; foreach ($_liste as $filename => $_fileinfo) { $htmlout = "\n<pre>\n"; $htmlout .= "name:\t {$filename}\n"; $htmlout .= "\n"; $htmlout .= "pfad & name:\t {$_fileinfo['dort==>pfad<==']}\n"; $htmlout .= "\n"; $htmlout .= "Bildabmessungen:\n"; $htmlout .= "\twidth:\t {$_fileinfo[$filename]['bildabmessungen'][0]}\n"; $htmlout .= "\theight:\t {$_fileinfo[$filename]['bildabmessungen'][1]}\n"; $htmlout .= "\n"; $htmlout .= "<a href=\"". htmlspecialchars($_fileinfo['dort==>pfad<=='], ENT_QUOTES) . "\">" . htmlspecialchars($_fileinfo['dort==>pfad<=='], ENT_QUOTES) . "</a>\n"; $htmlout .= "</pre>\n"; } return $htmlout; }

                          Aber wo bitte ist der Fehler in der ersten funktion?

                          ksort($_liste[$filename], SORT_NATURAL | SORT_FLAG_CASE); closedir($vhandle);

                          habe ich berichtigt aber da ist immer noch der Fehler!

                          BITTE BITTE sag mir die Lösung, das mit diesem debuggen kapier ich nicht!

                          Gruss verzweifelt t.

                          1. Hello,

                            zum Sortieren des Arrays nach den Schlüsseln: ksort($_liste)

                            Das müsste es dann gewesen sein.

                            Du ,usst das Skripg doch nur laufen lassen mit eingeschalteter Fehlerausgabe. Dann sagt dir PHP doch, wo es noch kneift ;-)

                            Liebe Grüße
                            Tom S.

                            -- Es gibt nichts Gutes, außer man tut es!
                            Das Leben selbst ist der Sinn.
                            1. NO, läuft nicht…

                              hab dort jetzt:

                              ksort(($_liste), SORT_NATURAL | SORT_FLAG_CASE); closedir($vhandle); return $_liste;

                              dort stehn und immer noch ein Fehler! Fehler

                              Wie macht man das mit der Fehleranzeige?

                              <seufZ></seufZ>

                              1. Hello,

                                <?php error_reporting(E_ALL); ... ?>

                                Einfach nur als erste Zeile ins Skript aufnehmen.

                                Liebe Grüße
                                Tom S.

                                -- Es gibt nichts Gutes, außer man tut es!
                                Das Leben selbst ist der Sinn.
                                1. Ich habe folgendes im meinem notepad++ stehen:

                                  Link zum Screen meines Notepad++

                                  Aber es funzt nicht.

                                  Ich geb auf, würde für etwas fertiges zahlen. Ich hab heute nicht mehr den Nerv dazu ein Phantom-Fehler zu suchen. Nichts funktioniert!!! Dorriiiiiiee…

                                  Link zum Fehler

                                  <seufZ> </seufZ>

                                  1. Hello,

                                    im ersten Teil ist bei ksort() eine Klammer zuviel.

                                    Wenn keine Fehler angezeigt werden, muss ggf. noch die Zeile

                                    ini_set('display_errors', 1);

                                    eingefügt werden.

                                    Liebe Grüße
                                    Tom S.

                                    -- Es gibt nichts Gutes, außer man tut es!
                                    Das Leben selbst ist der Sinn.
                                    1. NOPE, liegt es villeicht an der PHP Version? Eingestellt ist mom. V5.6 ?

                                      1. Hello,

                                        dann fällt mir jetzt nur noch

                                        ini_set('display_startup_errors', 1);

                                        ein als weitere Direktive am Amfang.

                                        Ob man das überhaupt IM Skript einstellen kann, oder ob es nicht schon vorher eingestellt sein muss (meine Vermutung), weiß ich im Moment nicht.

                                        Sonst stehen dort zur Testzeit also drei Fehlerdirektiven.

                                        Und noch was: hast Du vielleicht eine BOM am Anfang der Datei?

                                        Liebe Grüße
                                        Tom S.

                                        -- Es gibt nichts Gutes, außer man tut es!
                                        Das Leben selbst ist der Sinn.
                                        1. Also, laut meinem PLESK Onyx hab ich Version

                                          5.6.30

                                          7.0.18

                                          7.1.4

                                          Dann kann ich einstellen:

                                          FastCGI_Anwendung von Apache bedient

                                          FPM_Anwendung von Apache bedient (bei mir grad eingestellt!!!)

                                          FPM-Anwendung von Nginx bedient

                                          error_reporting: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

                                          aahhhhhhhhhh:

                                          display_errors: off (standart)

                                          das muss ich wohl on schalten aber ist die art error-reporting richtig

                                          oder ich kann dort einstellen:

                                          E_ALL & ~E_STRICT & ED~E_DEPRECAT

                                          E_ALL & ~E_NOTICE

                                          E_ALL

                                          hab aber jetzt ersteinmal log-errors auf : on gesetzt!!!

                                          zusätzliche Anmerkung 20:43h

                                          das auf on setzen war richtig:

                                          Fehlermeldung: Parse error: syntax error, unexpected ',' in /var/www/vhosts/welten-bau.de/httpdocs/test/testseite_uebung1/bildausgabe_demo_C.php on line 30

                                          SCREEN notepad++

                                          grüsse

                                          1. OOOOOkaaaaay:

                                            hab im Plesk log-errors auf == on == gesetzt!!!

                                            erste Fehlermeldung 20:45h

                                            Fehlermeldung: Parse error: syntax error, unexpected ',' in /var/www/vhosts/welten-bau.de/httpdocs/test/testseite_uebung1/bildausgabe_demo_C.php on line 30

                                            Fehlermeldung behoben! Es fehlte eine Anfangs-(

                                            22:05h

                                            Fehlermeldung Parse error: syntax error, unexpected 'return' (T_RETURN) in /var/www/vhosts/welten-bau.de/httpdocs/test/testseite_uebung1/bildausgabe_demo_C.php on line 39

                                            Nun komme ich aber nicht weiter!

                                            Screen vom Notepad++

                                            Abendliche Grüsse T.

                                            1. Hallo,

                                              Fehlermeldung behoben! Es fehlte eine Anfangs-(

                                              gewöhn dir bitte an, Klammern immer paarweise zu schreiben.

                                              Nun komme ich aber nicht weiter!

                                              gewöhn dir bitte an, Klammern immer paarweise zu schreiben.

                                              Gruß
                                              Kalk

                                              1. Das verstehe ich jetzt nicht?

                                                1. Hallo,

                                                  Das verstehe ich jetzt nicht?

                                                  zu einer öffnenden Klammer gehört immer eine schließende.

                                                  wusste schon Noah

                                                  Gruß
                                                  Kalk

                                                  1. und wo jetzt bitteschön in meinem Fall, ab Zeile 39???

                                                    achso... das hier:

                                                    if (($_liste === false) or (!is_array($_liste)) return false); ## Daisy-Chain-Skip

                                                    ist schon behoben, es gibt aber immer noch dieselbe Fehlermeldung!

                                                    1. Hallo einsiedler,

                                                      Die klammer hinter dem false gehört da nicht hin, die gehört zum if und deshalb vor das return

                                                      Rolf

                                                      -- sumpsi - posui - clusi
                                                    2. Hallo,

                                                      ist schon behoben, es gibt aber immer noch dieselbe Fehlermeldung!

                                                      offensichtlich ists wohl eben doch nicht behoben…

                                                      Es kommt dann nicht nur auf das paarweise Auftreten, sondern auch auf die richtige Position an.

                                                      Gruß
                                                      Kalk

                                    2. Von wegen 60 Sekunden Arbeit, ich sitze hier und rätsel seid Stunden und ich möchte endlich mal damit fertig werden:

                                      Hier das Screen von meinem Notepad++ (AKTUALISIERT & letzte Version!!!)

                                      SCREEN vom == notepad++ ==

                                      Aktuell tauchen folgende Fehlermeldungen auf: DEMO SEITE (fehlerhaft)

                                      Was bedeutet dies nun wieder?

                                      Abendlichen Gruß

                                      <seufZ> der einsiedelnde

                                      1. Hello,

                                        ja, das ist klar.

                                        es darf nur $_fileinfo['bildabmessungen'] heißen, oder aber
                                        $_liste[$filename]['bildabmessungen'], je nachdem, ob Du auf die Elementkopie des Arrays in der foreach()-Schleife, oder auf das Originalelement in der Gesa,tliste zugreifen willst.

                                        Liebe Grüße
                                        Tom S.

                                        -- Es gibt nichts Gutes, außer man tut es!
                                        Das Leben selbst ist der Sinn.
                                        1. Okay, das ist nun klar! :o) SUPI! Es läuft ... (anscheinend...!)

                                          funktionierendes PHP JUHUUUUU...

                                          Aber werden nur die allerletzten Daten vom letzten Bild ausgegeben oder

                                          müsste die == funktion html_list_filename($_liste) == alle , von allen

                                          Bildern die sich im Ordner befinden, ausgeben?

                                          Ich meine, ist das nun korrekt so?

                                          Solch eine Ausgabe ist für mich eigentlich nicht so wichtig, Hauptsache das Array speichert

                                          die Variablen in der richtigen Folge.

                                          Um das zu überprüfen hab ich damit angefangen die Variablen einzeln per echo auszugeben.

                                          Darum eigentlich die zweite Funktion... die Du daraus gemacht hast...

                                          (Siehe Link oben! Da stehen nur die Infos vom letzten IMG!)

                                          Hier nun noch das aktuelle Screen vom Notepad++ (Mit Änderungen!)

                                          Screen vom Notepad++

                                          Gute N8 der einsiedelnde

                                          1. Hello,

                                            Du hast noch den Hierarchiefehler in den Bezeichnern des Arrays. Hatte ich Dir aber schon geschrieben.

                                            Es muss in der foreach()-Schleife nur

                                            echo $_fileinfo['berechnungen'][0]; ### usw.

                                            Ich würde es Dir ja fertigschreiben, aber mit dem Tablet ist das zu mühseöig... Vielleicht ist ja jemand Anderes so nett? 😉

                                            Liebe Grüße
                                            Tom S.

                                            -- Es gibt nichts Gutes, außer man tut es!
                                            Das Leben selbst ist der Sinn.
                                            1. <seufZ> </seufZ>

                                              1. Hello,

                                                hier die kurze lauffähige Version in der Testumgebung.
                                                Du siehst daran, dass nur drei Zeilen zum Test-Anzeigen des erzeugten Datenarrays notwendig sind.

                                                <?php ### getImageFilenames.php ### utf-8 ### ÄÖÜäöü function get_image_filenames($verzeichnis=false) { if ($verzeichnis === false) return false; ## Daisy-Chain-Skip $verzeichnis = rtrim($verzeichnis, '/') . '/'; ## Normierung nach POSIX $_liste = array(); if ($vhandle = opendir($verzeichnis)) { while (false !== ($filename = readdir($vhandle))) { if (is_file($verzeichnis . $filename)) { if (false !== ($imgsize = getImageSize($verzeichnis . $filename))) ## ist es ein Bild? { $_liste[$filename] = array( 'name' => $filename, 'pfad' => ($verzeichnis . $filename), 'bildabmessungen' => $imgsize, 'berechnungen' => 'berechnungen' ); ## Berechnungen ist deine nächste Baustelle? } } } ksort($_liste, SORT_NATURAL | SORT_FLAG_CASE); closedir($vhandle); return $_liste; } return false; } #-------------------------------------------------------------— $_liste = get_image_filenames('img/'); echo "<pre>\n"; echo print_r($_liste, 1); echo "</pre>\n"; ?>

                                                Wichtig ist noch zu erwähnen, dass obige Funktion in dieser Form noch nicht nebenläufigkeitsfest ist!

                                                Wenn Du mehr brauchst, dann schreib mit eine eMail mit deinen Anforderungen an selfhtml@bitworks.de

                                                Liebe Grüße
                                                Tom S.

                                                -- Es gibt nichts Gutes, außer man tut es!
                                                Das Leben selbst ist der Sinn.
                                                1. Vielen Dank! Super! :o)

                        2. SORRY! Ja, es ist wunderbar das es bei Dir läuft!

                          Entweder nehm ich jetzt mein allererstes, auch wenn es fehlerhaft sein sollte,

                          zumindest funktioniert es aber so wie es soll, nicht so diese komplizierte letzte Version…

                          Oder bitte macht mir das jetzt jemand, verdammt ich bezahle auch dafür.

                          Es ist Tag 3 und ich komme nicht weiter und ich hab keine Geduld mehr!

                          <seufZ> grummel </seufZ>

                          der einsiedelnde

                          1. Aloha ;)

                            SORRY! Ja, es ist wunderbar das es bei Dir läuft!

                            [...]

                            Oder bitte macht mir das jetzt jemand, verdammt ich bezahle auch dafür.

                            Es ist Tag 3 und ich komme nicht weiter und ich hab keine Geduld mehr!

                            <seufZ> grummel </seufZ>

                            Deine Frustration aufgrund eines bei dir auftretenden Problems in allen Ehren, aber ich muss dich nachdrücklich darauf hinweisen, dass es die hier Antwortenden verdient haben, dass du deinem Frust nicht hier und vor allem nicht in einer solchen Deutlichkeit über mehrere Postings hinweg Luft machst.

                            Ich würde dich nur ungern durch einen moderierenden Eingriff der Hilfe berauben, die dir hier widerfährt, und bitte dich deshalb ultimativ einen Gang runterzuschalten und geduldig zu sein.

                            Ich wünsche dir weiterhin viel Glück bei der Lösungssuche zu deinem fachlichen Problem.

                            Grüße,

                            RIDER

                            -- Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller

                            # Twitter # Steam # YouTube # Self-Wiki #

                            Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
          3. Fehlerseite NEU

            Ich hab soweit dies: Hab 2-3 Sachen koregiert:

            (Da steckt wohl noch ein Fehler drinnen, den ich einfach nicht finde:

            <?php function get_image_filenames($verzeichnis=false) { if ($verzeichnis === false) return false; ## Daisy-Chain-Skip $verzeichnis = rtrim($verzeichnis, '/') . '/'; ## Normierung nach POSIX $_liste = array(); if ($vhandle = opendir($verzeichnis)) { while (false !== ($filename = readdir($vhandle))) { if (is_file($filename)) { if (false !== ($imgsize = getImageSize($verzeichnis . $filename))) ## ist es ein Bild? { $_liste[$filename] = array( 'name' => $filename, 'pfad' => ($verzeichnis . $filename), 'bildabmessungen' => $imgsize, 'berechnungen' => 'berechnungen' ); ## Berechnungen ist deine nächste Baustelle? } } } ksort($_liste[$filename], SORT_NATURAL | SORT_FLAG_CASE); closedir($vhandle); return $_liste; } return false; } #------------------------------------------------------------------------------- function html_list_filename($_liste) { if (($_liste === false) or (!is_array($_liste)) return false; ## Daisy-Chain-Skip $htmlout = ''; foreach ($_liste as $filename => $_fileinfo) { $htmlout = "\n<pre>\n"; $htmlout .= "name:\t {$filename}\n"; $htmlout .= "\n"; $htmlout .= "pfad & name:\t {$_fileinfo['path']}\n"; $htmlout .= "\n"; $htmlout .= "Bildabmessungen:\n"; $htmlout .= "\twidth:\t {$_fileinfo[$filename]['bildabmessungen'][0]}\n"; $htmlout .= "\theight:\t {$_fileinfo[$filename]['bildabmessungen'][1]}\n"; $htmlout .= "\n"; $htmlout .= "<a href=\"". htmlspecialchars($_fileinfo['path'], ENT_QUOTES) . "\">" . htmlspecialchars($_fileinfo['path'], ENT_QUOTES) . "</a>\n"; $htmlout .= "</pre>\n"; } return $htmlout; } #------------------------------------------------------------------------------- $_liste = get_image_filenames('img/'); echo html_list_filename($_liste); ?>

            Was ist dort noch falsch: Fehlerseite NEU

            Gruss der einsiedelnde

    2. Hello,

      Du hast uns nicht zugelesen!

      Ich wiederhole hier nur erst meine Einwände bezüglich der richtigen Anwendung von readdir() (schau dir das Beispiel bitte genau an!) und der geforderten Fehlerbehandlung. Weiterer Beitrag zum Thread folgt eventuell später noch.

      Mach aus dem ganzen Ding eine Funktion und füge nach jedem strittigen Statement ggf. eine eigene Logsequenz ein, wenn PHP diese im Betrieb nicht eigenständig erzeugen würde.

      Beispiel:

      if (false === ($dh = openDir($path)) { error_log('...' . error_get_last() . ' ... '); return false; }

      Wann das genau sinnvoll ist, sollte nochmals separat diskutiert werden. Obiges war nur ein Syntax-Beispiel. Das return false ist aber bei Fehler auf jeden Fall sinnvoll, wenn das Weiterarbeiten ohnehin nur Folgefehler verursachen würde.

      Das ist dann auch der Grund für eine fein granulierte Aufgliederung in Funktionen/Methoden mit genau abgegrenzten Aufgaben und normalerweise ohne eigene Ausgabe über den Standardausgabekanal. Nur Funktionen, die gezielt für die Ausgabe gedacht sind, sollten auch eine solge erzeugen.

      Liebe Grüße
      Tom S.

      -- Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
    3. Moin,

      in deinem Code fehlt etwas.

      Viele Grüße
      Robert