PHP - Warum Sortiert er nicht genau ???

  • PHP

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    PHP - Warum Sortiert er nicht genau ???

    Weis einer von euch warum er Dateien und Ordner nicht sauber trennt ???

    PHP-Quellcode

    1. <?php
    2. $folder = filter_input(INPUT_GET, 'folder');
    3. $handle = opendir($folder);
    4. while($file = readdir($handle))
    5. {
    6. if (is_dir($file) === True){
    7. echo 'folder;'.$file.PHP_EOL;
    8. } else {
    9. echo 'data;' . $file.PHP_EOL;
    10. }
    11. }
    12. closedir($handle);


    Ausgabe:

    folder;. folder;.. folder;Neuer Ordner data;Neuer Ordner (2) data;Neuer Ordner (3) data;Neues Textdokument (2).txt data;Neues Textdokument (3).txt data;Neues Textdokument.txt

    Auch ohne Leerzeichen geht nix !

    folder;. folder;.. data;Neuer_Ordner data;Neuer_Ordner_(2) data;Neuer_Ordner_(3) data;Neues.Textdokument.(2).txt data;Neues.Textdokument.(3).txt data;Neues.Textdokument.txt

    ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TVX“ ()

    TVX schrieb:

    PHP-Quellcode

    1. if (is_dir($file) === True)

    PHP-Quellcode

    1. ===
    :?:

    PHP-Quellcode

    1. ==
    sollte doch völlig reichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ohne die Dokumentation durchzulesen kann niemand genau sagen, was da in allen möglichen Fällen zurückkommt. Und die Dokumentation ist teilweise unvollständig (z.B. kann strcmp auch NULL zurückgeben).

    @TVX
    Ich schlage mal folgendes vor:
    1. Umschließe die ganze Ausgabe mit <pre></pre>, dann wird der Inhalt so angezeigt, wie er ausgegeben wird (Zeilenumbrüche werden nicht verschluckt).
    2. In der Schleife: echo $file; und darunter var_dump(is_dir($file));, dann sieht man mal genau, was da zurückkommt.
    3. Nach jedem Schleifendurchlauf eine extra Leerzeile ausgeben, damit man zusammenhängende Ausgaben besser erkennt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Marcel1997
    Nach dem ich immer auf die Ohren bekam das ich kein ftp nutzen soll hatte ich angefangen in VB ne Klasse zu erstellen mit PHP Anbindung ...
    So weit so gut , nehme ich das dann in Form 1 entgegen :

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private WithEvents DB As New DataBrowser
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. 'xxx
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. DB.ServerAdresse("http://localhost/", "1.php", "Andre", "Loki", "audio/")
    9. End Sub
    10. Private Sub _UpdateCompleted(ByVal sender As Object, ByVal e As UpdateEventArgs) Handles DB._UpdateCompleted
    11. ListBox1.Items.Clear() : ListBox1.Items.AddRange(e.Datenliste.ToArray)
    12. ListBox2.Items.Clear() : ListBox2.Items.AddRange(e.Ordnerliste.ToArray)
    13. ListBox3.Items.Clear() : ListBox3.Items.AddRange(e.Dateiliste.ToArray)
    14. End Sub
    15. End Class


    Nun verhaut mir aber das PHP die Trennung !

    Ich streube mich gewöhnlich vor neuen Sachen wenn ich`s umgehen kann , aber php zu verstehen geht schnell !
    Hatte mir heut Morgen mal nur zum Spaß um 6:00 en VB - PHP Chat gemacht - wollt es einfach mal versuchen - Seltsamer Weise hab ich wesentlich weniger Code gebraucht wie nur in vb


    Mir ist zwar der Syntax noch nicht geläufig - aber ich kanns gut lesen und verstehen - und es hat doch interessante Optionen !

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „TVX“ ()

    @Niko Ortner Ein setzen des Content-Types würde auch schon reichen (Content-Type: text/plain)

    @TVX Mit der Aussage aber php zu verstehen geht schnell liegst du falsch, klar man kommt schnell zu einem Ergebnis, jedoch strotzt dieses dann vor Sicherheitslücken und sehr üblen Code. PHP hat seine Eigenheiten und einige Ecken an bei denen du dir an den Kopf packst und dich fragst "Was zur Hölle?".

    Versuch doch erst mal klar zu definieren was du mit deinen Script erreichen willst und formuliere es so das man es verstehen kann.
    @slice
    Danke, an die Möglichkeit habe ich noch nicht gedacht. Man muss dazu sagen, dass das nur dann funktioniert, wenn man nicht irgendwo mitten in der Ausgabe von Html anfangen will, sondern nur dann, wenn man noch nichts ausgegeben hat.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Jo Jungs - ich weis ich bin nicht immer einfach zu händeln + etwas stur (( Trozdem bin ich ganz entzückt das ihr euch meiner noch annehmt ! ))
    Ich bin zwar sehr speziell aber zwar auch nie unfreundlich , das kann mir keiner nachsagen !!!

    @slice (( PHP hat seine Eigenheiten ))
    Hab da einen Prister der schaut das es nicht all zu schlimm wird :D
    Der ist aber auch der Meinung nur wer selber macht lernt und deshalb dauerts halt etwas länger ^^
    @slice Was ich erreichen Will ist eine getrennte Rückgabe von Ordnern & Dateien :!:

    So ich hab was das geht (( Mit & Ohne Leerzeichen & Co )) und da ihr so angaschiert aufgetreten seid teile ich es gern mit euch :thumbsup:

    Test beinhaltete 3 Dateien + 3 Ordner !

    Dateien auflisten :

    PHP-Quellcode

    1. <?php
    2. $full_path = "audio";
    3. if ($handle = opendir("$full_path")) {
    4. while (false !== ($file = readdir($handle))) {
    5. if(is_dir($full_path."/".$file)) continue;
    6. else echo $file;
    7. }
    8. }
    9. ?>

    Ausgabe :
    Neues Textdokument (2).txtNeues Textdokument (3).txtNeues Textdokument.txt

    Ordner auflisten :

    PHP-Quellcode

    1. <?php
    2. $full_path = "audio";
    3. if ($handle = opendir("$full_path")) {
    4. while (false !== ($file = readdir($handle))) {
    5. if(is_file($full_path."/".$file)) continue;
    6. else echo $file;
    7. }
    8. }
    9. ?>

    Ausgabe :
    ...Neuer OrdnerNeuer Ordner (2)Neuer Ordner (3)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „TVX“ ()

    @TVX:

    so klappt's:

    PHP-Quellcode

    1. <?php
    2. //Ausgangspfad. Den brauchst du um dann mit is_file zu prüfen
    3. $pfad = "./";
    4. //Zwei Arrays zum erfassen der Dateien und Ordner
    5. $Dateien = array();
    6. $Ordner = array();
    7. //Let's go
    8. if($handle = opendir($pfad)){
    9. while($datei = readdir($handle)){
    10. if(!preg_match('/^\.\.?$/', $datei)){ //Hier kurz prüfen ob $datei weder "." noch ".." ist (aktuelles und übergeordnetes Verzeichnis)
    11. if(is_file($pfad . $datei)){
    12. $Dateien[] = $datei;
    13. }else{
    14. $Ordner[] = $datei;
    15. }
    16. }
    17. }
    18. }
    19. echo count($Dateien) . " Dateien: " . implode(', ', $Dateien);
    20. echo "<br>";
    21. echo count($Ordner) . " Ordner: " . implode(', ', $Ordner);
    22. ?>


    Der Code funktioniert so :) Falls du das ganze rekursiv machen willst (also mitsamt aller Unterordner) dann brauchst du ne rekursive Funktion (eine Funktion die sich selbst aufruft und jedes mal den aktuellen Pfad als Argument übergibt). Klingt aber momentan nicht als würdest du es rekursiv machen wollen.


    Link :thumbup:
    Hello World
    @Link275
    Danke ist ne sehr schöne Ausführung und geht super was den ersten Test angeht !
    Die Rückgabe eignet sich auch sehr gut um sie in Vb zu trennen .

    Noch ne Zeile mehr und gudy :

    6 Daten: Neuer Ordner, Neuer Ordner (2), Neuer Ordner (3), Neues Textdokument (2).txt, Neues Textdokument (3).txt, Neues Textdokument.txt
    3 Dateien: Neues Textdokument (2).txt, Neues Textdokument (3).txt, Neues Textdokument.txt
    3 Ordner: Neuer Ordner, Neuer Ordner (2), Neuer Ordner (3)

    Danke & LG :thumbup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TVX“ ()

    Also mal ne Frage , die Zeilenumbrüche (( echo "<br>"; )) werden die in VB nicht erkannt :?:

    Also (( .PHP_EOL )) wird erkannt !

    Muss ich auf was achten ???

    Habs jetz mal so gemacht :

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TVX“ ()

    Hi,

    anstatt <br> kannst du auch "\n" oder "\r\n" verwenden. Du musst dann in PHP zwar mit nl2br() ausgeben, aber in VB sollte es dann automatisch erkannt werden. 100% sicher bin ich mir da jetzt nicht aber ich glaub so klappt es. Ausprobieren :)

    Link :thumbup:
    Hello World
    Zu Post 13: Das ist das angesprochene Thema mit dem Content-Type.
    <br /> ist HTML Element, wenn du mit einem Zeilenumbruch im Text arbeitest und den Content-Type nicht richtig setzt stellt der Browser ihn nicht dar. Im generierten Output ist er aber vorhanden, wird übertragen und kann im Browser unter Quelltext gesehen werden.

    PHP_EOL ist eine Konstante in PHP, vergleichbar mit Environment.NewLine. Also, setz Content-Type: text/plain und für Zeilenumbrüche benutzt du PHP_EOL.

    Zu Post 15: Das ist der Punkt den @Link275 mit rekursive Funktion meint.
    Hi,

    @TVX

    hier ein Code der Verzeichnisse rekursiv durchläuft:

    PHP-Quellcode

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title>Test</title>
    5. </head>
    6. <body>
    7. <?php
    8. //Vorab stellst du die Verzeichnistiefe ein. Also dass z.B. nach
    9. //max. 3 durchlaufenen Verzeichnistiefen schluss ist.
    10. myTest::tiefe(3);
    11. //Jetzt wird die rekursive Funktion zum Auflisten der Verzeichnisse und Dateien aufgerufen
    12. myTest::getDirR('./');
    13. //in $arr wird nun ein Array übergeben. über $arr['Dateien'] oder $arr['Ordner'] kriegst
    14. //du (ebenfalls als Array) alle enthaltenen Ordner oder Dateien.
    15. $arr = myTest::get();
    16. //Hier erfolgt nun erstmals die Ausgabe:
    17. echo count($arr['Ordner']) . " Ordner:<br>";
    18. foreach($arr['Ordner'] as $entry){
    19. echo $entry . "<br>";
    20. }
    21. echo "<hr>";
    22. echo count($arr['Dateien']) . " Dateien:<br>";
    23. foreach($arr['Dateien'] as $entry){
    24. echo $entry . "<br>";
    25. }
    26. class myTest{
    27. private static $Dateien = array();
    28. private static $Ordner = array();
    29. public static $maxtiefe = 4;
    30. public static function getDirR($pfad, $tiefe = 0){
    31. $tiefe++;
    32. if(self::$maxtiefe == $tiefe){
    33. return null;
    34. }
    35. $pfad = @preg_replace('/\/$/', '', $pfad);
    36. $handle = opendir($pfad);
    37. while($datei = readdir($handle)){
    38. if($datei != "." && $datei != ".."){
    39. if(is_dir($pfad . "/" . $datei)){
    40. self::$Ordner[]= $pfad . "/" . $datei;
    41. self::getDirR($pfad . "/" . $datei, $tiefe);
    42. }else{
    43. self::$Dateien[] = $pfad . "/" . $datei;
    44. }
    45. }
    46. }
    47. closedir($handle);
    48. }
    49. public static function get(){
    50. //Hier wird ein Array zurückgegeben das zwei weitere Arrays enthält. Zugriff darauf wie ganz oben beschrieben
    51. $arr = array("Dateien" => self::$Dateien, "Ordner" => self::$Ordner);
    52. return $arr;
    53. }
    54. public static function tiefe($t){
    55. //Tiefe festlegen. Standard ist "2" (siehe oben in Zeile 32).
    56. $t++;
    57. self::$maxtiefe = $t;
    58. }
    59. }
    60. ?>
    61. </body>
    62. </html>


    Das sollte so deinen Erwartungen entsprechen. Für weitere Erklärungen sind die wichtigsten Stellen im Code ja bereits entsprechend beschrieben ;)

    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Link275“ ()

    Guten Morgen ^^

    @Link275
    Danke das ist für weiteres eventuell sehr nützlich :thumbup:

    Im Moment versuche ich über (( PHP )) eine (( Download URL )) zu greiren und auszugeben über Echo

    Also ne Datei (( alle Formate )) zum Download bereitstellen und die jeweilige (( URL )) über (( Echo )) ausgegebenen...
    Hi,

    @TVX gut. Hast du auch soweit verstanden wie's funktioniert? Falls Erklärungsbedarf besteht, einfach fragen.

    Bei deinem zweiten Vorhaben verstehe ich nicht ganz was gemeint ist. Willst du das nun mit dem Code zur Auflistung der Verzeichnisinhalte verbinden und hinter jede Datei einen Download-Link erstellen? Oder ganz unabhängig von deinen anderen Fragen hier im Thread? Falls letzteres gemeint ist, wär es sicher besser du würdest einen neuen Thread erstellen und den hier als erledigt markieren.

    Link :thumbup:
    Hello World