04. april 2004 - 01:48Der 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.
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
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
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());
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
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)
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)
$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
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...
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...
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
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.