time ago functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donald Boers

Donald Boers

30/10/2016 21:36:20
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$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
 
PHP hulp

PHP hulp

23/11/2024 14:07:43
 
- Ariën  -
Beheerder

- Ariën -

30/10/2016 22:01:21
Quote Anchor link
Welke error?
 
Donald Boers

Donald Boers

30/10/2016 22:29:46
Quote Anchor link
- Ariën - op 30/10/2016 22:01:21:
Welke error?

Ik krijg alleen het woord error te zien. Is AJAX gerelateerd
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
error: function(XMLHttpRequest, textStatus, errorThrown){
      addmsg("error", textStatus + " (" + errorThrown + ")");
      setTimeout(waitForMsg,15000);
}

Geen idee hoe ik kan zien hoe de fout gegenereerd wordt
 
Ben van Velzen

Ben van Velzen

30/10/2016 22:34:41
Quote Anchor link
Je kunt de pagina toch rechtstreeks opvragen? Of even in je developer console kijken?
 
Donald Boers

Donald Boers

30/10/2016 22:57:07
Quote Anchor link
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>
 
- SanThe -

- SanThe -

30/10/2016 23:29:58
Quote Anchor link
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.)
 
Ben van Velzen

Ben van Velzen

30/10/2016 23:58:17
Quote Anchor link
Correct.
<mierenneukmodus>
het is sent en niet sended
</mierenneukmodus>
 
Ivo P

Ivo P

31/10/2016 00:50:44
Quote Anchor link
waarom niet mysql vast laten bepalen hoe lang geleden het was?
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_datediff

of anders php's eigen functies gebruiken ipv die zelf na te bouwen
http://php.net/manual/en/datetime.diff.php
 
Pg Vincent

Pg Vincent

31/10/2016 09:54:24
Quote Anchor link
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.
 
Donald Boers

Donald Boers

31/10/2016 10:28:59
Quote Anchor link
- 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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$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
Gewijzigd op 31/10/2016 10:32:59 door Donald Boers
 
Pg Vincent

Pg Vincent

31/10/2016 11:08:21
Quote Anchor link
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?
 
Ivo P

Ivo P

31/10/2016 12:12:09
Quote Anchor link
$message_list{0}

of

$message_list[0]
?

(eerlijk gezegd heb ik geen idee of {0} nog een geldige syntax is voor het aanduiden van een array-element. Volgens mij ben ik al van na de tijd dat het met [ ] gedaan werd.) (heb het dan niet over het aanwijzen van een karakter in een string)
 
Donald Boers

Donald Boers

31/10/2016 12:14:47
Quote Anchor link
Pg Vincent op 31/10/2016 11:08:21:
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?


Hoi. De functie die ik gebruik staat in mijn openings- bericht en heb ik gevonden op een forum (mijn eigen math skills zijn niet zo best helaas ). De datem staat als timestamp in de database
 
Ivo P

Ivo P

31/10/2016 12:17:06
Quote Anchor link
blijkt nog in de manual te staan:

Quote:
Note:
Both square brackets and curly braces can be used interchangeably for accessing array elements (e.g. $array[42] and $array{42} will both do the same thing in the example above).


Toevoeging op 31/10/2016 12:20:16:

"De datem staat als timestamp in de database"

"timestamp" is een algemene aanduiding.

Kan van zichzelf al het aantal seconden sinds 1970 zijn, maar ook ook 20161031121800 of 2016-10-31 12:18:00

Wat zit er uiteindelijk in $ptime en welke "string" in $message_list{0}['sended'] daarvoor?

48 jaar is wel een vreemde.
46 of 47 jaar zou ik begrijpen als $ptime 0 is
 
Donald Boers

Donald Boers

31/10/2016 13:01:48
Quote Anchor link
Hoi Ivo P. De timestamp staat als volgt in de database:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2016-10-30 09:06:46


Dan heb ik tevens nog een vraag over de dubbele brackets. Daar het om meerdere berichten gaat moet dan de waarde van sended niet uit een loop komen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$message_list = $this->messages->get_messages();

foreach ($message_list as $value){
    $sended = $value['verzonden'];
}
$time_ago     = $this->messages->get_timeago(strtotime($sended));

Niet zeker maar anders krijgt ieder bericht dezelfde waarde toch?

Alvast bedankt
 
Ivo P

Ivo P

31/10/2016 13:06:57
Quote Anchor link
debuggen:

om te beginnen kijken wat er in $message_list zit.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$message_list
= $this->messages->get_messages();
        echo 'regel: ' . __LINE__ . ' in file ' . __FILE__;
        printf('<pre>%s</pre>', print_r($message_list, 1));

$t = strtotime($message_list{0}['sended']
        echo 'regel: ' . __LINE__ . ' in file ' . __FILE__;
        printf('<pre>%s</pre>', print_r($t, 1));

$time_ago     = $this->messages->get_timeago($t));
$messages_html  = new View('/users/partials/message_list.php', compact('message_list', 'time_ago'));
?>


En als dat nog niet duidelijkheid geeft, ga je in de functie get_timeago() verder zoeken wat daar dan mis gaat.
 
Donald Boers

Donald Boers

31/10/2016 13:49:12
Quote Anchor link
Hoi Ivo. Als ik dit gebruik krijg ik de volgende fout
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
error: syntax error, unexpected 'echo' (T_ECHO)

hetgeen deze regel is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo 'regel: ' . __LINE__ . ' in file ' . __FILE__;
 
Ivo P

Ivo P

31/10/2016 13:54:13
Quote Anchor link
een ) en ; achter mijn regel 6
 
Donald Boers

Donald Boers

31/10/2016 14:01:26
Quote Anchor link
Ok ik krijg geen fout meer waar moet ik op letten?
 
Ivo P

Ivo P

31/10/2016 14:03:45
Quote Anchor link
je krijgt als het goed is een aantal regels met de opmerking om welke regel het gaat en daarna een dump van de variabelen.

Roep je dit via ajax aan? Roep dan rechtstreeks die url aan, zodat je het op je scherm ziet, of kijk middels Firebug oid. wat het resulaat is van je aanroep.
 
Donald Boers

Donald Boers

31/10/2016 15:22:07
Quote Anchor link
Hoi Ivo. Dit is wat ik krijg als ik rechtstreeks de Controller aanroep

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    [0] => Array
        (
            [message] => Lorem Ipsum is slechts een proeftekst uit het drukkerij- en zetterijwezen. Lorem Ipsum is de standaard proeftekst in deze bedrijfstak sinds de 16e eeuw
            [0] => Lorem Ipsum is slechts een proeftekst uit het drukkerij- en zetterijwezen. Lorem Ipsum is de standaard proeftekst in deze bedrijfstak sinds de 16e eeuw
            [sended] => 2016-10-30 09:06:46
            [1] => 2016-10-30 09:06:46
            [username] => josje_79
            [2] => josje
            [age] => 37
            [3] => 37
        )

    [1] => Array
        (
            [message] => Lorem Ipsum is slechts een proeftekst uit het drukkerij- en zetterijwezen. Lorem Ipsum is de standaard proeftekst in deze bedrijfstak sinds de 16e eeuw
            [0] => Lorem Ipsum is slechts een proeftekst uit het drukkerij- en zetterijwezen. Lorem Ipsum is de standaard proeftekst in deze bedrijfstak sinds de 16e eeuw
            [sended] => 2016-10-31 12:30:37
            [1] => 2016-10-31 12:30:37
            [username] => chrissie
            [2] => chrissie
            [age] => 34
            [3] => 34
        )


Toevoeging op 31/10/2016 21:16:43:

Ik heb een werkelijk te gekke class gevonden die precies doet waar ik naar op zoek was en die ook heel makkelijk i te implementeren, Voor diegene die op zoek zijn naar een zelfde soort functie, hier is de link:

https://www.developphp.com/video/PHP/Convert-MySQL-Timestamp-to-Ago-Time-Format-OOP-Tutorial
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.