irato: per Link "hochzählen"

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!

  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. "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!

    1. 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ö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 ;)

      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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. 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!

        1. 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

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. 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... ;)

            wenn Bild Nr kleiner als 0, dann höchste BildNr u.U.!

            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!

            1. 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

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
            2. Ok, ok -nach Deiner Steilvorlage- war eine Vorschau jetzt wirklich nicht mehr so schwierig:

              <?php

              Bilderpfad eingeben:

              $bilderpfad = 'img/thumbs';

              error_reporting(E_ALL);

              Bildernamen aus dem Verzeichnis lesen.

              $_bildname = glob("$bilderpfad/*.{gif,Gif,GIF,png,Png,PNG,jpg,Jpg,JPG,jpeg,JPEG,Jpeg}",GLOB_BRACE);

              Anzahl der Bilder

              $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!