Avatar billede Frederik Nybegynder
12. januar 2010 - 16:33 Der er 11 kommentarer og
1 løsning

Problemer med sortering afMySQL data efter dato.

Hej.

Jeg har et nyhedssystem der skulle sortere nyhederne efter nyeste dato først.

har følgende kode:

require("config.php");

$pr_side = 5;
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM nyhedsdatabase"),0) or die(mysql_error());
$vis_fra = (isset($_GET["visfra"]) && is_numeric($_GET["visfra"]) && $_GET["visfra"] < $antal) ? $_GET["visfra"] : 0;

$query = mysql_query("SELECT overskrift, url, kilde, type, beskrivelse, DATE_FORMAT(CONVERT_TZ(datetime, '+00:00', '+01:00'), '%d-%m-%Y %H:%i:%s') as dato, id FROM nyhedsdatabase ORDER BY dato desc, overskrift limit $vis_fra, $pr_side") or die(mysql_error());
while($row = mysql_fetch_assoc($query)){
define('MAX_HEADLINE_WIDTH', 25);
$link = (strlen($row['url'])>MAX_HEADLINE_WIDTH) ? substr($row['url'], 0, MAX_HEADLINE_WIDTH-3)."..." : $row['url'];
?>

<?php
$newurl = htmlspecialchars("$row[url]", ENT_QUOTES);
?>

<?php
$link = htmlspecialchars("$link", ENT_QUOTES);
?>



Det har virket helt fint ind til for kort tid siden, men ligepludselig er den begyndt at drille... Måske er det efter årsskiftet??

hvis jeg tilføjer en nyhed (12-01-2010 16:19:22) nu, bliver den vist på fx 3. side.

altså imellem en nyhed fra 22-11-2009 16:28:09 og  10-01-2010 19:02:59.


Hvordan kan det være at den blander datoerne sammen?? Kan det have noget at gøre med en opdatering af PHP versionen på serveren?


Hilsen
Frederik
Avatar billede repox Seniormester
12. januar 2010 - 17:18 #1
Står dine datoer i din tabel i det format du har beskrevet her? Altså DD-MM-YYYY?
Avatar billede tjens Nybegynder
12. januar 2010 - 17:31 #2
Er du ikke nødt til at have et felt i format YYYY-MM-DD at sortere på?
Avatar billede Frederik Nybegynder
12. januar 2010 - 20:59 #3
I min tabel er det en datetime og den står: fx 2009-11-03 17:36:07

Vil mene, at jeg konvertere datoen til det rette format ved:

DATE_FORMAT(CONVERT_TZ(datetime, '+00:00', '+01:00'), '%d-%m-%Y %H:%i:%s') as dato

Det har virket fuldstændig fint hidtil, men efter  årsskiftet sorterer den ikke rigtigt mere.. De post til databasen kommer godt nok efter hinanden, men er bare ikke placeret helt i toppen.

Hvad gør jeg galt?
Avatar billede repox Seniormester
12. januar 2010 - 21:03 #4
Hvis du sorterer på dato og ikke datetime feltet, så giver det mening at det ikke virker efter hensigten.
Avatar billede Frederik Nybegynder
12. januar 2010 - 21:20 #5
Jeg er ikke så stærk i php, men her er hele kildekoden:

<?php
if($_SESSION['rank'] == 1){
?>
<?
require("config.php");

$pr_side = 5;
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM nyhedsdatabase"),0) or die(mysql_error());
$vis_fra = (isset($_GET["visfra"]) && is_numeric($_GET["visfra"]) && $_GET["visfra"] < $antal) ? $_GET["visfra"] : 0;

$query = mysql_query("SELECT overskrift, url, kilde, type, beskrivelse, DATE_FORMAT(CONVERT_TZ(datetime, '+00:00', '+01:00'), '%d-%m-%Y %H:%i:%s') as dato, id FROM nyhedsdatabase ORDER BY dato desc, overskrift limit $vis_fra, $pr_side") or die(mysql_error());
while($row = mysql_fetch_assoc($query)) {
define('MAX_HEADLINE_WIDTH', 25);
$link = (strlen($row['url'])>MAX_HEADLINE_WIDTH) ? substr($row['url'], 0, MAX_HEADLINE_WIDTH-3)."..." : $row['url'];
?>
<?php
$newurl = htmlspecialchars("$row[url]", ENT_QUOTES);
?>
<?php
$link = htmlspecialchars("$link", ENT_QUOTES);
?>
<div class="indholdtop"><?php  echo"<h1>".$row['overskrift']."</h1><h2>Tilføjet: ".$row['dato']." af Webmaster</h2>"; ?></div>
<div class="indholdcontent">
   
<div class="news"><?php echo"<b>Link:</b> <a href=\"http://".$newurl."\" target=\"_blank\">".$link."</a>"; ?></div>
<div class="news"><?php echo"<b>Kilde:</b> ".$row['kilde']."";?></div>
<div class="news"><?php echo"<b>Type:</b> ".$row['type'].""; ?></div><br>
<div class="news"><?php echo"<b>Beskrivelse:</b><br>".$row['beskrivelse'].""; ?></div>
<br>
<div class="news"><?php echo"<a href=\"index.php?pageid=16&id=".$row['id']."\">Ret/Slet</a> "; ?></div>
   
   
</div>
<div class="indholdbund"></div>
<br><br>



<?php
}
?>

<div class="sideskift">
<?
if ($vis_fra > 0) {
    $back= $vis_fra - $pr_side;
    echo "<a href='$_SERVER[PHP_SELF]?pageid=3&amp;visfra=$back'><</a> ";
}
$page = 1;

for ($start = 0; $antal > $start; $start = $start + $pr_side) {
    if($vis_fra != $page * $pr_side - $pr_side) {
        echo "<a href='$_SERVER[PHP_SELF]?pageid=3&amp;visfra=$start'>$page</a>";
    } else {
        echo "<b>$page</b>";
    }
    $page++;
}

if ($vis_fra < $antal - $pr_side) {
    $next = $vis_fra + $pr_side;
    echo " <a href='$_SERVER[PHP_SELF]?pageid=3&amp;visfra=$next'>></a>";
}
?>
</div>

<?php
} else {
require("config.php");

$pr_side = 5;
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM nyhedsdatabase"),0) or die(mysql_error());
$vis_fra = (isset($_GET["visfra"]) && is_numeric($_GET["visfra"]) && $_GET["visfra"] < $antal) ? $_GET["visfra"] : 0;

$query = mysql_query("SELECT overskrift, url, kilde, type, beskrivelse, DATE_FORMAT(CONVERT_TZ(datetime, '+00:00', '+01:00'), '%d-%m-%Y %H:%i:%s') as dato, id FROM nyhedsdatabase ORDER BY dato desc, overskrift limit $vis_fra, $pr_side") or die(mysql_error());
while($row = mysql_fetch_assoc($query)){
define('MAX_HEADLINE_WIDTH', 25);
$link = (strlen($row['url'])>MAX_HEADLINE_WIDTH) ? substr($row['url'], 0, MAX_HEADLINE_WIDTH-3)."..." : $row['url'];
?>

<?php
$newurl = htmlspecialchars("$row[url]", ENT_QUOTES);
?>

<?php
$link = htmlspecialchars("$link", ENT_QUOTES);
?>

<div class="indholdtop"><?php  echo("<h1>".$row['overskrift']."</h1><h2>Tilføjet: ".$row['dato']." af Webmaster</h2>"); ?></div>
<div class="indholdcontent">
   
<div class="news"><?php echo("<b>Link:</b> <a href=\"http://".$newurl."\" target=\"_blank\">".$link."</a>"); ?></div>
<div class="news"><?php echo("<b>Kilde:</b> ".$row['kilde']."");?></div>
<div class="news"><?php echo("<b>Type:</b> ".$row['type'].""); ?></div><br>
<div class="news"><?php echo("<b>Beskrivelse:</b><br>".$row['beskrivelse'].""); ?></div>

    </div>
    <div class="indholdbund"></div>
    <br><br>

<?php
}
?>
<div class="sideskift">
<?

if ($vis_fra > 0) {
    $back= $vis_fra - $pr_side;
    echo "<a href='$_SERVER[PHP_SELF]?pageid=3&amp;visfra=$back'><</a> ";
}
$page = 1;

for ($start = 0; $antal > $start; $start = $start + $pr_side) {
    if($vis_fra != $page * $pr_side - $pr_side) {
        echo "<a href='$_SERVER[PHP_SELF]?pageid=3&amp;visfra=$start'>$page</a>";
    } else {
        echo "<b>$page</b>";
    }
    $page++;
}

if ($vis_fra < $antal - $pr_side) {
    $next = $vis_fra + $pr_side;
    echo " <a href='$_SERVER[PHP_SELF]?pageid=3&amp;visfra=$next'>></a>";
}
?>
</div>
<?php
}
?>


Kan du se om jeg forterer på det rigtige??
Avatar billede tjens Nybegynder
12. januar 2010 - 22:22 #6
Når du formatterer dato til %d-%m-%Y og sorterer ORDER BY dato desc, skal den jo sortere sådan:
22-11-2009
12-01-2010
10-12-2009

da 22, 12, 10 er dagnummer i faldende orden.

Har du lavet formatteringen om fra %Y-%m-%d for nylig?

ellers prøv med ORDER BY datetime desc
Avatar billede g1mzee Nybegynder
13. januar 2010 - 12:10 #7
Nu har jeg kun lige skimtet det meste igennem, men jeg vil mene at du skal bruge et timestamp. Og så når du hiver det ud lav det på den måde du vil have det i det pågivende tilfælde. Da timestamp kan tjekkes op mod et andet timestamp (en anden dato). Og det er uformateret, og kan bruges hvordan man har lyst.
Avatar billede Frederik Nybegynder
16. januar 2010 - 13:23 #8
Tjens

Det virkede ved at skrive ORDER BY datetime desc istedet for  ORDER BY dato desc, så det er bare helt super!

Smid et svar så du kan få dine point :)

I andre skal også have tusind tak for kommentarerne :)


- Frederik
Avatar billede tjens Nybegynder
16. januar 2010 - 20:12 #9
Svar
Avatar billede repox Seniormester
16. januar 2010 - 20:33 #10
For egen udviklings skyld, så vil jeg gerne vide hvad det var der gjorde min besvarelse i #4 uforståelig?
Avatar billede Frederik Nybegynder
17. januar 2010 - 11:42 #11
repox, jeg kan godt se nu, at du egentlig svarede det samme, men jeg er ikke så meget inde i php, så det at tjens skrev at jeg skulle prøve at skrive ORDER BY datetime i stedet for ORDER BY dato gjorde at jeg forstod hvad der skulle rettes.. Men deler gerne point hvis der er? Du kom jo egentlig med besvarelsen først..?
Avatar billede repox Seniormester
17. januar 2010 - 16:56 #12
Næ, du har jo trods alt argumenteret for at jeg ikke løste dit problem - at min besvarelse først giver mening efter udredningen fra tjens er trods alt ikke dit problem.
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