Ik heb een heel eenvoudig real time bericht systeem In de tabel berichten heb ik een rij verzonden in datetime format. In plaats van de datum naast een bericht te tonen wil ik graag de verlopen tijd tonen

Vooralsnog heb ik de volgende twee functies in mijn Model:

public function get_messages()
{
	$sql	=	"SELECT M.message
		              , M.sended
					  , U.username
				   FROM messages M
				   JOIN users U ON M.user_id = U.id";
				  
		$stmt	= $this->pdo->query($sql);
		
		return $stmt->fetchAll();
}

public function get_timeago( $ptime )
{
    $estimate_time = time() - $ptime;

    $condition = array( 
            12 * 30 * 24 * 60 * 60  =>  'jaar',
            30 * 24 * 60 * 60       =>  'maand',
            24 * 60 * 60            =>  'dag',
            60 * 60                 =>  'uur',
            60                      =>  'minuut',
            1                       =>  'seconde'
    );

    foreach( $condition as $secs => $str )
    {
        $d = $estimate_time / $secs;

        if( $d >= 1 )
        {
            $r = round( $d );
            return 'ongeveer ' . $r . ' ' . $str . ( $r > 1 ? 'en' : '' ) . ' geleden';
        }
    }
}


Vervolgens dacht ik het op de volgende manier in de Controller te kunnen gebruiken:

$message_list = $this->messages->get_messages();
$time_ago     = $this->messages->get_timeago(strtotime($message_list['sended']));


Maar maar de variabele $time_ago geeft me een error. Ziet iemand wat ik fout doe?

Alvast bedankt
Welke error?
- Ariën - op 30/10/2016 22:01:21

Welke error?

Ik krijg alleen het woord error te zien. Is AJAX gerelateerd

error: function(XMLHttpRequest, textStatus, errorThrown){
      addmsg("error", textStatus + " (" + errorThrown + ")");
      setTimeout(waitForMsg,15000);
}

Geen idee hoe ik kan zien hoe de fout gegenereerd wordt
Je kunt de pagina toch rechtstreeks opvragen? Of even in je developer console kijken?
Yes you're right. This is what I got

Undefined index: sended in C:\wamp64\www\U-dating\private\includes\classes\Controller\users\Berichten.php on line <i>8</i>
Ik neem aan dat get_messages() een array() met array()'s returned.
Dan gaat $message_list['sended'] niet werken.
Dat zou dan $message_list[0]['sended'] moeten zijn. (0, 1, 2 etc.)
Correct.
<mierenneukmodus>
het is sent en niet sended
</mierenneukmodus>
Ik heb in het verleden leuke resultaten gehad met de "Moment.js" library, dan kun je vanuit de database via AJAX gewoon de timestamp doorgeven en dan rekent Moment.js zelf uit hoe lang geleden dat is en giet dat in het formaat dat jij wilt.
- SanThe - op 30/10/2016 23:29:58

Ik neem aan dat get_messages() een array() met array()'s returned.
Dan gaat $message_list['sended'] niet werken.
Dat zou dan $message_list[0]['sended'] moeten zijn. (0, 1, 2 etc.)


Hoe kon ik zo stom wezen zeg, Hartelijk bedankt SanThe. Ik heb het in de Controller als volgt aangepast:


$message_list = $this->messages->get_messages();
$time_ago     = $this->messages->get_timeago(strtotime($message_list{0}['sended'])); 
$messages_html  = new View('/users/partials/message_list.php', compact('message_list', 'time_ago'));


Om te testen heb ik momenteel 1 bericht in de database staan waarbij dit de sended(datetime) de volgende waarde bevat 2016-10-30 14:06:46. Maar in plaats van 20 uur geleden als output is de output 48 jaar geleden :(

Geen idee hoe dat mogelijk is. Heeft iemand een idee waar het fout gaat?

Alvast bedankt

Wat trek je precies van elkaar af? Wat staat er in de database en waarom denk je dat je dat zomaar van time() af mag halen?

Reageren