Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:21 Der er 25 kommentarer og
1 løsning

Hent nummer X sorteret efter DATETIME

Hej.

Jeg har et lille problem. Min tabel ser således ud, den skal indeholde en euversion og en dkversion og en plversion af noget tekst, og så en datetime (rimeligt åbenlyst :)):

id int(5) auto_increment PRIMARY KEY,
euver text,
dkver text,
plver text,
dato datetime

Så vil jeg ellers hente 5 ind på en side af gangen. Men jeg vil ikke bruge id'et, da det er auto_increment - og der derfor kan være huller, hvis en post er blevet slettet. Jeg har så skrevet dette:

if(isset($_GET['tal'])) {
    $tal = $_GET['tal'];
} else {
    $tal = getStoriesCount();
}
for($i = $tal; $i > $tal-6; $i--) {
    print "<tr><td class=\"nyhed\"><font color=\"blue\">";
    printStory($i, $language);
    print "</font></td></tr>";
}

funktionen getStoriesCount ser sådan her ud:

function getStoriesCount() {
    openDatabase();
    $result = mysql_num_rows(mysql_query("SELECT * FROM cempstories"));
    return $result;
}

og funktionen printStory ser sådan her ud:

function printStory($nummer, $language) {
    openDatabase();
    $languagever = $language."ver";
    $result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $nummer, 1") or die(mysql_error());
    $row = mysql_fetch_row($result) or die(mysql_error());
    return $row[$languagever];
    closeDatabase();
}

Det er så denne smukke SQL sætning, der skulle sortere efter datetime og give mig nummer x i denne sortering... Men det virker ikke :( Jeg får ingen fejl, men intet resultat. Det sidste html på siden bliver nemlig:

<tr><td class="nyhed"><font color="blue">

Og så er den side slut !

Hvad går der galt ? :)
Avatar billede detox Nybegynder
17. oktober 2004 - 23:26 #1
Men du gør det nu osse mere indviklet end du behøver. Du kan jo nøjes en forespørgsel for at hente de 5 nyeste rækker, istedet for at hente alle rækker først.
Avatar billede detox Nybegynder
17. oktober 2004 - 23:28 #2
$result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT 5") or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
  // udskriv de 5 resultater
}
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:28 #3
Min ide var jo ogaå at den her kun henter een post i det rette sprog, med det rette munner ?!

$languagever = $language."ver";
$result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $nummer, 1")
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:29 #4
Ja, din version er fin nok, men hvis nu man trykker på "Stik mig de næste fem", skal den jo have nummeret med ind i funktionen :)
Avatar billede mollevp Nybegynder
17. oktober 2004 - 23:30 #5
har $language i printStory($nummer, $language) en værdi og skal det ikke være:
print printStory($i,$language);
ellers printer du vel ikke det den returnerer
Avatar billede detox Nybegynder
17. oktober 2004 - 23:31 #6
Så kan du konstruere den således:

$start = isset($_GET['tal']) ? $_GET['tal'] : 0;
$result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $start,5") or die(mysql_error());
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:32 #7
print er en god ide :) Det var dog desværre ikke nok ...
Avatar billede detox Nybegynder
17. oktober 2004 - 23:33 #8
Og har du brug for antal rækker i tabellen, men ikke skal bruge alle data, er det nemmere at hente antallet med:

$antal_raekker = mysql_result(mysql_query("SELECT count(*) FROM cempstories"),0);
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:33 #9
Jeg har nu:

include 'cempfunc.php';

if(isset($_GET['language'])) {
    $language = $_GET['language'];
} else {
    $language = "eu";
}
if(isset($_GET['tal'])) {
    $tal = $_GET['tal'];
} else {
    $tal = getStoriesCount();
}
...
noget html
...
for($i = $tal; $i > $tal-6; $i--) {
    print "<tr><td class=\"nyhed\"><font color=\"blue\">";
    print printStory($i, $language);
    print "</font></td></tr>";
}

Men stadig intet resultat, og siden ender stadig på samme måde.
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:44 #10
Det er mystisk: I min fejlfindung prøvede jeg nu at skrive:

return "HEJSA";

i funktionen printStory()

Men det kom heller ikke på skærmen... Hvad hulen ?!
Avatar billede detox Nybegynder
17. oktober 2004 - 23:45 #11
$start = isset($_GET['tal']) ? $_GET['tal'] : 0;
$language = isset($_GET['language']) ? $_GET['language'] : 'eu';
$languagever = $language."ver";
$result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $start,5") or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
    print "<tr><td class='nyhed' style='color: blue;'>";
    print $row['language'];
    print "</td></tr>";
}

Kan du se ideen, med at spare forespørgslen med alle rækkerne?
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:46 #12
Men funktionen bliver fint nok kaldt:

function printStory($nummer, $language) {
    print "<script>alert(\"hva så der\");</script>";
    openDatabase();
    $languagever = $language."ver";
    $result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $nummer, 1") or die(mysql_error());
    $row = mysql_fetch_assoc($result) or die(mysql_error());
    return "HEJSA"; //$row[$languagever]."hejsa";
    closeDatabase();
}

Den alerter som den skal !
Avatar billede detox Nybegynder
17. oktober 2004 - 23:47 #13
while ($row = mysql_fetch_assoc($result)) {
    print "<tr><td class='nyhed' style='color: blue;'>";
    print $row['language'];
    print "</td></tr>";
}

skal selvfølgelig være:

while ($row = mysql_fetch_row($result)) {
    print "<tr><td class='nyhed' style='color: blue;'>";
    print $row[0];
    print "</td></tr>";
}
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:48 #14
Jeg kan godt se ideen, naturligvis. Det er lidt plat jeg åbner databasen, henter een og lukker igen 5 gange... Men jeg vil gerne have det som funktioner i sit eget dokument, som jeg har det nu :) Så kan min printStory evt. returnere et array med 5 historier i stedet for ...
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:49 #15
Men det er da mærkeligt at den, med min seneste test ikke skriver HEJSA på skærmen ?! Kan du fatte det.
Avatar billede detox Nybegynder
17. oktober 2004 - 23:53 #16
Så kan du jo lave den således:

$start = isset($_GET['tal']) ? $_GET['tal'] : 0;
$language = isset($_GET['language']) ? $_GET['language'] : 'eu';
$news = printStory($start, $language);
foreach ($news as $nyhed) {
  // udskriv
}

function printStory($nummer, $language) {
  $languagever = $language."ver";
  $result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $start,5") or die(mysql_error());
  while ($row = mysql_fetch_row($result)) {
      $arr[] = $row[0];
  }
return $arr;
}
Avatar billede detox Nybegynder
17. oktober 2004 - 23:56 #17
Skulle self. være:

function printStory($nummer, $language) {
  $languagever = $language."ver";
  $result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $nummer,5") or die(mysql_error());
  while ($row = mysql_fetch_row($result)) {
      $arr[] = $row[0];
  }
return $arr;
}
Avatar billede detox Nybegynder
17. oktober 2004 - 23:58 #18
Kan du ikke bare åbne databasen én gang i starten af scriptet (den lukker jo automatisk)?
Avatar billede baitianlong Nybegynder
17. oktober 2004 - 23:58 #19
Jeg har skrevet den sådan her nu (meget lign. din version):

function printStory($start, $language) {
    print "<script>alert(\"hva så der\");</script>";
    openDatabase();
    $languagever = $language."ver";
    $stories = array();
    $result = mysql_query("SELECT $languagever FROM cempstories ORDER BY dato DESC LIMIT $start,5") or die(mysql_error());
    while ($row = mysql_fetch_assoc($result)) {
        array_push($stories, $row[$languagever]);
    }
    return $stories;
    closeDatabase();
}

og så:

$historier = printStory($i, $language);
foreach($historier as $historie) {
    print "<tr><td class=\"nyhed\"><font color=\"blue\">";
    print $historie;
    print "</font></td></tr>";
}

Men der er en fejl i SQL-sætningen...:

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 '5' at line 1
Avatar billede detox Nybegynder
18. oktober 2004 - 00:01 #20
Måske $i mangler en værdi her:

$historier = printStory($i, $language);
Avatar billede detox Nybegynder
18. oktober 2004 - 00:05 #21
Ps: Jeg vil anbefale at du skiller dig af med dit font tag og bruge color: blue; enten i din class eller inline. <font> er ikke længere en del af html.
Avatar billede baitianlong Nybegynder
18. oktober 2004 - 00:11 #22
Nu kommer der tekst fra databasen på siden (endelig) Det er fordi min getStoriesCount returnerer 2, og det er jo rigtigt. Det er fordi jeg før gik "baglæns" fra dette tal. Nu har jeg set at du satte den til 0, beklager at jeg ikke så det tidligere. og i din næstseneste kommentar har du naturligvis også ret i at $i skal være $tal (du har dog omdøbt den til $start)... <font> tagget er midlertidigt, jeg har ikke lavet css'en endnu, da dette standsede mig helt :)

Jeg tror det kører nu - så endnu en gang tak for hjælpen, trods forvirringen :)
Avatar billede baitianlong Nybegynder
18. oktober 2004 - 00:13 #23
Når jeg så går til næste liste af "historier" og sender tallet 5 med i URL'en skal den vise 6-10 i rette sortering (efter dato DESC uanset hvad). Men det tror jeg også den gør.

Du må endelig svare :) Og tak for hjælp og INFO :)
Avatar billede baitianlong Nybegynder
18. oktober 2004 - 00:31 #24
Jeg har smækket det over i stylen:

.nyhed {
    background: #efefef;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 14px;
    color: #000066;
}

Og det er smukt :)
Avatar billede detox Nybegynder
18. oktober 2004 - 19:16 #25
Velbekommen, css er nu en rar ting ;o)
Avatar billede baitianlong Nybegynder
23. november 2004 - 17:26 #26
Beklager det tog så lang tid. Jeg havde næsten glemt det :)
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