Avatar billede gigs Nybegynder
04. april 2004 - 01:48 Der er 16 kommentarer og
2 løsninger

Problemer med prev funktion i galleri

Hej eksperter!

Jeg er ved at lave en side, hvor der også skal være et galleri med mulighed for forskellige brugere at uploade deres billeder.
  Det ordner jeg i en MySQL database hvor alle billederne (Ja deres url) bliver smidt ind i det samme table. Derfor er der en masse rod i dem. Derudover vil der også være mulighed for at slette billeder og dette vil, som I ved, skabe "huller" i den fortløbne ID rækkefølge. Hver post i table'et vil have en gruppeid som sørger for at man ved hvilken bruger billedewt tilhører.

Mit problem opstår når jeg vil lave en næste og previos funktion til at bladre i billederne. Det har jeg før lappet sammen med at sende id'et for det næste og forgående billede med i adresselinien. Det var bare noget juks som ikke fungerede 100%, men nærmere var en enormt fyldende og uoverskuelig nødløsning!

  Det jeg leder efter er en simpel måde at kende id nummeret for den forgående (Det er klart her mine problemer ligger) og den næste post, vel og mærke efter at de er blevet sorteret ud i en record med billeder udelukkende fra 1 bruger...

  Findes der en move forward/backward funktion for et record ligesom i ASP eller hvad gør??? Et lille, enkelt eksempel på en side ville være helt i top.


På forhånd tak - Jens
Avatar billede gigs Nybegynder
04. april 2004 - 02:01 #1
Ja, okay det lykkedes mig faktisk selv at komme frem til denne løsning, men kan det ikke gøres kortere???:

<?php
  include ('dbconn.php');
  $ID = $_GET['ID'];
  $SQL = mysql_query("SELECT * FROM mailinglisttb");
  while ($array = mysql_fetch_array($SQL)) {
    $tempID = $array['ID'];
    if ($tempID == $ID) {
        $array = mysql_fetch_array($SQL);
      $nextID = $array['ID'];
    }
  }
  $SQL = mysql_query("SELECT * FROM mailinglisttb ORDER BY ID desc");
  while ($array = mysql_fetch_array($SQL)) {
    $tempID = $array['ID'];
    if ($tempID == $ID) {
        $array = mysql_fetch_array($SQL);
      $prevID = $array['ID'];
    }
  }
  echo "<a href='editdb.php?ID=".$prevID."'>Forgående ID = $prevID</a> - $ID - <a href='editdb.php?ID=".$nextID."'>Næste ID = $nextID</a>";
?>

Det ville nu være pænere på 5 linier
Avatar billede busschou Praktikant
04. april 2004 - 02:52 #2
<?php
  include ('dbconn.php');
  $ID = $_GET['ID'];
  $SQL = mysql_query("SELECT * FROM mailinglisttb ORDER BY ID desc");
  while ($array = mysql_fetch_array($SQL)) {
    $tempID = $array['ID'];
    if ($tempID == $ID) {
      $array = mysql_fetch_array($SQL);
      $nextID = $array['ID'];
      // ud af løkken
    }else{
      $prevID = $tempID;
    }
  }
echo "<a href='editdb.php?ID=".$prevID."'>Forgående ID = $prevID</a> - $ID - <a href='editdb.php?ID=".$nextID."'>Næste ID = $nextID</a>";
?>
Avatar billede busschou Praktikant
04. april 2004 - 02:55 #3
Jeg er ikke en super haj til php eller mysql. Men tænkte måske mit foreslag virker.
Jeg er bare ikke sikker på hvordan man i php hopper ud af en while løkke.
Men som jeg tænker det så vil den hvis der findes et match ved første forsøg ikke danne en $prevID...og ellers vil fremover hele tiden huske $prevID indtil et match findes. Herefter bør der så hoppes ud så while løkken stopper - da der jo ikke er nogen grund til at søge resten igennem
Avatar billede limemedia Nybegynder
04. april 2004 - 02:57 #4
busschou >> kan være det virker, men du henter hele indholdet af maillinglisttb fremfor kun det afgrænsede område som gigs ønsker at vise. Eksempel følger

gigs >> næsten alt kan skrives på meget få, lange og ulæselige linier. Dét er ikke et mål i sig selv at gøre kode kort
Avatar billede limemedia Nybegynder
04. april 2004 - 03:11 #5
Jeg har omdøbt din $id til $pointer, da den ikke peger på et specifikt id men nærmere en placering i databasen - som en bonus har jeg tilføjet "sider" således du får
Forgående 1 2 3 4 5 Næste
således du individuelt kan hoppe én/flere sider frem og tilbage

Nedenfor er hele koden, der også viser de 20 (ret $display = 20; hvis du ønsker et andet antal) elemeneter på siden, der udskrives dog pt kun id'et

<?php
    include ('dbconn.php');

    # antal til at vise på skærm
    $display = 20;
    if (!isset($_GET['pointer']) || !is_int($_GET['pointer'])) $pointer = 0;
    else $pointer = $_GET['pointer'];
   
    # tæl maks antal elementer
    $sql = mysql_query("
        SELECT COUNT(id)
        FROM mailinglisttb
    ") or die(mysql_error());

    $foo = mysql_fetch_row($sql);
    $antalElementer = $foo[0];
   
    # udskriv elementer på side
    $sql = mysql_query("
        SELECT *
        FROM mailinglisttb
        LIMIT $pointer,$display
    ") or die(mysql_error());
   
    while ($foo = mysql_fetch_assoc($sql)) {
        # Udskriv dine billeder her
        echo $foo['id'].'<br>';
    }
   
    # tilbage knap
    if ($pointer != 0) echo '<a href="editdb.php?pointer="'.($pointer-$display).'>Forgående</a> ';
    else echo 'Forgående ';

    # side indexeringer
    $maxIndex = floor($antalElementer/$display);
    for ($i=0;$i<$maxIndex;$i++) echo '<a href="editdb.php?pointer="'.($i*$display).'>'.$i.'</a> ';
   
    # frem knap
    if ($pointer < $antalElementer) echo '<a href="editdb.php?pointer="'.($pointer+$display).'>Næste</a> ';
    else echo 'Næste ';
?>
Avatar billede gigs Nybegynder
04. april 2004 - 03:39 #6
mmm. Den skriver ikke noget ud i pointerfeltet ved næste linket og heller ikke i tallene.

se: http://www.jensfrandsen.dk/test.php?pointer=1
Avatar billede limemedia Nybegynder
04. april 2004 - 03:55 #7
The image “http://www.jensfrandsen.dk/test.php?pointer=1” cannot be displayed, because it contains errors.

var hvad jeg fik på min skærm
Avatar billede limemedia Nybegynder
04. april 2004 - 03:59 #8
manglede et par " i koden

    # tilbage knap
    if ($pointer != 0) echo '<a href="editdb.php?pointer="'.($pointer-$display).'">Forgående</a> ';
    else echo 'Forgående ';

    # side indexeringer
    $maxIndex = floor($antalElementer/$display);
    for ($i=0;$i<$maxIndex;$i++) echo '<a href="editdb.php?pointer="'.($i*$display).'">'.$i.'</a> ';
 
    # frem knap
    if ($pointer < $antalElementer) echo '<a href="editdb.php?pointer="'.($pointer+$display).'">Næste</a> ';
    else echo 'Næste ';
?>
Avatar billede busschou Praktikant
04. april 2004 - 08:13 #9
lars-jensen => det lyder da meget du starter med at skrive at jeg gør noget som gigs ikke ønsker. Alt jeg gjorde var at gøre som han ønskede i første indlæg. Nemlig komme med et foreslag til en kortere kode ud fra den han selv lavede som virkede.
Dit alternativ er da lækkert nok - og som du skriver er kort kode ikke altid det bedste. Men hvis mit løsningsforslag føles så skidt. Så ved jeg da ikke hvorfor du selv lige retter her og der og tilføjer ekstra features - når ønsket var en kortere løsning...... men ok det er da måske en mere lækker løsning omend længere
Avatar billede limemedia Nybegynder
04. april 2004 - 09:21 #10
busschou >> at rette hans kode til stadig at returnere samtlige poster fra hans database når han samtidig skriver at han ønsker noget optimalt, kan ikke være hvad han ønsker - derfor min generelle utilfredshed med den angivne løsning. Dét ekstra jeg har lavet - udover at sikre input, tilføjet kommentarer og to linier der kan slettes hvis han ikke ønsker det - kan jeg ikke i min vildeste fantasi se der er noget proble med :) så er det måske bedre at nævne for ham, at "optimal" kode ikke er kortere, men mere korrekt. Min kode vil således sende færre data fra databasen til applikationen, og dermed udføres hurtigt (omend et par ekstra linier)
Avatar billede busschou Praktikant
04. april 2004 - 09:45 #11
lars-jensen >> fint nok... hvor i min kode er det at hele databasen retuneres?
Avatar billede busschou Praktikant
04. april 2004 - 10:20 #12
Urgh... håber altså ikke jeg lød for negativ! ... Men som jeg skrev er jeg selv ikke helt prof i php og mysql endnu. Så jeg vil gerne forstå hvorfor mit foreslag retunerer samtlige poster. For det forstår jeg nemlig ikke lige :o)
Avatar billede limemedia Nybegynder
04. april 2004 - 10:26 #13
$SQL = mysql_query("SELECT * FROM mailinglisttb ORDER BY ID desc");

giver mysql ordre til at selecte samtlige felter og rækker fra mailinglisttb samt returnere datasættet til php applikationen

forskellen til min er, at jeg til at tælle antal rækker anvender COUNT(id) hvor mysql sammentæller antal rækker og returnerer udelukkende détte tal og dernæst anvender en LIMIT til at begrænse de antal rækker vi egentligt ønsker at vise
Avatar billede busschou Praktikant
04. april 2004 - 10:37 #14
oki fair nok... tak for forståelsen :o)
Avatar billede gigs Nybegynder
04. april 2004 - 15:21 #15
ok lars vi nærmer os... Jeg måtte fjerne et " i hver af linkene for næste, tilbage osv knapperne, således her:

    if ($pointer < $antalElementer) echo '<a href="test.php?pointer='.($pointer+$display).'">Næste</a> ';
    else echo 'Næste ';

Der var et " ligefør pointer+display blev sat ind hvilket der ikke skulle være, og nu får jeg så som ønsket at næste knappen peger på test.php?pointer=20 , men her er stadig et problem. Når jeg trykker på den har pointer stadig værdien 0 i næste side. Jeg er næsten sikker på at det er i denne linie i dette !is_int($_GET['pointer']) udsagn at det går galt.... Jeg går ud fra at du vil checke om pointer overhovedet er sat?? Men den smider 0 i $pointer ligemeget hvad...

if (!isset($_GET['pointer']) || !is_int($_GET['pointer'])) $pointer = 0;
    else $pointer = $_GET['pointer'];

For lige at deltage i jeres diskussion, kan jeg sige at Busschou har ret i at det faktisk bare var et par enkelte kommandoer til at hente næste og forgående post frem, jeg var ude efter. Men da dette faktisk er den næste del jeg står og skal optimere er det helt perfekt, da jeg hurtigt kan fjerne det overflødige kode til det jeg laver nu...

- Jens
Avatar billede gigs Nybegynder
04. april 2004 - 15:22 #16
Avatar billede limemedia Nybegynder
04. april 2004 - 15:36 #17
ret
if (!isset($_GET['pointer']) || !is_int($_GET['pointer'])) $pointer = 0;
til
if (!isset($_GET['pointer']) && !is_int($_GET['pointer'])) $pointer = 0;

kom til at lave en logisk OR hvor jeg mente AND
sådan er det, når man ikke tester sin kode :( sorry
Avatar billede gigs Nybegynder
04. april 2004 - 22:26 #18
Her er pointene som fortjent, tak for hjælpen :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester