Avatar billede tbird Nybegynder
09. oktober 2002 - 22:12 Der er 15 kommentarer og
1 løsning

Visning af 10 poster af gangen fra SQL

Jeg har lavet mig en lille database i SQL og noget PHP som udtrækker billeder derfra. Nu vil jeg blot have det sådan at den kun udtrækker ex. 10 ad gangen samt der er en "næste" og "forrige" knap så man kan bladre i siderne.

Jeg har søgt i forskellige spørgsmål og prøvet noget kodet - det kunne jeg bare ikke helt få til at virke. Jeg har også læst om LIMIT, men jeg kan ikke få det til at virke...

Er der nogen der kan give en hjælpende hånd?
Avatar billede jondie Nybegynder
09. oktober 2002 - 22:15 #1
Ex
select * from bog order by  titel limit 0,10

Giver mig de første 10 bøger startende fra 0. så ved at ændre det til

select * from bog order by  titel limit 10,10

giver det mig de næste 10 bøger.
Avatar billede tbird Nybegynder
09. oktober 2002 - 22:20 #2
Jamen skal jeg så ikke ændre ex. "næste" knappen et nyt SQL statement hver eneste gang - altså lave ny side med den kode??

Hvordan får man ellers ændret fra 0,10 til 10,10 - jeg har 36 billeder som jeg vil vise over flere sider.

Jeg prøver lige med LIMIT en gang...
Avatar billede tbird Nybegynder
09. oktober 2002 - 22:26 #3
LIMIT fungerer men hvordan får jeg en næste knap til at være variabel og vælge de 10 næste og derefter de næste igen?
Avatar billede jondie Nybegynder
09. oktober 2002 - 22:28 #4
Ok, eksemplet fra før

$result=mysql_query("select * from bog order by  titel limit offset,100",$csock);

Man kan så lave 2 "knapper" (i det her tilfælde links), med

<?
if ($antal > 100) {
  echo "<A HREF=\"boger.php3?offset=";
  $offset1 = $offset - 100;
  echo $offset1;
  echo "&antal=";
  $antal1 = $antal - $i -100;
  echo $antal1;
  echo "\">Forrige 100</A> / ";
} 
 
if ($i >= 100) {
  echo "<A HREF=\"boger.php3?offset=";
  $offset1 = $offset + 100;
  echo $offset1; 
  echo "&antal=";
  echo $antal;
  echo "\">Næste 100</A>";
}

$antal bliver talt 1 op hver gang du lister en bog.
?>
Avatar billede Slettet bruger
09. oktober 2002 - 22:34 #5
<?
# Antal billeder på hver side
$rowsToReturn = 10;

# Find ud af hvor mange billeder, du har i alt
$result = mysql_query("SELECT COUNT(*) AS totalRows FROM billeder") or die(mysql_error());
$array = mysql_fetch_array($result);
$totalRows = $array['totalRows'];

# Hent en sides billeder
$result = mysql_query("SELECT billede FROM billeder LIMIT ".$offset.",".$rowsToReturn) or die(mysql_error());

# Vis dem
$i = 0;
while ($array = mysql_fetch_array($result)) {
    # Tæller så vi ved, hvor mange billeder vi har vist
    $i++;
    # Vis dine billeder her
    echo "<img src='".$array['billede']."><br>";
}

# Lav relevante links
if ($offset > 0)
    echo "<a href='test.phtml?offset=".($offset - $rowsToReturn)."'>Go back</a>&nbsp;";
if ($offset + $i < $totalRows)
    echo "<a href='test.phtml?offset=".($offset + $rowsToReturn)."'>Next</a>";
?>
Avatar billede Slettet bruger
09. oktober 2002 - 22:36 #6
Det her bruger jeg selv, det skal nok lige tilpasses lidt:

<?

$pr_side = "30"; //Definerer antal resultater pr. side
$s = $_GET['s'];
if (!isset($s)) {
    $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke sættes den
}

?>

<table align="center" width="100%" cellspacing="0" cellpadding="2" border="0">
<tr><td>ID</td></tr>

<?

///Her har du din normale query og udtræk:

$query = mysql_query("SELECT * FROM tabelnavn ORDER BY id DESC LIMIT $s,$pr_side") or die(mysql_error());

//herunder skal dit udtræk så være

while($row = mysql_fetch_array($query)){

echo "<tr><td>" . $row[id] . "</td></tr>";

}

echo "</table><table width=\"100%\"><tr><td width=\"33%\">";

$g_total = mysql_query("SELECT count(id) as total FROM tabelnavn") or die(mysql_error());
$total = mysql_result($g_total,0);

##
#Find ud af om derskal være et Forrige link
##

if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig $pr_side
$previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis forrige side kaldes
echo "<a href='?s=$previous_s'>&laquo; forrige side</a> "; //Udskriver linket
}

echo "</td><td width=\"33%\" align=\"center\">";

##
#Find ud af hvis/hvor mange sider der er rows til
##

$page = 1; //Definerer hvor sidetal skal starte
for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der kører indtil der ikke er nok rows til en side mere

if ($start != $s) { //Tjekker om linket vil komme til at pege på den side man er på
echo "<a href='?s=$start'>$page</a> "; //...hvis ikke, udskrives link med værdien af $page
} else { //Ellers, dvs. hvis linket vil pege på den side man er på..
echo "<b>$page</b> "; //...udskrives værdien af $page bare, altså ikke som link
}
$page++; //Lægger en til $page til næste gang løkken køres
}

##
#Find ud af om der skal være et næste link
##

echo "</td><td width=\"33%\" align=\"right\">";
if ($total > $s+$pr_side) { //Tjekker om der er flere sider
$next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste side kaldes
echo "<a href='?s=$next_s'>næste side &raquo;</a>"; //Udskriver linket "næste"
}

echo "</td></tr>\n";
echo "</table>\n";

?>
Avatar billede tbird Nybegynder
09. oktober 2002 - 22:41 #7
Jeg må nok indrømme at jeg ikke er det hurtigste dyr i skoven, når det gælder PHP, men alt andet lige ser det ud til at Mercur8's svar passer bedre ind i mit... men det er også kun fordi jeg ser nogle "arrays" hist og her. Min kode er som følger:

<?
$my_db = mysql_connect("xxx","xxx","xxx") or die(mysqlerror());           
mysql_select_db("xxx",$my_db);   
$result = mysql_query("SELECT id, file, dir, location, description FROM new LIMIT 0,5");   
while($row = mysql_fetch_array($result))
{
$pics[]  = '<img src ="../pictures/'.$row[dir].'/tn/'.$row[file].'_tn.jpg" align="top">';
}
mysql_close($my_db);
?>

Den LIMIT har jeg lige sat ind, endvidere har jeg en del PHP der sætter alle billederne op i et tabelgitter, gør det sagen mere indviklet eller hvad?

Kunne man implementere ovenstående kode i mit tilfælde? Tak for den hidtidige hjælp :)
Avatar billede tbird Nybegynder
09. oktober 2002 - 22:43 #8
og vel egentlig også el barto's... så det først nu :)
Avatar billede Slettet bruger
09. oktober 2002 - 22:46 #9
tbird: Du må lige gøre en indsats selv nu. Det er ganske lidt, der skal ændres ved det script, jeg skrev til dig som eksempel, for at du er færdig.
Avatar billede Slettet bruger
09. oktober 2002 - 22:46 #10
Sat sammen med mit må det være noget i stil med Det her bruger jeg selv, det skal nok lige tilpasses lidt:

<?

$my_db = mysql_connect("xxx","xxx","xxx") or die(mysqlerror());           
mysql_select_db("xxx",$my_db);

$pr_side = "30"; //Definerer antal resultater pr. side
$s = $_GET['s'];
if (!isset($s)) {
    $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke sættes den
}

?>

<table align="center" width="100%" cellspacing="0" cellpadding="2" border="0">
<tr><td>ID</td></tr>

<?

///Her har du din normale query og udtræk:

$result = mysql_query("SELECT id, file, dir, location, description FROM new ORDER BY id DESC LIMIT $s,$pr_side") or die(mysql_error());

//herunder skal dit udtræk så være

while($row = mysql_fetch_array($result))
{
$pics[]  = '<img src ="../pictures/'.$row[dir].'/tn/'.$row[file].'_tn.jpg" align="top">';
}

echo "</table><table width=\"100%\"><tr><td width=\"33%\">";

$g_total = mysql_query("SELECT count(id) as total FROM tabelnavn") or die(mysql_error());
$total = mysql_result($g_total,0);

##
#Find ud af om derskal være et Forrige link
##

if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig $pr_side
$previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis forrige side kaldes
echo "<a href='?s=$previous_s'>&laquo; forrige side</a> "; //Udskriver linket
}

echo "</td><td width=\"33%\" align=\"center\">";

##
#Find ud af hvis/hvor mange sider der er rows til
##

$page = 1; //Definerer hvor sidetal skal starte
for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der kører indtil der ikke er nok rows til en side mere

if ($start != $s) { //Tjekker om linket vil komme til at pege på den side man er på
echo "<a href='?s=$start'>$page</a> "; //...hvis ikke, udskrives link med værdien af $page
} else { //Ellers, dvs. hvis linket vil pege på den side man er på..
echo "<b>$page</b> "; //...udskrives værdien af $page bare, altså ikke som link
}
$page++; //Lægger en til $page til næste gang løkken køres
}

##
#Find ud af om der skal være et næste link
##

echo "</td><td width=\"33%\" align=\"right\">";
if ($total > $s+$pr_side) { //Tjekker om der er flere sider
$next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste side kaldes
echo "<a href='?s=$next_s'>næste side &raquo;</a>"; //Udskriver linket "næste"
}

echo "</td></tr>\n";
echo "</table>\n";

mysql_close($my_db);
?>
Avatar billede tbird Nybegynder
09. oktober 2002 - 22:47 #11
jaa det har du ærlig talt ret i... jeg prøver lidt tid nu selv - det lærer man jo også mest af :)
Avatar billede truthorn Nybegynder
10. oktober 2002 - 12:13 #12
Jeg har før lavet det der med antal - jeg valgte at have to links:
- Næste 10
- Forrige 10

Herefter havde jeg en variabel tilknyttet (dvs. jeg kendte jo tallet nu f.eks. 80 (næste ville således hedde 90 - og forrige 70).
Denne variabel anvender du direkte ind i din SQL-statement. Så skulle du meget gerne få de rigtige poster frem, når du kører din while-løkke på SQL-statementen (som du faktisk gør).

Det eneste man lige skal være opmærksom på er, at man skal have et check øverst på siden, så man ikke kan klikke videre end det maximale antal billeder ialt (og heller ikke mindre end nul).

Håber du kan bruge tanken i hvert fald .)
Avatar billede fangel Nybegynder
10. oktober 2002 - 14:39 #13
man skal vel tænke sig lidt om hvis nu at man er på OFFSET = 10, og man skal minuse md 10, så skal der jo ikke stå ?OFFSET=0, men intet... det kan løses med en

if($NUVÆRENDE_OFFSET-10 == 0){
$link = "";
}
else{
  $link = "?OFFSET=".$NUVÆRENDE_OFFSET-1.";
}

skal nok lige tilpasses lidt, men det siger vi ik' til nogen... ;)

Morten
Avatar billede tbird Nybegynder
10. oktober 2002 - 14:46 #14
Tak for de mange indslag... jeg prøver lidt videre. Og må så vende tilbage og give point - der kan godt gå lidt tid, men det bliver skam lukket når jeg finder en løsning!

I mellemtiden er folk mere end velkomne til at komme med ideer, så andre også kan få gavn af de forskellige måder det kan gøres på.

Tak indtil videre.
Avatar billede tbird Nybegynder
13. oktober 2002 - 15:27 #15
Det har været til stor hjælp, og jeg har kunne bruge noget fra de fleste indslag. Men da der ikke rigtig er så mange der har givet et svar går pointene til Mercur8...

Men tak til alle der deltog :o)
Avatar billede fangel Nybegynder
13. oktober 2002 - 16:23 #16
så lidt... ;)
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