Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PHP: Script geht .... inzwischen (https://www.delphipraxis.net/46584-php-script-geht-inzwischen.html)

DGL-luke 27. Mai 2005 20:17


PHP: Script geht .... inzwischen
 
Das funktionierende ist unten(in meinem letzten post) angehängt und kann gerne verwendet werden.

habe ein php-skript geschreiben, das mir alle bilder eines verzeichnisses in einer tabelle anzeigt.

es geht auch wunderbar, aber ab und an verschluckt es ein paar dateien, sprich zeigt nicht alle an.

hier is mal der code:

Code:
<?php

function is_image($filename) //diese funktion sollte selbsterklärend sein. stimmt sie?
 {
  //echo "Prüfung für $filename ergab ";
  if (is_dir($filename))
   {
   //print "false\n";
    return false;
   }
  $ext=strtolower(substr($filename,-3));
  switch ($ext)
   {
    case "png":
    case "bmp":
    case "gif":
    case "wmf":
    case "jpg":
    case "peg":
     //print "true\n";
     return true;
     break;
    default:
     //print "false\n ";
     return false;
     break;
   }
 }

if (isset($_REQUEST["dir"]  ))  $dirname = $_REQUEST["dir"]; //hier wird die var $dirname initialisiert.
 else $dirname = ".";
 
$dir = opendir($dirname);
 

 
if (isset($_REQUEST["height"])) $height = $_REQUEST["height"]; //noch mehr init....

if (isset($_REQUEST["width"] )) $width = $_REQUEST["width"];
 else $width="100%";


if (isset($_REQUEST["cols"]))  $cols  = $_REQUEST["cols"];
 else if (isset($width))
  $cols= floor(400 / $width);
else $cols=4;

//print "PHP-Skript-Debug-Infos:\n$cols"; //auskommentiert, würde $cols anzeigen


readdir($dir); // . und
readdir($dir); // .. abfangen

$table_string = "<table class=\"main\">\n"; //init für den string, der später in den html-code kommt

while ( $file = readdir($dir)) //alle files werden durchlaufen
 {
  $break=false;
  $table_string .= " <tr>\n"; //eine neue zeile.....
  for ($i=0;$i<$cols;$i++)    //dieser loop liest die zeile komplett ein
   {
    $table_string .= " <td>";
    while (! is_image($file)) //dieser loop sichert, dass in $file ein image steht
     if (! ($file = readdir($dir)))
     { $break=true;
       break;
     }
    if ($break) break;
    $img_string = "<image src=\"$dirname/$file\" ";           //von hier...
    if (isset($height)) $img_string .= "height=\"$height\" ";
    if (isset($width )) $img_string .= "width=\"$width\" ";
    $img_string .= "alt=\"$file\">";
    $table_string .= $img_string;
    $table_string .= "</td>\n";                              //...bis hier wird der stirng erzeugt.
    $file=readdir($dir);                                     //Hö? ach ja damit wird... das is ja eins zu viel des guten... nein ist es nicht, gerade überprüft! stimmt so!
   }

  $table_string .= " </tr>\n";
 }
 
$table_string .= "</table>\n";
?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/transitional.dtd">




<html>
 <head>
  <title>Galerie</title>
 </head>
<body>

<?php echo $table_string; ?>

</body>
</html>
also, ich kann da keinen fehler finden.

ps: dir ist das verzeichnis, cols ist die anzahl der spalten. mehr braucht man nicht. einfach per get übergeben.

[edit=alcaeus][Klammern ersetzt] Mfg, alcaeus[/edit]

noch_ein_hannes 27. Mai 2005 21:02

Re: [PHP] Script geht nicht.....
 
Hi,

In der Funktion is_image() steht folgendes:

Delphi-Quellcode:
case "png":
case "bmp":
case "gif":
case "wmf":
case "jpg":
case "peg":
 //print "true\n";
return true;
break;
das geht so nicht ...
entweder schreibst Du:
Delphi-Quellcode:
case "png":
return true;
break;
case "bmp":
return true;
break;
case "gif":
return true;
break;
case "wmf":
return true;
break;
case "jpg":
return true;
break;
case "peg":
 //print "true\n";
return true;
break;
oder einfacher:
Delphi-Quellcode:
$arrExt = new Array('bmp','gif','jpg','png');
if(in_array($myExt, $arrExt)) return true;
Dein zweifaches readdir() (um . und .. zu filtern) solltest Du so umsetzen:
(ich habe das Bilder filtern gleich mal reingeschrieben)
Delphi-Quellcode:
<?php
$arrExt = new Array('bmp','gif','jpg','png');
$handle=opendir('.');
while ($file = readdir ($handle)) { 
    if ($file != "." && $file != "..") {
    $myExt = strtolower(substr($filename,-3));
    if(in_array($myExt, $arrExt)) echo "$file\n";
    } 
}
closedir($handle);
?>
Ausserdem kann ich nur jedem raten bei der Entwicklung eines Scriptes am Anfang 'error_reporting(E_ALL);' zu notieren, denn dann hilft einem der Interpreter ungemein ...

grüsse,
hannes

S2B 27. Mai 2005 21:06

Re: [PHP] Script geht nicht.....
 
Zitat:

Zitat von DGL-luke
es geht auch wunderbar, aber ab und an verschluckt es ein paar dateien, sprich zeigt nicht alle an.

Kannst du vielleicht mal ein Beispiel-Verzeichnis posten, in dem du den Code testest? Also so:
Code:
dein_ordner
- das_bild.bmp
- das_bild_2.jpg
- foto.gif
usw.
Dann vielleicht noch sagen, welche Dateien es verschluckt. Nur wenn man diese Informationen hat, kann man nach dem Fehler im Code suchen. Wenn man sie nicht hat, braucht das ewig. :wink:

Edit: Es gab keine rote Nachricht. :gruebel:
@noch_ein_hannes: Das switch ist imho so ok. Man kann in der Tat mehrmals case schreiben und nachher für alle auf einmal etwas ausführen lassen. :wink:

DGL-luke 27. Mai 2005 21:22

Re: PHP: Script geht nicht.....
 
jep, da switch stimmt so. is zwar nicht elegant, aber legal.

@files:

ich habs mit 30 dateien getestet, und je kleiner $cols war, desto weniger wurden angezeigt. bin glaube ich auf maximum 26 gekommen.
wenns nur vier sind, gehts aber.

ich werde im übrigen das ganze heute abend komplett umschreiben, und das ganze ein bisschen entschachteln.
da kommt ein array of strng rein, da lad ich dann meine dateinamen rein, und dann wird das ganze in einem rutsch angezeigt. basta.

der vollständigkeit halber kann jemand, der zufällig auf die lösung stößt, diese gerne hier posten.

[werbeeinblendung]
zum editieren kann ich übrigens Creator SE von s.h.a.r.k. (zu finden bei freeware) sehr empfehlen. wenn man noch keinen highlighter für php hat. zum testen XAMPP.
[/werbeeinblendung]

jfheins 27. Mai 2005 21:26

Re: PHP: Script geht nicht.....
 
Ich kann übrigens statt is_image folgende if-Abfrage empfehlen:
Code:
   $imginfo = @ getimagesize ("dateiname");
                  
      if(($imginfo[2] == 1) || ($imginfo[2] == 2) || ($imginfo[2] == 3))
;)

tommie-lie 27. Mai 2005 21:53

Re: PHP: Script geht nicht.....
 
Der Hund liegt hier begraben:
Code:
for ($i=0;$i<$cols;$i++)    //dieser loop liest die zeile komplett ein
   {
// ...
    $file=readdir($dir);                                     //Hö? ach ja damit wird... das is ja eins zu viel des guten... nein ist es nicht, gerade überprüft! stimmt so!
   }
Wenn $cols = 5 ist und $i bereits 4, wird am Ende deer Schleife nochmal readdir() aufgerufen. Beim nächsten Schleifendurchlauf ist $i aber 5, die Schleife wird also nicht nochmal durchlaufen. Anschließend wird aber durch die außenliegende while-Schleife nochmal readdir() aufgerufen, es geht also ein Verzeichniseintrag verloren. Je kleiner $cols ist, desto häufiger tritt dieser Fall auf, weil die innere for-Schleife häufiger durchlaufen werden muss, und desto mehr Dateien gehen so verloren.

DGL-luke 28. Mai 2005 10:15

Re: PHP: Script geht nicht.....
 
Liste der Anhänge anzeigen (Anzahl: 1)
@jfheins: ja, das würde so gehen. ich bin damit aber anfangs irgendwie nicht zurechtgenommen, vor allem weil er mir

Code:
if (getimagesize($image)[0] > 0) {....}
nicht genommen hat.



@tommie-lie: kann ich im moment nicht nachvollziehen. habe das ganze jetzt aber komplett neugeproggt, und siehe da, es funktioniert.

tommie-lie 28. Mai 2005 10:34

Re: PHP: Script geht nicht.....
 
Zitat:

Zitat von DGL-luke
@tommie-lie: kann ich im moment nicht nachvollziehen.

Na, am Ende der for-Schleife hast du ein $file=readdir($dirname) stehen, daß dir für den nächsten Schleifendurchlauf der for-Schleife die nächste Datei holt. Wenn es nun aber keinen nächsten Schleifendurchlauf gibt, weil die for-Schleife am Ende angekommen ist, wird ein zweites Mal hintereinander readdir() aufgerufen, nämlich im Schleifenkopf der while-Schleife. Nun wurde aber die Zuweiseung zu $file aus dem Ende der for-Schleife nicht weiter beachtet, weil ja danach nur der schließende tr-Tag angehängt wurde und danach von der while-Schleife gleich nochmal readdir() aufgerufen wurde. Dadurch geht die letzte Information aus der for-Schleife verloren und diese Datei fehlt nachher in der Tabelle.

Zitat:

Zitat von DGL-Luke
habe das ganze jetzt aber komplett neugeproggt, und siehe da, es funktioniert.

Jupp, jetzt holst du dir ja auch erst alle Dateien und teilst sie nachher nur auf die Spalten auf, da kann man nicht viel verkehrt machen, wenn man sich nicht mit seinen Zählvariablen verhaspelt :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz