10. juni 2007 - 10:43Der er
35 kommentarer og 1 løsning
hjælp til mindre galleri problem
Hej eksperter
Jeg er igang med at udarbejde et simpelt billedgalleri, hvor billeder ligger i en database i forskellige kategorier.
Jeg for fint vist billederne i den valgte kategori, 3 stk. ad gangen, samt en "forrige" og "næste" knap hvis der er flere.
Mit problem er at når jeg vælger et billede og for vist thumbnail og lidt tekst, kan jeg ikke få link til næste og forrige link til resten af den valgte kategori til at virke.
Jeg har prøvet en hel de, men er tilsyneladende bare ikke god nok. Jeg har rodet så meget med det at
Understående er fra billeder_valgt.php, noget jeg har fundet herinde og forsøgt mig med, uden held.
# antal til at vise på skærm $display = 1; 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 kunst WHERE id = ".$_GET['id']."; ") or die(mysql_error());
Ja ok, men jeg for denne fejl: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2.
Det er sikkert fordi jeg har forskellige kategorier med billeder?
Jeg prøvet at skrive som foreslået, Akyhne, men der er stadig noget galt.
Når jeg prøver at skrive echo "$antalElementer";, står der kun 1, den skulle vel gerne tælle alle dem der hører til f.eks. kategori 14 for at lave næste og foregående.
Jeg har nu følgende, håber ikke jeg har misforstået noget?:)
# antal til at vise på skærm $display = 1; if (!isset($_GET['pointer']) && !is_int($_GET['pointer'])) $pointer = 0; else $pointer = $_GET['pointer'];
# tæl maks antal elementer $id = $_GET['id']; $sql = mysql_query(" SELECT COUNT(id) FROM kunst WHERE id = \"$id\"") or die(mysql_error());
Ok nu har jeg ændret, jeg for dog stadig kun en fra antal elementer.
Det er sådan at man kan vælge en kategori med billeder, det virker fint så der kommer f.eks. 7 billeder, 3 pr.side, med frem og tilbage knap, samt sidetal i midten.
Ovenstående kode er så til den side der kommer hvis man klikker på et valgt billede af de 7. Dvs. et lag dybere.
11/06-2007 12:35:25 er jeg ikke lige med på... Du sender jo bare en variabel med fra foregående kategoriside.
Hvis det er et link på kategorisiden: echo '<a href="billeder_valgt.php?id='.$id.'">'.$Y.'</a> ';
id bliver så en variabel som både php & for den sags skyld Javascript kan fange. Dette kræver dog at du har register_globals sat til on. Alternativt henter du din id via et hiddenfield.
Nej nok ikke helt:), men fedt du vil hjælpe, håber det er til at overskue, det er 2 næsten ens scrips jeg nu har taget udgangspunkt i.
Kode: billeder_kategori3.php ------------------------------------------------------------------------------------- db connect /* Antallet af poster vi ønsker vist på hver side */ $pr_side = 3;
/* Vi tæller antallet af poster i tabellen husk at ændre ‘table’ til dit eget tabelnavn */ $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = ".$_GET['id'].""),0) or die(mysql_error());
Jeg har forsøgt mig med koden fra ovenstående side som jeg ved virker, og det er blevet bedre. Jeg kan nu fint vælge og få vist det rigtige billede, og for vist 1,2,3,4,5,6,7,8 som er antallet af billeder i kategorien. Det fungerer dog ikke med indexeringen, da 1 er markeret uanset hvilket jeg vælger fra start.
/* Antallet af poster vi ønsker vist på hver side */ $pr_side = 1;
/* Vi tæller antallet af poster i tabellen husk at ændre ‘table’ til dit eget tabelnavn */ $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = ".$_GET['kategori'].""),0) or die(mysql_error());
/* Hvis visfra-variablen ikke findes i URL-feltet og den ikke er et nummer og den er større end antallet i databasen, så sættes den til 0, ellers sættes den til værdien fra URL feltet */
/* Vi laver et database udtræk med limit, så den kun hiver det rigtige antal ud fra tabellen, husk at ændre ‘table’ til dit eget tabelnavn */ $kategori = $_GET['kategori']; $result = "<table width='650' border='1'>\n"; $kunstquery = mysql_query(" SELECT * FROM kunst WHERE kategori = $kategori AND id = ".$_GET['id']." ORDER BY navn ASC limit $vis_fra, $pr_side"); $i_tmp = 1; $i_antal = 4; while($kunstinfo = mysql_fetch_array($kunstquery)) { if($i_tmp == 1) $result .= "\t<tr>\n"; $result .= "\t\t<td><img src='admin/$kunstinfo[thumbnail]' style=\"border-color:#353647\"><br>$kunstinfo[pris]\n"; $result .= "\t$kunstinfo[tekst]</td>\n";
Ja, det var det jeg mente, men jeg er nødt til at vide lidt mere. du skriver at du henter fra 2 tabeller. billeder_kategori3.php henter fra 1 tabel & billeder_valgt.php henter fra en anden. Men det gør du ikke i dine scripts! Der henter du kun fra 1 tabel, kaldet kunst!
Derfor er det lidt svært for mig at finde ud af hvad scriptene egentlig skal. Dog skal du lave følgende ændringer:
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = ".$_GET['id'].""),0) or die(mysql_error());
skal være
$id = $_GET['id']; $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = \"$id\""),0) or die(mysql_error());
og
$kunstquery = mysql_query("SELECT * FROM kunst WHERE kategori = ".$_GET['id']." ORDER BY navn ASC limit $vis_fra, $pr_side");
skal være
$kunstquery = mysql_query("SELECT * FROM kunst WHERE kategori = \"$id\" ORDER BY navn ASC limit $vis_fra, $pr_side");
og
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = ".$_GET['kategori'].""),0) or die(mysql_error());
skal være
$kategori = $_GET['kategori']; $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = \"$kategori\""),0) or die(mysql_error());
og
$kunstquery = mysql_query("SELECT * FROM kunst WHERE kategori = $kategori AND id ".$_GET['id']." ORDER BY navn ASC limit $vis_fra, $pr_side");
skal være
$id = $_GET['id']; $kunstquery = mysql_query("SELECT * FROM kunst WHERE kategori = \"$kategori\" AND id = \"$'id'\" ORDER BY navn ASC limit $vis_fra, $pr_side");
Ja du har ret, nu er alle warnings væk, og den tager fint, det rigtige id og kategori med over i urlen.
Jeg forsøger at uddybe lidt: 1. Inde i billeder_kategori.php er der en menu med kategorinavne, hentet fra tabellen kategori. 2. Når man vælger en kategori, for man på siden vist de billeder der er i tabellen kunst som hører til kategorien. De bliver vist 3 stk. pr. side, med forrige og næste knap osv. 3. Man kan klikke på et billede for at se den større version, samt beskrivelse osv., hvilket skulle ske på billeder_valgt.php. Her skal man så kunne vælge forrige og næste, samt billederne ud fra numre osv. Denne info kommer fra kunst tabellen, samt de alle selvfølgelig skal være fra den valgte kategori samtidig.
Til visning af menuen henter jeg fra tabellen kategori, ellers ikke. Men så viderefører jeg jo "kategori id" fra tabellen, for der skal kun vises billeder fra den valgte kategori.
/* Antallet af poster vi ønsker vist på hver side */ $pr_side = 1;
/* Vi tæller antallet af poster i tabellen husk at ændre ‘table’ til dit eget tabelnavn */
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = \"$kategori\""),0) or die(mysql_error());
/* Hvis visfra-variablen ikke findes i URL-feltet og den ikke er et nummer og den er større end antallet i databasen, så sættes den til 0, ellers sættes den til værdien fra URL feltet */
/* Vi laver et database udtræk med limit, så den kun hiver det rigtige antal ud fra tabellen, husk at ændre ‘table’ til dit eget tabelnavn */ $result = "<table width='650' border='1'>\n";
$kategori = $_GET['kategori']; $kunstquery = mysql_query("SELECT * FROM kunst WHERE kategori = \"$kategori\" ORDER BY id ASC ");//limit $vis_fra, $pr_side");
// viser links til de 2 forrige billeder samt de 2 næste for ($start = 0; $start = $antal; $start ++) { IF ($start > $vistbillede-2 AND $start < $vistbillede+2 ) { $temp .= $links[$start]; } } echo $temp;
Jeg ved ikke om den virker, p.g.a. ovennævnte problemer med serveren!!!
// viser links til de 2 forrige billeder samt de 2 næste for ($start = 0; $start < $page; $start ++) { IF ($start >= $vistbillede-3 AND $start < $vistbillede+2) { $temp .= $links[$start]; } } echo $temp;
Du har valgt at videreføre dine variabler via links. Dermed skal du enten holde musen over linkene eller kigge i den genererede htmlkode, for at se hvad der mangler af data. Det var i hvertfald nogle af problemerne.
Det næste er måden man skriver en streng til en variabel hhv. et MySql kald. En variabel som sammensættes af strenge og andre variabler kan sættes sammen på forskellige måder. Den metode jeg bruger mest er:
$Antal = 5; $nyVariabel = "Du er nr. " . $Antal . " besøgende";
Jeg bruger Dreamweaver til at kode i. Der får jeg forskellige farver på php kode & strenge. Det gør det overskueligt.
En streng til et MySql kald sammensættes på næsten samme måde, blot kan man af en eller anden grund ikke sætte koden sammen på helt samme måde. MySql kan åbenbart ikke lide [ & ]. Derfor gør jeg det at jeg laver en variabel - som regel med samme navn - som jeg i stedet bruger.
Eksempel: Jeg skal lave et MySql kald der skal indeholde en variabel der har værdien "bananer".: ...FROM kunst WHERE kategori = "bananer"
Da bananer kommer fra en linkvariabel kaldet $kategori, er koden: ...FROM kunst WHERE kategori = \"$_GET["kategori"]\"
Det forstår MySql bare ikke. Derfor: $kategori = $_GET['kategori']; ...FROM kunst WHERE kategori = \"$kategori\"
Da sætningen skal i gåseøjne, bliver det: "...FROM kunst WHERE kategori = \"$kategori\"" Backslashene (\) er for at MySql skal opfatte gåseøjne med et backslash foran sig som et gåseøje, og ikke som start- eller slutsignalet i en streng.
Jeg skal ikke kunne sige om der rent faktisk findes en metode som virker.
Den måde som kodekeksemplet du har fundet bruger, bryder jeg mig ikke om. Jeg foretrækker f.eks tuborgklammer i IF-lykker IF ($a=1) { echo "Ja"; }
... frem for IF ($a=1) echo "Ja";
På mine webhoteller duer følgende ikke. Det giver ingen fejl. men heller ingen værdi: echo "Din pris er " . $kunstinfo[pris] . " kr."; som vil skrive: Din pris er kr.
Hvorimod: echo "Din pris er " . $kunstinfo["pris"] . " kr."; vil skrive: Din pris er 125 kr
... såfremt $kunstinfo["pris"] er 125. Det er åbenbart afhængig af hvordan PHP er installeret på serveren. Jeg har i hvertfald erfaret at jeg lige så godt kan skrive koden fuldt ud, fremfor at bruge de "sparetricks" man nogle steder kan benytte sig af.
Prøv i øvrigt følgende kode i en php fil:
<body> <?php // Begge metoder gælder lige godt. Man skal bare bibeholde, hvad man i en kodelinie er startet med. $V = '366'; $V = "266"; // Gyldig, og ophæver derfor forrige værdi //$V = "266'; // vil give fejl hvis koden køres
echo "Du er besøgende nr. " . $V . " i dag.<br>"; echo "Du er besøgende nr. ' . $V . ' i dag.<br>"; echo 'Du er besøgende nr. ' . $V . ' i dag.<br>';
echo 'Du er besøgende nr. ' . $_GET[id] . ' i dag.<br>'; // henter ikke altid en værdi echo 'Du er besøgende nr. ' . $_GET["id"] . ' i dag.<br>'; // skriver værdien id, hvis du i slutningen af dit link har angivet ?id=tusinde, ?id=1000, eller hvadsomhelst ?> <br><br> Indsætning af php variabel i html-kode <br><br> Du er besøgende nr. <?php echo $V; ?> i dag.<br> Du er besøgende nr. <?= $V; ?> i dag.<br> Begge virker lige godt! </body>
Med hensyn til forrige og næste. Hvis der nu står følgende på din htmlside:
forrige 5 6 7 8 9 10 næste
... og billede 8 vises. Hvad skal forrige og næste så vise? Billede 7 hhv. 9? Eller 4 hhv. 11? Eller skal der blot rykkes x antal billeder frem og tilbage? I mine øjne ville det logiske være 7 hhv. 9. Jeg medtog det ikke, da det giver vidt forskellig kodning. Derfor ville jeg lige være sikker.
Så er der kommet forrige- og næste link på. Og siden er w3 valid.
<body>
<?php
$kategori = $_GET['kategori']; $id = $_GET['id'];
/* Antallet af poster der må være på hver side af det viste billede */ $pr_side = 2; // værdien må gerne sættes til 0. Så vises kun forrige | aktuelt billede | næste
/* Vi tæller antallet af poster i tabellen husk at ændre ‘table’ til dit eget tabelnavn */
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM kunst WHERE kategori = \"$kategori\""),0) or die(mysql_error());
/* Vi laver et database udtræk med limit, så den kun hiver det rigtige antal ud fra tabellen, husk at ændre ‘table’ til dit eget tabelnavn */ $result = "<table width='650' border='1'>\n";
$kategori = $_GET['kategori']; $kunstquery = mysql_query("SELECT * FROM kunst WHERE kategori = \"$kategori\" ORDER BY id ASC "); while($kunstinfo = mysql_fetch_array($kunstquery)) { $page++; IF($kunstinfo["id"] == $id) { // Vi leder efter det billede der skal vises IF (isset($gemforrige)) { // Hvis der har været en forrige, gemmer vi denne som et link $temp = "<a href='$_SERVER[PHP_SELF]?kategori=".$_GET['kategori']." id=".$gemforrige."'>Forrige</a> "; } $gemnæste = true; // Næste gang lykken kører, skal der gemmes et "Næste"- link
$result .= " <tr>\n"; $result .= " <td><img src=\"admin/".$kunstinfo["thumbnail"]."\" style=\"border-color:#353647\" alt=\"\"><br>".$kunstinfo["pris"]."\n"; $result .= " ".$kunstinfo["tekst"]."\n </td>\n"; $links[] .= chr(10).' '.$page; // Opbygger arrayet. $vistbillede = $page; // Gemmer hvor i arrayet vi henter billedet } else { $links[] .= "\n <a href='$_SERVER[PHP_SELF]?kategori=".$_GET['kategori']." id=".$kunstinfo['id']."'>".$page."</a> "; // Opbygger arrayet if (isset($gemnæste)) { $næste="\n <a href='$_SERVER[PHP_SELF]?kategori=".$_GET['kategori']." id=".$kunstinfo['id']."'>Næste</a> "; // Gemmer "næste" link unset($gemnæste); // sletter variablen, så der ikke bliver lavet flere "Næste"-links } } $gemforrige = $kunstinfo["id"]; // Gemmer id fra forrige } $result .= " </tr>\n</table>\n\n"; // Afslut tabellen print $result; // Vis billedet
// viser links til de 2 forrige billeder samt de 2 næste for ($start = 0; $start < $page; $start ++) { IF ($start >= $vistbillede-$pr_side-1 AND $start < $vistbillede+$pr_side) { $temp .= $links[$start]; // Laver alle linkene } } $temp .= $næste; // Vi afslutter med at sætte et "Næste"- link på $temp = '<span class="email">'.$temp; // ... og et span $temp .= chr(10).'</span>'; // ... og et slut span echo $temp; ?>
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.