Keine Bilderanzeige! Was mache ich falsch? :/

Hallo an alle ^^

Also ich muss erstmal bemerken, ich hab so ziemlich gar keine Ahnung von PHP…
Nichts desto trotz hab ich mich an folgendem Skript versucht:

[quote]
function randomizer ($type = jpg,$server_dir = ‘/users/name/www/ordner’ ,$www_dir = ‘/ordner’){
$handle=opendir($server_dir);
$counter = 0;
//load array with file names
while ($file = readdir($handle)) {
if ($file != “.” && $file != “…”){
$arr_Images[$counter] = $file;
$counter++;
}
}
closedir($handle);
srand((double)microtime()*1000000);
$randID = rand(0,$counter - 1);
if($type==“img”){
echo “<img src=”$www_dir/$arr_Images[$randID]" border=“1” />";
} elseif ($type==“text”) {
include("$server_dir/$arr_Images[$randID]");
}
} [/quote]

Mein Plan war eigentlich ein Skript, dass mir zufällig alle Bilder, die sich auf dem ftp-Server befinden, angeordnet und angezeigt werden. Kein Bild soll doppelt auftauchen, aber jedes Bild einmal.

Aber mir wir nicht mal ein Bild angezeigt.
Wo ist mein Fehler? :confused:

Wenn es keine Fehlermeldung gibt, solltest du einfach mal im Quelltext der Ausgabe gucken,
welche URI da angegeben wird.
Diese solltest du dann mit der korrekten URI vergleichen, die man also benutzen kann, um
das Bild direkt im browser-Fenster darzustellen.
Bei Abweichungen ist dann das Skript zu korrigieren.
Dafür könnte man natürlich unterwegs mal Testausgaben mit echo einbauen, damit man
leichter kontrollieren kann, was das Skript an bestimmten Stellen eigentlich macht -
eventuell abweichend von den eigenen Vorstellungen.

Ansonsten fehlt beim Bild ein alt-Attribut.
Neben dem array mit den Bild-URIs solltest du also auch noch eines mit Alternativtexten
erzeugen, so daß du da sinnvolle Werte für das Attribut angeben kannst, sonst ergibt
das alles keinen Sinn - gäbe es den Alternativtext, würde der statt eines nicht vorhandenen
oder darstellbaren Bildes angezeigt werden ;o)
Empfehlenswert, aber weniger wichtig ist auch die Angabe der Attribute width und height bei
img. Wenn man die nicht in einem array hat, gibt es da gegebenenfalls auch Funktionen in
PHP, mit denen man die passenden Werte aus dem Bild selbst extrahieren kann.

Bei solchen Fragen kann es oft auch helfen, wenn man die URI von dem PHP-Skript angibt.
Wenn das Bild nicht angezeigt wird, ist das ja erstmal nicht direkt ein Problem von PHP,
sondern eines, was man auf der Ebene der (X)HTML-Ausgabe bereits eingrenzen kann.

Danke für die schnelle Antwort :slight_smile:

Die Idee mit dem Quelltext war gar nicht so verkehrt, bis ich eben sah, dass der komplett leer ist o.O

kann das daran liegen, dass ich die Seite versuche mit “Skript2go” zu öffnen??

Oder kann ich das ganz einmal komplett in die Tonne treten? ^^

Das Problem ist auch, dass ich nicht so recht weiß, ob ich die richtigen “Quellen” verwende und vor allem, ob sie auch von der Form her stimmen…

Obiges Skript zumindest enthält ja nur eine Ausage mit echo und die findet nur statt, wenn
$type==“img”

Wenn ich das richtig überblicke, wird $type auch nirgends auf “img” gesetzt, deshalb gibt es
auch keine Ausgabe, zur Analyse also immer mal wieder testweise ein paar Ausgaben mit
echo einbauen, damit man grob sieht, was passiert.

Ansonsten läuft die Sache natürlich so, daß die URI des Skriptes mit irgendeinen browser per
HTTP aufrufst, “Skript2go” kenne ich nicht, keine Ahnung, was das macht.

Generell sollte das Skript also ein komplettes Dokument erzeugen, hier also wohl (X)HTML,
was dein Skriptfragment ohnehin nicht tut - ich hatte angenommen, daß das nur ein
Fragment vom gesamten Skript ist, welches du verwendest, wenn das alles ist, ergibt das
nicht viel Sinn ;o)

PHP-Bereiche beginnen dann auch mit <?php und enden mit ?>, was bei dir wiederum
irgendwo stehen muß, sonst würde man das Skript ja als Ausgabe sehen und die Seite
wäre nicht leer, man durchschaut also nicht so ganz, was du da machst.

Das, was ich hier gepostet habe, war auch nur der Ausschnitt.
Eigentlich weiß ich ja, wie so ein Dokument beginnt, aber mein Quellcode ist halt immernoch leer.

Habe jetzt die HTMl-Sachen drumherum gebaut, Den $type auf “img” gesetzt, n paar echos reingebaut…

und es hat sich nichts geändert… Außer, dass ich den HTML-Code jetzt im Quelltext habe.

hier zum überschauen nochmal den Skript, komplett…

[quote]

New Document <?PHP

function randomizer ($type =“img”,$server_dir = ‘/users/koerk/www/BilderKoerk/Spiel’,$www_dir = ‘/BilderKoerk/Spiel’)
{
$handle=opendir($server_dir);
$counter = 0;

while ($file = readdir($handle)) 

{if ($file != “.” && $file != “…”)
{$arr_Images[$counter] = $file;
$counter++;
echo “Es ist was passiert”;
}
}
closedir($handle);
srand((double)microtime()*1000000);
$randID = rand(0,$counter - 1);
if($type==“img”)
{echo “Es würde eigentlich passieren, was du wolltest”;
echo “<img src=”$www_dir/$arr_Images[$randID]" alt=Bild\ border=“1” />";
}
elseif ($type==“text”)
{echo “Es ist nicht so ganz passiert, was du wolltest.”;
include("$server_dir/$arr_Images[$randID]");
}
}
?>

[/quote]

Die Funktion solltest du schon noch aufrufen oder das eben nicht als Funktion formulieren.

Aufrufen der Funktion etwa vor dem ?>
randomizer(); einfügen.

Bei mir auf dem Testserver läuft das dann zumindest als Markierungssuppe durch einschließlich
der Anzeige eines Bildes (Pfade habe ich bei mir natürlich angepaßt).

[quote]Aufrufen der Funktion etwa vor dem ?>
randomizer(); einfügen.[/quote]

Wie jetzt? o.0

In dem oben angegebenen Quelltext setzt du das ein, also das Ende sieht dann etwa so aus:

...
}


randomizer();
?>
</BODY>
</HTML>

Das randomizer(); ist der Funktionsaufruf.
Der gesamte Teil, der bislang zwischen <?php und ?> steht, ist ja nur die Funktion selbst.
Damit die auch ausgeführt wird, muß sie auch irgendwann mal aufgerufen werden - bei Bedarf
auch mehrmals, sonst lohnt es sich nicht, das als Funktion zu formulieren.

Ansonsten: Die großgeschriebenen Markierungen wie lassen vermuten, daß du
HTML und nicht XHTML verwendest, auch die fehlenden Anführungszeichen beim Wert
des Attributes alt, dessen Wert übrigens so unsinnig sein dürfte, wenn die JPEGs nicht alle
gerade irgendwelche Bilder darstellen, sondern nur selber Bilder sind.
Das img-Element ist inhaltsleer, bei HTML schließt man das nicht, anders als bei XHTML, also
hinten nicht ‘/>’ sondern nur ‘>’.

Klingt sinnvoll o.O Danke :smiley:

Also, ich hab die Funktion jetzt mit den (meiner Meinung nach) entsprechenden Pfaden aufgerufen und aber dementsprechend die Pfade wieder oben aus der funktion entfernt.
Bei der Bildabfrage habe ich das alt jetzt nicht in Anführungszeichen gesetzt, dafür aber den backslash entfernt.
ergebnis ist jetzt folgendes:

[quote]Warning: opendir(/users/koerk/www/BilderKoerk/Spiel,/users/koerk/www/BilderKoerk/Spiel) [function.opendir]: Das System kann den angegebenen Pfad nicht finden. (code: 3) in C:\Users\Annemaus\Desktop\SpielProgi\Server2go\server2go\htdocs\Feldrichtlinien.php on line 9

Warning: opendir(/users/koerk/www/BilderKoerk/Spiel) [function.opendir]: failed to open dir: No such file or directory in C:\Users\Annemaus\Desktop\SpielProgi\Server2go\server2go\htdocs\Feldrichtlinien.php on line 9

Warning: readdir() expects parameter 1 to be resource, boolean given in C:\Users\Annemaus\Desktop\SpielProgi\Server2go\server2go\htdocs\Feldrichtlinien.php on line 12

Warning: closedir() expects parameter 1 to be resource, boolean given in C:\Users\Annemaus\Desktop\SpielProgi\Server2go\server2go\htdocs\Feldrichtlinien.php on line 19
Es würde eigentlich passieren, was du wolltest [/quote]

er gibt mir zumindest schonmal was aus… :smiley:

also ich verzweifle hier bald ._.

Habe jetzt die pfade nochmal überarbeitet, aber er gibt mir immer ne andere Fehlermeldung aus.
Kann mir jemand sagen, welche Pfade da rein müssen?

Die Bilder liegen auf dem ftp-server spiel.koerk.bplaced.net

das relevante Problem ist vermutlich der ersten Fehlermeldung zu entnehmen, der Rest sind
vermutlich Folgefehler.

Führst du den Kram auf deinem eigenen windoof-Rechner aus oder woher kommen solche
Pfadangaben wie “C:\Users\Annemaus\Desktop\SpielProgi\Server2go\server2go\htdocs\Feldrichtlinien.php”?
Die Pfadangaben in obigem Skript sehen dagegen eher nach solchen für Unix/Linux aus, also
passend für den hiesigen server.
Jedenfalls kann man anhand solcher Pfadangaben nachvollziehen, wo PHP nach den
Dateien sucht - gibt es den Pfad auf dem Rechner nicht, auf dem das Skript ausgeführt wird,
so erscheint solch eine Fehlermeldung.

Durch relative Pfadangaben kann man sich auch eine Menge Ärger ersparen, wenn man vom
eigenen Rechner auf einen server wechselt. Man gibt dann jeweils den Pfad relativ zur
HTML-Ausgabe an. Dazu pappt man dann alles, was man später veröffentlichen will, ggf mit
Unterverzeichnissen in ein Hauptverzeichnis, dann kann man alles ohne Änderungen hochladen.

Willst du hingegen auf deinem lokalen Rechner Daten von einem entfernten Rechner
laden, mußt du natürlich komplette URIs angeben, das hilft aber nicht bei deinem Skript hier,
welches ja versucht, auszulesen, welche Dateien es in Verzeichnissen gibt, da müßte man -
wenn überhaupt - anders vorgehen und einen Index abrufen und den analysieren.
Also besser Bilder auf eigenen Rechner laden und dort alles austesten.

Meine Anmerkungen unter ‘ansonsten’ führen übrigens lediglich zu einem konsistenten
Dokument, das bedeutet nicht, daß die entsprechenden Änderungen das PHP-Problem
beheben, das betrifft Mängel und Fehler, welche die browser meist vor dem Autor verbergen,
indem sie improvisieren und damit verhindern, daß unkundige Autoren die Mängel überhaupt
zur Kenntnis nehmen, weswegen dann viele fehlerhafte Sachen veröffentlich werden, die
nur scheinbar zu funktionieren scheinen.

Also Ich kann dir gerade nur bedingt folgen.
Das Skript liegt auf dem Pfad ( C:/Users/Annemaus…)
die Bilder liegen auf dem ftp-server. Ich hab jetzt den Pfad geändert, weil die Bilder ja auch auf dem Rechner sind.
Jetzt spuckt er mir das hier aus:

Das [Bild] wird aber nicht als bild angezeigt, sondern als viereck, halt so “bild kann nicht angezeigt werden”…

Für jedes ‘Es ist was passiert’ hat dein PHP-Skript jetzt zumindest schonmal eine Datei
gefunden. Hättest du stattdessen per echo den Dateinamen ausgeben lassen, wüßtest
du jetzt sogar welche.
Nun mußt du im Quelltext beim img-Element jedenfalls im src-Attribut eine Pfadangabe
finden, diese wird vermutlich nicht mit dem Pfad zu den Bildern übereinstimmen, also
per relativer Pfadangabe anpassen, dann sollte es hinkommen.

Das Rechteck mit ‘Bild’ drin ist die Darstellung des Alternativtextes - ein Zeichen dafür, das
es das Bild nicht gibt, welches per src-Attribut referenziert wird. Da das Skript andererseits
aber offenbar Bilder gefunden hat, hast du beim Zusammenbasteln des Pfades für das
src-Attribut offenbar was falsch gemacht ;o)

Lach mich aus, aber weil ich jetzt nicht genau wusste, wie ich mir den dateinamen anzeigen lasse, habe ich nun [quote]$bildinfo = pathinfo($server_dir."/".$file);[/quote]
mit eingebunden und per echo dann “$bildinfo” ausgeben lassen.
Da taucht dann im Ergebnis ganz oft das Wort “Array” auf.

also… Ich habe wirklich n Fehler mit den Pfad gehabt, das Bild wird jetzt angezeigt.
Aber nur eins. Ich möchte ja alle bilder aus dem ordner haben??
Und dafür ist doch der ganze schmonsens mit “counter++” da, oder lieg ich da schon wieder falsch???

Als sehr unelegante Lösung, könnte man ja den “echo”-Befehl jetzt so oft einfügen, wie ich die bilder da haben möchte. Das wäre aber dann ein sehr augenkrebserrengender Quelltext.
Gibts da vielleicht ne andere Lösung?

Hab jetzt eine Lösung gefunden und nun funktioniert alles.
Vielen Dank für die Hilfe und Geduld mit mir als unwissender ^^

Zum Auffinden von Fehlern ist es natürlich oft sinnvoller, Variablen per echo auszugeben, dann
kennt man ja ihren Wert. Wenn alles funktioniert wie erwartet, entfernt man die echos natürlich
wieder.

Wenn da Array als Ausgabe von echo steht, hat man versucht, ein ganzes Array auszugeben,
nicht nur ein Element daraus. Entweder man wählt dann gezielt ein Element aus oder man
verwendet eine andere Syntax, um ein komplettes array auszugeben, sowas kann man gut
im offiziellen Handbuch nachlesen:
php.net/manual/de/

War nicht die Rede davon, daß ein Bild zufällig ausgewählt und dargestellt werden soll?
Dazu ist das Skript ja offenbar da, will man zwei haben, ruft man die Funktion einfach nochmal
auf - das zweite kann dann natürlich in seltenen Fällen dasselbe wie das erste sein.
Wenn man alle Bilder in zufälliger Reihenfolge angezeigt haben will, geht man ganz anders
vor, da würde man einfach die Indizes des arrays permutieren und dann alles per Schleife
ausgeben, dann gibt es auch nichts doppelt.

Ansonsten ist es natürlich so, daß man in (X)HTML mit img nur ein Bild auf einmal anzeigen
kann, für N Bilder braucht man im Quelltext dann auch N img-Elemente, aber auch nicht mehr.
Bei kleinen Bildern kann man diese natürlich auch erst auf dem eigenen Rechner zu einem
großen Bild zusammenfügen und dann das verwenden. Das mit PHP zu machen, kann sehr
rechen- und speicherintensiv sein, daher macht man das besser nicht dauernd auf dem server.