AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PHP: Script geht .... inzwischen

Ein Thema von DGL-luke · begonnen am 27. Mai 2005 · letzter Beitrag vom 28. Mai 2005
Antwort Antwort
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

PHP: Script geht .... inzwischen

  Alt 27. Mai 2005, 20:17
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]
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
noch_ein_hannes

Registriert seit: 18. Sep 2003
130 Beiträge
 
#2

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

  Alt 27. Mai 2005, 21:02
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
- everything is possible -
  Mit Zitat antworten Zitat
Benutzerbild von S2B
S2B

Registriert seit: 1. Feb 2004
Ort: Aachen
1.268 Beiträge
 
#3

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

  Alt 27. Mai 2005, 21:06
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.

Edit: Es gab keine rote Nachricht.
@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.
Simon Praetorius
Gruß
S2B
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 27. Mai 2005, 21:22
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]
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

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

  Alt 27. Mai 2005, 21:26
Ich kann übrigens statt is_image folgende if-Abfrage empfehlen:
Code:
   $imginfo = @ getimagesize ("dateiname");
                  
      if(($imginfo[2] == 1) || ($imginfo[2] == 2) || ($imginfo[2] == 3))
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#6

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

  Alt 27. Mai 2005, 21:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 28. Mai 2005, 10:15
@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.
Angehängte Dateien
Dateityp: txt overview.php_884.txt (2,3 KB, 6x aufgerufen)
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#8

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

  Alt 28. Mai 2005, 10:34
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 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz