PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bilderauswechseln per PHP?



Maisaffe
11.08.2004, 22:00
Kann man eine HTML/PHP nehmen, ihr sagen das das Bilder Verzeichnis zB. /wallpaper das Verzeichnis ist um die Bilder zu laden.

Also ich stelle mir das so vor: So soll es aussehen (http://home.arcor.de/dennis_meckel/forum/rpg-ring.de/user/chocwise/wallpaper.beispiel.png) [400KB]

Chobits 01/81:
gibt das aktuelle Bild an und alle Bilder zusammen (letzteres muss nicht Variabel sein).

Das ganze sollte auch nur in einer PHP/HTML Datei ablaufen, nicht in 81.

Falls ja, würde sich eine Seele erbarmen, mir so etwas zu skripten (also das HTML das es so aussihet würde ich natürlich demjenigen geben (soll ja so aussehen wie die Seite von mir).

Dennis

PS: Chocwise hat jetz den Auftrag

Chocwise
11.08.2004, 22:20
Original geschrieben von dennis_meckel
Kann man eine HTML/PHP nehmen, ihr sagen das das Bilder Verzeichnis zB. /wallpaper das Verzeichnis ist um die Bilder zu laden.

Also ich stelle mir das so vor: So soll es aussehen (http://home.arcor.de/dennis_meckel/forum/wallpaper.beispiel.png) [400KB]

Chobits 01/81:
gibt das aktuelle Bild an und alle Bilder zusammen (letzteres muss nicht Variabel sein).

Das ganze sollte auch nur in einer PHP/HTML Datei ablaufen, nicht in 81.

Falls ja, würde sich eine Seele erbarmen, mir so etwas zu skripten (also das HTML das es so aussihet würde ich natürlich demjenigen geben (soll ja so aussehen wie die Seite von mir).

Dennis
Jop, das geht, sogar relativ leicht. Ich mach mich gleich mal dran und progg das Dingen, muss mich allerdings erst noch im Forum umschauen und nachher noch mit ein paar Array-Funktionen vertraut machen um dein Script proggen zu können.

Ich dokumentiers dann noch schön aus, damit du noch selbst dran fummeln kannst. ;)

mitaki
12.08.2004, 01:44
Ich hoffe, du hast nichts dagegen, wenn ich meine Variante ebenfalls poste.

Das ist der erste Abschnitt, ihn fügst du am besten im Kopf deiner Datei ein.
<?php

$pfad = './bilder/'

$verzeichnis = opendir ( $pfad );
/* opendir öffnet ein Verzeichnis. Liegt in dem Verzeichnis, in dem auch
diese Datei liegt, das Verzeichnis 'bilder', dann passt die Angabe,
ansonnsten musst du sie anpassen (wie du dabei vorgehst solltest du
ja schon aus der Arbeit mit HTML Dateien kennen).
--
Im 'bilder' Verzeichnis sollten sich alle Bilder befinden. Sind dort
auch andere Dateien gespeichert erkläre ich später, wie du Dateien,
die nicht benötigt werden, herausfilterst).
*/

$bilder = array();
// $bilder wird die Bildnamen enthalten.

$zaehler = 1;
// Gibt den Start des Arrayschlüssels an.

while ( $datei = readdir ( $verzeichnis ) )
{

/* So lange Dateien ausgelesen werden können
soll der Dateiname in ein Array eingefügt werden.
--
Die IF Abfrage verhindert, dass das eigene Verzeichnis '.',
sowie das Verzeichnis einen Schritt zurück '..' ebenfalls
ausgelesen werden.
--
Du kannst diese Abfrage mit --OR substr ( $datei, -4 ) != '.png'--
ohne die -- hinzufügen, dann werden nur Dateien mit der Dateiendung
'.png' ausgelesen. Das kannst du für alle Bildformate machen, wenn
sich im Bilderverzeichnis auch Dateien befinden, die keine Bilder sind.
--
substr ( $datei, -4 ) gibt die letzten vier Zeichen eines Strings aus,
bei Dateien ist das die Dateiendung, möchtest du z.B. '.jpeg' Dateien
auslesen änderst du entweder -4 in -5 oder lässt den Punkt bei der
Dateiendung nach != weg.
*/

if ( $datei != '.' AND $datei != '..' )
{

$bilder[$zaehler] = $datei;
$zaehler++;
/* $bilder[1] erhält den Namen der ersten Datei,
$bilder[2] erhält den Namen der zweiten Datei
... */

}

}

?>

Dieser Abschnitt gibt einer Variable den Wert 1, falls kein Bild ausgewählt, oder ein ungültiger Wert übergeben wurde.
<?php

// Hier wird der Variable $_GET['bild'] automatisch ein Wert gegeben.
// Da du beim Aufrufen dieser Datei noch keinen Wert an $_GET['bild']
// gegeben hast wird hier erstmal der Wert 1 eingetragen.
// Zur Sicherheit ist das auch der Fall, wenn der Wert ein unerlaubter Wert
// sein sollte.

if ( !isset ( $_GET['bild'] ) OR ( int ) $_GET['bild'] < 1 OR ( int ) $_GET['bild'] > count ( $bilder ) )
{

$_GET['bild'] = 1;

}

?>

Dieser Abschnitt gibt das Bild aus, einfügen, wo gewünscht.

<?php

echo '<img src="' . $pfad . $bilder[$_GET['bild']] . '" alt="" />';
/* Hier wird nach der Verzeichnisangabe im src-Attribut der Dateiname
eingetragen, der als Schlüssel, den Wert der Variable $_GET['bild'] hat. */

?>

Hier der Link für das Bild zuvor und das Bild danach.

<?php

// ZURÜCK
if ( $_GET['bild'] != 1 )
{

echo '<a href="' . $_SERVER['PHP_SELF'] . '?bild=' . ( $_GET['bild'] -1 ) . '">zur&uuml;ck</a>';

}

// WEITER
if ( $_GET['bild'] != count ( $bilder ) )
{

echo '<a href="' . $_SERVER['PHP_SELF'] . '?bild=' . ( $_GET['bild'] +1 ) . '">weiter</a>';

}

?>

Die ersten beiden Abschnitte müssen in dieser Reihenfolge eingefügt werden, die letzten beiden kannst du je nach Bedarf einfügen (denke aber, dass es ohne weiter kein zurück geben kann ;)).

Maisaffe
12.08.2004, 02:50
Dagegen habe ich nichts...

Aber mir ist der Sinn jetz entgangen...
Chocwise hat jetz doch schon die PHP Datei erstellt.

Dennis

PS: Trotzdem Danke :)

mitaki
12.08.2004, 03:40
Ob das Skript schon erstellt wurde ging aus deinem Post nicht wirklich hervor, daher habe ich meine Methode geposted. Im Zweifelsfall hättest du dir die leichtere aussuchen können.

Außerdem denke ich, dass es immer gut wäre seine Lösung anderen preiszugeben, um erneutes Fragen zu verhinden (sofern es nichts komplexeres ist, obwohl das zweifelsohne interessant wäre).

Chocwise
12.08.2004, 06:07
@ mitaki: Mir scheint meine Version 'n Tick komfortabler zu sein. ;)
Ich hab deine Version nur kurz überflogen, stelle aber fest das dein Script spezielle Dateinamen benötigt.
Meins ist da 'n tick anspruchsloser weil es selbstständig die Dateinamen im definierten Ordner ausliest. ;)

Hier mal der Code (Ich hab die Stylesheets mal rausgeschnibbelt und etwas umgebastelt), auch wenn es viel ist:

<?php
#### Configuration ####
$pfad = "ordner/blah/Chobits/"; // Pfad zum Bilderordner (Bitte relativ zu dieser Scriptdatei angeben)

#### Confuguration Ende ####


#### Informationssammelnde Funktionen ####
if ($handle = opendir($pfad)) { // Öffnet den in $pfad definierten Ordner und prüft zugleich, obs gelungen ist
while (($file = readdir($handle))) { // Liest den Inhalt des geöffneten Ordners
if ($file != "." && $file != "..") { // Filtert die Zeichen "." (reload folder) und ".." (previous folder) raus.
$files[] = $file; // Übergibt die Dateinamen in einen Array
sort ($files); // Sortiert die Dateinamen Alphanumerisch
}
}
}

$filecount = count($files); // Zählt die Anzahl der Dateien im Pfad $pfad

if(!$wich){ $wich = 0; } // Sollte die GET Variable $wich nicht gesetzt sein, wird sie auf 0 gesetzt

if (!isset($files[$wich])) { // Überprüft ob es überhaupt den passenden Arraykey zum entspr. $wich-Wert gibt.
$error=1; // Setzt bei Fehlen des Key's eine Errorvariable zum Fehlerabfang
}
#### Informationssammelnde Funktionen Ende ####
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Unbenanntes Dokument</title>

</head>

<body>
<?php
if($error==1){ // Reagiert auf den oben ermittelten Fehlerfall
echo"Das angeforderte Bild gibt es nicht.";
}else{ ?>
<table width="100%" height="100%" border="0" align="center" cellpadding="4" cellspacing="1" bgcolor="#C0C0C0">
<tr>
<td bordercolor="#575757" background="../index.arcor/homepage/homepage/kasten_oben.png" bgcolor="#575757"><div align="center" class="Stil14">Wallpaper</div></td>
</tr>
<tr>
<td height="100%" valign="top" bgcolor="#C0C0C0">
<table width="670" border="0" align="center" cellpadding="4" cellspacing="1" bgcolor="#424242">
<tr>
<td bordercolor="#575757" bgcolor="#EAEAEA">
<table width="300" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td width="50" bordercolor="#575757" bgcolor="#EAEAEA" nowrap>
<?php if($wich!=0){
// Gibt das "Rückwärtsbild" und Link nur aus wenn es auch ein vorhergehendes Bild gibt
?>
<a href="<?php
$prev=$wich-1;
echo"$PHP_SELF?wich=$prev"; ?>"><font face="Arial, Helvetica, sans-serif" size="2">&lt;&lt;Previous</font></a>
<?php } ?>
</td>
<td width="200" bordercolor="#575757" bgcolor="#EAEAEA" nowrap>
<div align="center" class="Stil15">Pic
<?php

$imgnr= $wich+1; // In Bildnummer umrechnen da $wich bei 0 beginnt (In Programmiersprachen ist 0 die erste Instanz)
echo"$imgnr/$filecount"; // Gibt die aktuelle Bildnummer und die Gesamtzahl aus

?>
</div>
</td>
<td width="50" bordercolor="#575757" bgcolor="#EAEAEA" nowrap>
<?php
// Gibt das "Vorwärtsbild" und Link nur aus wenn es auch ein folgendes Bild gibt
if($filecount>$imgnr){ ?>
<a href="<?php
$next=$wich+1;
echo"$PHP_SELF?wich=$next"; ?>"><font face="Arial, Helvetica, sans-serif" size="2">Next
&gt;&gt;</font></a>
<?php } ?>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bordercolor="#575757" bgcolor="#EAEAEA">
<table width="660" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="99%" valign="top" bordercolor="#575757" bgcolor="#EAEAEA">
<div align="center"><img src="<?php
// Gibt das angeforderte Bild aus.
$files[$wich]=stripslashes($files[$wich]);
echo$pfad.$files[$wich];
?>"></div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bordercolor="#575757" bgcolor="#EAEAEA">
<table width="300" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td width="50" bordercolor="#575757" bgcolor="#EAEAEA" nowrap>
<?php
// Gibt das "Rückwärtsbild" und Link nur aus wenn es auch ein vorhergehendes Bild gibt
if($wich!=0){ ?>
<a href="<?php
$prev=$wich-1;
echo"$PHP_SELF?wich=$prev"; ?>"><font face="Arial, Helvetica, sans-serif" size="2">&lt;&lt;Previous</font></a>
<?php } ?>
</td>
<td width="200" bordercolor="#575757" bgcolor="#EAEAEA">
<div align="center" class="Stil15">Pic
<?php

$imgnr= $wich+1;
echo"$imgnr/$filecount";

?>
</div>
</td>
<td width="50" bordercolor="#575757" bgcolor="#EAEAEA" nowrap>
<?php
// Gibt das "Vorwärtsbild" und Link nur aus wenn es auch ein folgendes Bild gibt
if($filecount>$imgnr){ ?>
<a href="<?php
$next=$wich+1;
echo"$PHP_SELF?wich=$next"; ?>"><font face="Arial, Helvetica, sans-serif" size="2">Next
&gt;&gt;</font></a>
<?php } ?>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<?php } ?>
</body>
</html>

mitaki
12.08.2004, 16:34
...stelle aber fest das dein Script spezielle Dateinamen benötigt.
Damit ich konkurenzfähig bleibe habe ich das gleich ausgebessert ;)
Unsere Skripte sind uns sonst recht ähnlich, ich muss aber zugeben, dass du über ein besseres Fehler Handling verfügst.
Als großen Minuspunk sehe ich aber das nicht verwenden der Superglobalen Arrays an ($_GET, $_SERVER), sprich du bist komfortabler aber nicht portabler (wie hört sich das an..? :D)!

Chocwise
13.08.2004, 02:12
Original geschrieben von mitaki
Damit ich konkurenzfähig bleibe habe ich das gleich ausgebessert ;)
Unsere Skripte sind uns sonst recht ähnlich, ich muss aber zugeben, dass du über ein besseres Fehler Handling verfügst.
Als großen Minuspunk sehe ich aber das nicht verwenden der Superglobalen Arrays an ($_GET, $_SERVER), sprich du bist komfortabler aber nicht portabler (wie hört sich das an..? :D)!
Du wirst es nicht glauben, aber ich hab Dennis 2 Versionen übermittelt. :D
Eine mit $_GET['wich'] und eine mit $wich. ;)
Welche er nutzen möchte, liegt an ihm.

mitaki
13.08.2004, 02:36
Daraus ergibt sich mir kein Sinn, $_GET['wich'] wird immer angelegt, während $wich nur bei register_globals = On angelegt wird.

Naja, ich hoffe er entscheidet sich für die Version mit $_GET, wir wollen ja Probleme vermeiden ;)

wrtlprnft
13.08.2004, 02:47
Abgesehen davon, dass ein gesetztes register_globals mehr Arbeit erzeugt als ein ungesetztes, da man jede Variable initialisieren muss, um Sicherheitsprobleme zu vermeiden.
Wenn es nach mir ginge wär auf meinem Server r_g ausgeschaltet, gibt es eigentlich auch eine Möglichkeit, das lokal zu tun (Was weiß ich, .htaccess oder im Dokument selber)?

Chocwise
13.08.2004, 03:22
Original geschrieben von wrtlprnft
Abgesehen davon, dass ein gesetztes register_globals mehr Arbeit erzeugt als ein ungesetztes, da man jede Variable initialisieren muss, um Sicherheitsprobleme zu vermeiden.
Wenn es nach mir ginge wär auf meinem Server r_g ausgeschaltet, gibt es eigentlich auch eine Möglichkeit, das lokal zu tun (Was weiß ich, .htaccess oder im Dokument selber)?

Klar.

.htaccess:
php_flag register_globals off


Ich hab ihm die $_GET-freie Version geschickt weil er sie 1. haben wollte und 2. weil es tatsächlich für Anfänger leichter ist damit zu arbeiten. Und wenn der Server da mitmacht, ist doch alles ok.
Solange man keine hochkomplexen Scripte schreibt, ist es auch noch nicht nötig auf Sicherheitsaspekte zu pochen.
Ich hab 3/4tel meiner PHP-Karriere auch immer mit register_globals gearbeitet und bin noch nie Problemen begegnet.
Klar, wenn man professioneller arbeiten möchte, wird es Zeit mit den entspr. Variablen klarzukommen, aber als Anfänger reicht es wenn man weiß das es auf einigen Servern zu Problemen kommen kann wenn man $var statt $_GET['var'] $_COOKIE['var'], $_POST['var'], ... verwendet, weil register_globals aus sind.
Fakt ist, das ich bisher noch keinen Server gesehen habe außer einem meiner vHosts meines privaten WAMPP's, auf denen die register_globals ausgeschaltet gewesen wären. Und wenn sie es sind, schaltet man sie eben per .htaccess wieder an, wenn man kann.

mitaki
13.08.2004, 03:24
Ich laufe gerade per WAMP, hier Funktioniert diese .htaccess Angabe:
php_value register_globals On
Der Payspace über den ich durch einen Freund verfüge zeigt mir dabei aber einen 500 - Internal Server Error an, sprich entweder erlaubt es nicht jeder oder die Angabe funktioniert nur gerade so.

wrtlprnft
13.08.2004, 03:37
THX@Chocwise!
Bei mir hat sich kein Unterschied gezeigt, aber jetzt kann ich endlich darauf verzichten, dauernd Variablen mit 0 zu initialisieren.

mitaki
13.08.2004, 03:52
Natürlich hätte ich Off schreiben müssen, aber da ich bei mir ja schon deaktiviert habe..
php_flag register_globals off Ah, flag verwendest du, muss ich auch versuchen ;)
hm.. mist ^^, du warst schon wieder schneller.

Vielleicht ist es leichter, dann sollte man aber dennoch gleich die 'richtigere' Methode erwähnen (hast du ja anscheinend). Ich kenne leider mehrere Seiten auf denen es Sicherheitslücken gibt, wie ich es im Beispiel meiner Seite beschreibe, es ist einfach nicht witzig, wenn man sich /etc/passwd ansehen kann.

wrtlprnft
13.08.2004, 03:57
Original geschrieben von mitaki
Es ist einfach nicht witzig, wenn man sich /etc/passwd ansehen kann. Bei einem guten Passwort hilft das erstens weniger, da man es dann nur durch brute-force rausfinden könnte (Aber wer hat 2000 Jahre Zeit zum Rechnen?) und außerdem verwenden die meisten sicherheitsbewussten Leute dann doch eine shadow-Datei (wenn die passwd überhaupt einem Normaluser zugänglich ist).

EDIT: Bei mir kommt dann sowas:
Warning: main() [function.main]: open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/www/htdocs/v096179/) in /www/htdocs/v096179/test.php on line 1

Warning: main(/etc/passwd) [function.main]: failed to create stream: Operation not permitted in /www/htdocs/v096179/test.php on line 1

Warning: main() [function.main]: Failed opening '/etc/passwd' for inclusion (include_path='.:..') in /www/htdocs/v096179/test.php on line 1Wär ja auch noch schöner:D

mitaki
13.08.2004, 04:12
Bei so etwas geht es ums Prinzip.

Ich bekam Zugriff bei den wenigen Seiten, die ich testen konnte (es gibt eben noch Leute die nicht Sicherheitsbewusst sind).