per Link "hochzählen"
irato
- php
Hallo zusammen,
ich möchte ein simples "Weiterblättern" realisieren.
Dazu benötige ich zwei Links, einen um vor, einen um zurück zu blättern. (Ausgabe in DIV-Container)
"Blättern" wollte ich etwa so:
<input type="submit" name="bwd" id="scroll" value=" vor " onclick="read.php?pic=1"/>
bzw.
<input type="submit" name="bwd" id="scroll" value=" zurück " onclick="read.php?pic=-1"/>
Und Auswerten dachte ich mir so:
$pic = $_GET['pic']; // Variable zum hoch oder runterzählen
if ($counter == 0 ) { // interner Zähler, der das Ergebnis des Blätterns beinhaltet
}Else{
$counter = 10; // normalerweise mit 0 vorbelegen, falls noch nicht vorhanden
} // Endif
if (isset($pic) ) {
$counter=$counter+$pic; // den Zähler mit der aktuell übergebenen Zahl erhöhen/ erniedrigen
} // Endif
Also, 1 hoch oder runterzählen geht... aber "weiter" komme ich nicht!
Wie/ Wo kann ich in PHP die Werte puffern? Wo liegt mein Denkfehler?
Solong!
Hi,
Dazu benötige ich zwei Links,
Links werden mittels des <a>-Elementes spezifiziert, welche ein href-Attribut besitzen.
<input [...] onclick="read.php?pic=1"/>
Wenn Du ein JavaScript-Objekt namens 'read' erzeugst, welches über eine 'php'-Eigenschaft verfügt, dann _kann_ dieser Code sinnvoll werden, indem Du einen Doppelpunkt und weiteren Code anfügst:
<input [...] onclick="read.php ? pic=1 : pic=0;"/>
Ich nehme aber an, Du hast da eher irgend eine Art von Magie erwartet, aufgrund derer ein Event-Handler plötzlich nicht mehr JavaScript-Code enthält, sondern eine URL oder sowas. Nein, derlei Dinge passieren nicht.
Wo liegt mein Denkfehler?
Dein Denkfehler liegt darin, für Links etwas anderes als Links einsetzen zu wollen.
Cheatah
Hello,
ich möchte ein simples "Weiterblättern" realisieren.
Dazu benötige ich zwei Links, einen um vor, einen um zurück zu blättern. (Ausgabe in DIV-Container)
Das sind keine Links, sondern Formular-Elemente, die Du da benutzt. Aber das macht nicht wirklich etwas.
"Blättern" wollte ich etwa so:
<input type="submit" name="bwd" id="scroll" value=" vor " onclick="read.php?pic=1"/>
bzw.
<input type="submit" name="bwd" id="scroll" value=" zurück " onclick="read.php?pic=-1"/>
Das Problem hierbei ist, dass Dein Server nicht weiß, welches Bild er zuletzt zum Client geschiockt hat. Deshalb kann er von dessen laufender Nummer auch nichts abziehen oder hinzuzählen.
Besser wäre es also tatsächlich, zwei Links zu generieren:
<a href="<?php echo $_SERVER['SCRIPT_NAME'].'?bild='.($bild-1); ?>zurück</a>
<a href="<?php echo $_SERVER['SCRIPT_NAME'].'?bild='.($bild+1); ?>weiter</a>
Dann kannst Du die Bildnummer, so wie Du das wolltest, auslesen aus dem $_GET-Array.
$bild = $minbildnummer;
if (isset($_GET['bild']))
{
$bild = intval($_GET['bild'])
}
if ($bild < $minbildummer) $bild = $minbildnummer;
if ($bild > $maxbildummer) $bild = $maxbildnummer;
und nun kannst Du das src-Attribut zusammenbauen
$src = "path/to/bilder/bild$bild";
echo "<img src="$src" alt="Bild Nr. $bild">";
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

"Meine" Lösung:
Auf dem Server eine Datei (pic.txt) anlegen und deren Rechte auf "666" setzen.
Hier cache ich jetzt einfach die Werte!
<?php
$pic = $_GET['pic']; // Diese Seite wurde mit dem Parameter pic=1 oder pic=-1 aufgerufen
if (isset($pic) ) { // pic hat Inhalt oder nicht
if ($pic== "") { // ggf. auf 1 setzen
$pic=1;
} // Endif
} // Endif
$File = fopen('./pic.txt', 'r+'); // Zähldatei öffnen
$counter = fread($File, filesize('./pic.txt')); // Zähler einlesen
$counter = $counter + $pic; // Zähler um übergebene Variable erhöhen
if ($counter <= 0 ) { // Zähler ggf. auf Null setzen
$counter=1;
} // Endif
rewind($File);
fwrite($File, $counter); // Datei auf Server mit aktuellem Wert sichern
fclose($File); // Ende im Gelände
echo "Bild Nr: ".$counter.;
?>
<a href="index.php?pic=-1">[zurück]</a>
<br />
<a href="index.php?pic=1">[weiter]</a>
Vielleicht nicht die eleganteste Lösung, aber es funzt.
Trotzdem: Jemand eine einfachere Lösung parat?
Eine, die ich auch verstehe ;)
Solong!
Hello,
"Meine" Lösung:
Eher wohl: Deine "Lösung"
Auf dem Server eine Datei (pic.txt) anlegen und deren Rechte auf "666" setzen.
Hier cache ich jetzt einfach die Werte!<?php
$pic = $_GET['pic']; // Diese Seite wurde mit dem Parameter pic=1 oder pic=-1 aufgerufen
if (isset($pic) ) { // pic hat Inhalt oder nicht
if ($pic== "") { // ggf. auf 1 setzen
$pic=1;
} // Endif
} // Endif$File = fopen('./pic.txt', 'r+'); // Zähldatei öffnen
$counter = fread($File, filesize('./pic.txt')); // Zähler einlesen
$counter = $counter + $pic; // Zähler um übergebene Variable erhöhenif ($counter <= 0 ) { // Zähler ggf. auf Null setzen
$counter=1;
} // Endif
rewind($File);
fwrite($File, $counter); // Datei auf Server mit aktuellem Wert sichern
fclose($File); // Ende im Geländeecho "Bild Nr: ".$counter.;
?>
<a href="index.php?pic=-1">[zurück]</a>
<br />
<a href="index.php?pic=1">[weiter]</a>Vielleicht nicht die eleganteste Lösung, aber es funzt.
Trotzdem: Jemand eine einfachere Lösung parat?
Eine, die ich auch verstehe ;)
Du Armer hast da jetzt soviele Fehler gemacht, mehr geht fast nicht mehr. ;-)
Eigentlich hatte ich Dir eine Lösung schon fast fertig ausformuliert, sogar schon mit ersten Ansätzen für Sicherheit, gepostet. Aber das Grundproblem scheint mir das noch nicht vorhandene Verständnis für das Wechselspiel in Multi-User-Client-Server-Anwendungen zu sein.
Deine Idee funktioniert schon dann nicht mehr, wenn mehrere User wechselseitig die Bilder durchblättern wollen. Wenn ein User gerade heraufgezählt hat, zählen zwei andere gerade herunter. Was meinst Du wohl, was dann am Ende in der Datei steht.
Und da gibt es ja noch ein weiteres Problem mit der Datei. Sie kann, so wie Du es gemacht hast, sogar zur genau gleichen Zeit von mehreren Benutzern zum Lesen und zum Schreiben benutzt werden. Das geht dann irgendwann schief, und in der Datei stehen keine gültigen Werte mehr.
Und da Du herabzählst und heraufzählst und die Datei nur einen Wert enthält, der in der Länge variieren kann (die Zahl 100 ist zwei Stellen länger als die Zahl 9 in ihrer Darstellung), gibt dies eine zusätzliche Fehlermöglichkeit.
Du benötigst keine Datei. Ohne hast Du etliche Probleme weniger. Du müsstest Dir einfach nur nochmal meinen Vorschlag https://forum.selfhtml.org/?t=187186&m=1243929 angucken, daraus einen (kurzen) Code machen, den Du hier zur Diskussion postest und alles wird gut.
Hab Vertrauen. :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

Hallo Tom
< ...Du Armer hast da jetzt soviele Fehler gemacht, mehr geht fast nicht mehr. ;-)
Danke! Hast wohl recht, ich versuche mich mal am Verständnis Deiner Anleitung...
Die hatte ich einfach mal hochgeladen und da kamen PHP-Errors, weshalb ich "selber" weiter getütelt habe...
Naja, irgendwie hatte ich schon geahnt, dass das verschwendete Zeit war ;)
Ich werde mich vermutlich nochmal melden :)
Solong!
Hello,
Danke! Hast wohl recht, ich versuche mich mal am Verständnis Deiner Anleitung...
Die hatte ich einfach mal hochgeladen und da kamen PHP-Errors, weshalb ich "selber" weiter getütelt habe...
Wenn Du versprichst, uns zum Verständnis des Gnazen noch Löcher in den Bauch zu fragen, dann poste ich Dir hier jetzt mal eine grobe Lösung mit Kommentaren, die hoffentlich keine Fehler enthält.
Allerdings erzeugt sie noch keine valide HTML-Seite. Das wäre dann der nächste Schritt, das zu erreichen.
<?php ### bilder_blaettern.php ###
## Einstellungen
error_reporting(E_ALL);
$bilderpfad = 'bilder';
##-----------------------------------------------------------------------------
## Bildernamen aus dem Verzeichnis lesen.
## Die Namen sollten keine Sonderzeichen enthalten
$_bildname = glob("$bilderpfad/*.{gif,Gif,GIF,png,Png,PNG,jpg,Jpg,JPG}",GLOB_BRACE);
## Anzahl der Bilder feststellen
$minbildnummer = 0;
$maxbildnummer = count($_bildname)-1;
## Wir nehmen an, dass wir erstmal beim ersten Bild anfangen
$bild = $minbildnummer;
## wenn wir aber doch ein anderes haben wollten, dann überschreiben wir
## unsere Annahme von eben einfach
if (isset($_GET['bild']))
{
$bild = intval($_GET['bild']);
}
## sollte das Ergebnis des Besucherwunsches aber unerlaubt sein, dann
## geben wir ihm hier, was ihm zusteht :-)
if ($bild < $minbildnummer) $bild = $minbildnummer;
if ($bild > $maxbildnummer) $bild = $maxbildnummer;
## und nun bauen wir das src-Attribut zusammenbauen für das Bild
$src = $_bildname[$bild];
## und lassen es ausgeben
echo "<img src="$src" alt="Bild Nr. $bild">";
## und geben die neuen _möglichen_ Links zum Blättern aus.
echo "<p>\r\n";
if ($bild > $minbildnummer) echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?bild='.($bild-1).'">zurück</a>';
echo "\r\n";
if ($bild < $maxbildnummer) echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?bild='.($bild+1).'">weiter</a>';
echo "</p>\r\n";
?>
Also bitte frag und mach vor allen Dingen ein valides HTML-Dokument aus diesem Rumpfcode
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

Hallo Tom,
also selber tüteln macht ja bekanntermaßen schlau... es sei denn DU tüftelst! Wow! Vielen Dank!
Ich habe lediglich dies hier "umgedreht", dann lässt sichs im Kreise blättern. Einzig sind unwesentliche "Schönheitsfehler" in der Adresszeile beim runterzählen... ;)
if ($bild < $minbildnummer) $bild = $maxbildnummer;
if ($bild > $maxbildnummer) $bild = $minbildnummer;
und entsprechend die Ausgabe wieder etwas vereinfacht:
echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?bild='.($bild-1).'">zurück</a>';
echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?bild='.($bild+1).'">vor</a>';
Außerdem habe ich die Navi in einen darüber schwebenden DIV Container gepackt, sodass zu grosse Bilder unter der Navi durchscrollen können.
Wenn Du versprichst, uns zum Verständnis des Gnazen noch Löcher in den Bauch zu fragen...
Ich gelobe!!
Was jetzt noch fehlte wäre evtl. eine php-generierte Thumbs-Übersicht, die auf verschiedene "Blättern"-Seiten verzweigt.
Da sich die Projekte allerdings (noch) in Grenzen halten krieg ich das auch zu Fuß hin ;)
Was anderes wäre da schon eher eine Thumbs-Übersicht, die statt des "vor/ zurück" blätterns die Bilder auf anklicken anzeigt, gell?
Aber ich fürchte das wird Deine Zeit nicht zulassen, oder?
Solong!
und 1000 Dank!
Hello,
wenn Bild Nr kleiner als 0, dann höchste BildNr u.U.!
if ($bild < $minbildnummer) $bild = $maxbildnummer;
if ($bild > $maxbildnummer) $bild = $minbildnummer;
Gute Idee. Man sollte dem User den Überschlag aber irgendwie kenntlich machen.
und entsprechend die Ausgabe wieder etwas vereinfacht:
echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?bild='.($bild-1).'">zurück</a>';
echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?bild='.($bild+1).'">vor</a>';
In der URL gibt es dann eben auch die Bildnummer -1, wenn (minbildnummer == 0) ist. Aber das wird dann ja beim Wiedereintritt in die nächste Requestbehandlung korrigiert.
Was jetzt noch fehlte wäre evtl. eine php-generierte Thumbs-Übersicht, die auf verschiedene "Blättern"-Seiten verzweigt.
Dazu habe ich schon ein paar Snippets auf meinem Webserver liegen. Der ist aber voraussichtlich bis Montagabend down.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

Ok, ok -nach Deiner Steilvorlage- war eine Vorschau jetzt wirklich nicht mehr so schwierig:
<?php
$bilderpfad = 'img/thumbs';
error_reporting(E_ALL);
$_bildname = glob("$bilderpfad/*.{gif,Gif,GIF,png,Png,PNG,jpg,Jpg,JPG,jpeg,JPEG,Jpeg}",GLOB_BRACE);
$minbildnummer = 0;
$maxbildnummer = count($_bildname)-1;
// For next Bilder eines nach dem anderen anzeigen
for($count = $minbildnummer; $count < $maxbildnummer; $count++) {
$bild = $count;
## Bild-Pfad:
$src = $_bildname[$bild];
## Bild-Ausgabe mit Tom's "Blätter-Routine" (s.o.) verlinken:
echo "<a href="slide.php?pic=".($bild)."" > <img src="$src" border="1" style="border: 5px transparent" ></a>";
}// Next
?>
Ich hoffe Deinem Server geht es bald wieder besser und dass Du bei meinem nächsten Hilferuf online bist... ;)
Solong!