time ago functie
Vooralsnog heb ik de volgende twee functies in mijn Model:
Code (php)
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
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';
}
}
}
{
$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)
1
2
2
$message_list = $this->messages->get_messages();
$time_ago = $this->messages->get_timeago(strtotime($message_list['sended']));
$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
Code (php)
1
2
3
4
2
3
4
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(waitForMsg,15000);
}
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?
Undefined index: sended in C:\wamp64\www\U-dating\private\includes\classes\Controller\users\Berichten.php on line <i>8</i>
Dan gaat $message_list['sended'] niet werken.
Dat zou dan $message_list[0]['sended'] moeten zijn. (0, 1, 2 etc.)
<mierenneukmodus>
het is sent en niet sended
</mierenneukmodus>
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
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.)
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)
1
2
3
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'));
$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
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?
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)
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
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).
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
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)
1
2
3
4
5
6
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));
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
om te beginnen kijken wat er in $message_list zit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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'));
?>
$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.
hetgeen deze regel is:
een ) en ; achter mijn regel 6
Ok ik krijg geen fout meer waar moet ik op letten?
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
)
(
[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