fout herstellen: Warning: A non-numeric value encountered in
Door
j opla
op 30-01-2018 16:03
gewijzigd op 30-01-2018 16:17
5.574 views
Beste mensen,
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 :-)
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:
<?
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.
Simpelweg omdat iets werkt, maakt het nog niet juist.
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?
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?
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:
* ----------------------------------------------
* 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?
Nee, dat werkt niet. Ik denk niet alleen van niet, het is nogal dom dat je zelf niet ziet dat dat niet kan. Het slaat ook de terechte opmerkingen van Thomas in de wind. date_default_timezone_set heeft geen resultaat, en daar iets bij optellen is zachtgezegd onzinnig. Flikker dit script gewoon weg en download iets dat recenter is.
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
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).
@Ben: dank je voor je waardevolle en constructieve bijdrage. Dat ik dom ben wat betreft programmeren wist ik al. Daarom stel ik ook vragen op dit forum om iets slimmer te worden.
@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
<? ($this->VARS['offset']*3600); >?
vraag, dan krijg ik een output van "0".
Conclusie, maar als ik het verkeerd heb dan hoor ik dat graag, $timeNow = time(); 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 :-)