fout herstellen: Warning: A non-numeric value encountered in
Op mijn site heb ik een gastenbook met een extern script. Nu ik over wil van php 7.0 naar 7.1 geeft dat een foutmelding: Warning: A non-numeric value encountered in
Helaas is de site van de ontwikkelaar uit de lucht, dus daar kan ik de vraag niet meer stellen, daarom probeer ik het zelf.
Als ik op internet lees, dan heeft het te maken met dat er kennelijk een niet nummerieke waarde wordt gebruikt in de code. Maar ja welke waarde is dan niet nummeriek :-)
regel waar de fout zich voor doet:
Volgens mij geeft time() een integer terug, in het aantal seconden sinds 1 januari 1970.
$this->VARS['offset'] wordt volgens mij gevormd door eerdere code:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?
function getVars()
{
global $_COOKIE, $laz_build;
$this->VARS = $this->fetch_array($this->query('SELECT * FROM '.LAZ_TABLE_PREFIX.'_config'));
$this->free_result($this->result);
date_default_timezone_set($this->VARS['offset']);
?>
function getVars()
{
global $_COOKIE, $laz_build;
$this->VARS = $this->fetch_array($this->query('SELECT * FROM '.LAZ_TABLE_PREFIX.'_config'));
$this->free_result($this->result);
date_default_timezone_set($this->VARS['offset']);
?>
Nu vroeg ik me af of date_default_timezone_set($this->VARS['offset']) inderdaad een waarde toe kent aan de variabele $this->VARS['offset'] en zo ja, welke entiteit heeft die waarde dan? en hoe maak ik er een integer van, want dat moet waarschijnlijk.
update:
nog even getest:
$this->VARS['offset'] heeft de waarde: Europe/Amsterdam. Niet echt een integer.
date_default_timezone_set($this->VARS['offset']) heeft de waarde: 1.
Als ik de eerstgenoemde code nu wijzig in:
Zou dit dan doen wat het moet doen? het geeft in ieder geval geen foutmeldingen :-)
Andere ideeën zijn ook welkom :-)
Dank voor een reactie
Gewijzigd op 30/01/2018 16:17:45 door J opla
Waarschijnlijk is dit ook niet juist.
Het hangt er vanaf in welke tijdszone je werkt / zaken opslaat, deze kan verschillen van de tijdszone waarin je vervolgens tijden weergeeft.
time() retourneert de UNIX-timestamp. Deze timestamp hééft al een tijdszone, namelijk UTC (of GMT). Daarnaast opereren de meeste datum- en tijdsfuncties al vanuit UTC, waarbij vertalingen naar andere tijdszones automatisch worden gemaakt. Tijd optellen bij zo'n timestamp (en bij gebruikmaking van die functies) is dus bijna in alle gevallen fout.
De UNIX-timestamp zelf hoeft eigenlijk nooit aangepast te worden, enkel de tijdszone waarin je opereert, en dat dus gaat niet over opgeslagen waarden, maar enkel over een aangepaste weergave van die zelfde, onveranderde data.
Enne... global $_COOKIE... ($_COOKIE is al een superglobal!) Hoe oud is die code?
EDIT: nu ik er over nadenk, dit:
Kan dus eigenlijk van zichzelf al niet kloppen, immers, je past daar een UNIX-timestamp aan :/. Begreep de maker het principe van UTC-functies zelf wel?
Gewijzigd op 30/01/2018 16:43:24 door Thomas van den Heuvel
Dank je voor je reactie.
Om met het laatste te beginnen, de code is nogal oud, ik heb hem al een paar jaar op mijn website staan. Ik zou een ander gastenboek moeten maken, maar ja, tijd, omzetten en zo, weerhoudt me er van. Het originele script is van 2001, de laatste aanpassing van de betreffende file is van 2016:
Quote:
* ----------------------------------------------
* Lazarus Guestbook
* by Stewart Souter
* URL: www.carbonize.co.uk
* Based on Advanced Guestbook 2.3.x (PHP/MySQL)
* Copyright (c)2001 Chi Kien Uong
* URL: https://www.proxy2.de
* Last Modified: Wed, 17 February 2016 19:59:38 GMT
* ----------------------------------------------
* Lazarus Guestbook
* by Stewart Souter
* URL: www.carbonize.co.uk
* Based on Advanced Guestbook 2.3.x (PHP/MySQL)
* Copyright (c)2001 Chi Kien Uong
* URL: https://www.proxy2.de
* Last Modified: Wed, 17 February 2016 19:59:38 GMT
* ----------------------------------------------
Inderdaad, omdat iets werkt maakt het nog niet goed.
Maar lijkt de door mij voorgestelde verbetering correct? Of denk je van niet?
Gewijzigd op 30/01/2018 17:01:44 door Ben van Velzen
Maar kijk nog eens naar je aanpassing:
Je stelt daar een tijd
Je moet het als volgt zien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$time = time(); // UNIX timestamp
$timeZone = date_default_timezone_get();
echo 'current timezone: '.$timeZone.'<br />';
echo 'current time: '.date('Y-m-d H:i:s', $time).'<br />';
echo 'timestamp: '.$time.'<hr />';
// timezones, @see http://php.net/manual/en/timezones.php
date_default_timezone_set('America/Los_Angeles');
$timeZone = date_default_timezone_get();
echo 'current timezone: '.$timeZone.'<br />';
echo 'current time: '.date('Y-m-d H:i:s', $time).'<br />';
echo 'timestamp: '.$time.'<hr />';
?>
$time = time(); // UNIX timestamp
$timeZone = date_default_timezone_get();
echo 'current timezone: '.$timeZone.'<br />';
echo 'current time: '.date('Y-m-d H:i:s', $time).'<br />';
echo 'timestamp: '.$time.'<hr />';
// timezones, @see http://php.net/manual/en/timezones.php
date_default_timezone_set('America/Los_Angeles');
$timeZone = date_default_timezone_get();
echo 'current timezone: '.$timeZone.'<br />';
echo 'current time: '.date('Y-m-d H:i:s', $time).'<br />';
echo 'timestamp: '.$time.'<hr />';
?>
Dit levert bijvoorbeeld het volgende op:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
current timezone: Europe/London
current time: 2018-01-30 15:58:33
timestamp: 1517327913
****************************************
current timezone: America/Los_Angeles
current time: 2018-01-30 07:58:33
timestamp: 1517327913
current time: 2018-01-30 15:58:33
timestamp: 1517327913
****************************************
current timezone: America/Los_Angeles
current time: 2018-01-30 07:58:33
timestamp: 1517327913
Dus ondanks het feit dat je verandert van tijdszone blijft $time hetzelfde. Dit werkt omdat functies zoals date() en time() altijd rekenen met UTC als uitgangspunt. UNIX-timestamps dienen dus eigenlijk nooit aangepast te worden - wat je aanpast is de tijdszone en deze is vaak afhankelijk van (de tijdszone waarin) de gebruiker (zich bevindt).
Gewijzigd op 30/01/2018 17:16:38 door Thomas van den Heuvel
@Thomas:
Dank je voor je input. Ik weet niet helemaal wat ze precies wilden bereiken met dit deel van het script. Ik denk dat ze iets wilden met servertijd en de tijd van de bezoeker als ik de volgende 2 regels zie:
Maar als ik jou begrijp, dan had het onderscheid niet gemaakt hoeven te worden. De waarde time() is in alle gevallen hetzelfde, het is de opmaak die het hem doet.
Maar jouw verhaal bracht me op iets anders. Want waarschijnlijk deed + ($this->VARS['offset']*3600) eerder al niet veel. Als ik de server weer op PHP 7.0 zet en
Code (php)
1
2
3
2
3
<? ($this->VARS['offset']*3600); >?[/code] vraag, dan krijg ik een output van "0".
Conclusie, maar als ik het verkeerd heb dan hoor ik dat graag, [u]$timeNow = time();[/u] geeft hetzelde resultaat van het script als in het verleden. Misschien doet het niet helemaal wat de makers bedoeld hebben. En misschien heb ik niet helemaal de goede tijd op het gastenboek, maar dat was het dan in het verleden ook niet :-)
Conclusie, maar als ik het verkeerd heb dan hoor ik dat graag, [u]$timeNow = time();[/u] geeft hetzelde resultaat van het script als in het verleden. Misschien doet het niet helemaal wat de makers bedoeld hebben. En misschien heb ik niet helemaal de goede tijd op het gastenboek, maar dat was het dan in het verleden ook niet :-)
Gewijzigd op 30/01/2018 21:57:19 door j opla