MySQL / PHP, veri çıkışı ile yardıma ihtiyacınız

5 Cevap php

Kodlar ve tarihleri: Tamam, ben 2 sütunlu bir liste tablo var.

Ben SON 25 görüntülemek VE onlar teslim edildi ne kadar önce kullanıcı söylemek istiyorum.

Bu nedenle, örneğin:

ABCDEF (1 Second Ago)
CCDEE (12 Seconds Ago)
329492 (45 Minutes Ago)

Ben bu kadar kazanılmış ettik:

$result = mysql_query("SELECT `code` FROM `fc` ORDER by datetime LIMIT 25") or die(mysql_error());

ama, ne istediğinizi yapmaz. Bu ters yapar. Bu ilk, son değildi girilen ne gösterir.

Benim çıkış bu gibi görünüyor:

$output .= "<li><a href=\"http://www.***=" . htmlspecialchars(urlencode($fetch_array["code"])) . "\" target=\"_blank\">" . htmlspecialchars($fetch_array["code"]) . "</a></li>";

Ben (beri zaman) parçası eklemek için nasıl hiçbir fikrim yok.

Yardım?

Teşekkürler :)

5 Cevap

ORDER BY datetime DESC diğer yönde sıralamak için düşünün.

SELECT listesi için datetime ekleyerek düşünün, böylece PHP gönderme tarihini erişebilirsiniz. Daha sonra geçerli tarih arasındaki farkı calculte PHP tarih / zaman işlevleri kullanabilirsiniz, ve tarih ilanı yayınlanmıştır ne kadar süre önce çalışmak için gönderdi.

Eklendi: kod biraz dostça bir biçimde mesaj beri süresini hesaplamak için.

$seconds = time() - strtotime($fetch_array["datetime"]);

if($seconds < 60)
    $interval = "$seconds seconds";
else
    if($seconds < 3600)
         $interval = floor($seconds / 60) . " minutes";
    else
        if($seconds < 86400)
             $interval = floor($seconds / 3600) . " hours";
        else
             $interval = floor($seconds / 86400) . " days";
 // You can keep on going

Sonunda $interval aralığının bir gösterimini içerir metinsel

Kullanmayı deneyin

order by datetime desc

Sonra PHP sorgudan döndürülen süresini azaltabilir, şimdiki zaman yakala, ve sonra SO question about relative time uygun birimlerde zaman görüntülemek için bu bir göz atın.

If I understand right the question the problem is that you don't specify the order of sort. If you want to obtain the latest posts you have to specify the descendant order.

$ Result = mysql_query veya (mysql_error ()) die ("code datetime DESC LIMIT 25 ile fc SİPARİŞ SEÇ");

Sipariş düzeltmek için:

"SELECT `code`, `datetime` FROM `fc` ORDER by datetime DESC LIMIT 25"

Zaman diff almak için böyle bir şey çalışması gerekir. Eğer, daha iyi yöntemler içine bu refactor "sihirli sayı" gibi (O da daha sofistike olmaya uzatılabilir) kaldırmak gerektiğini unutmayın:

function getTimeAgo ($dateTime) {
    $timestamp = new DateTime($dateTime);
    $currentTimestamp = new DateTime();

    $diff = $currentTimestamp->getTimestamp() - $timestamp->getTimestamp();

    if($diff < 0) {
        throw new Exception (__METHOD__ . ':parameter $dateTime can not be 
                                           in the future!');
    }
    if($diff < 60) {
       return "$diff seconds ago";
    }
    if($diff < 3600) {
       return $diff/60 . " minutes ago";
    }
    if($diff < 86400) {
       return $diff/3600 . " hours ago";
    }
}

Changing datetime order: Try DESC or ASC at the end of your ORDER BY. This should do the trick:

SELECT code
FROM fc
ORDER BY datetime DESC
LIMIT 25

Time since: Write or find a PHP function that converts MySQL datetime format to 'real English'. Here's a quick basic example:

<?php

// your code goes here
$timeStr = "2009-08-01 15:43:34";
$time = Sec2Time( time() - strtotime($timeStr) );
print_r($time);

// this converts mysql datetime into english
//   borrowed from http://ckorp.net/sec2time.php
function Sec2Time($time){
  if(is_numeric($time)){
    $value = array(
      "years" => 0, "days" => 0, "hours" => 0,
      "minutes" => 0, "seconds" => 0,
    );
    if($time >= 31556926){
      $value["years"] = floor($time/31556926);
      $time = ($time%31556926);
    }
    if($time >= 86400){
      $value["days"] = floor($time/86400);
      $time = ($time%86400);
    }
    if($time >= 3600){
      $value["hours"] = floor($time/3600);
      $time = ($time%3600);
    }
    if($time >= 60){
      $value["minutes"] = floor($time/60);
      $time = ($time%60);
    }
    $value["seconds"] = floor($time);
    return (array) $value;
  }else{
    return (bool) FALSE;
  }
}

?>

Ve çıktı:

Array ( [years] => 0 [days] => 4 [hours] => 5 [minutes] => 29 [seconds] => 38 )

Umut olur