fout herstellen: Warning: A non-numeric value encountered in

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

J opla

j opla

30/01/2018 16:03:06
Quote Anchor link
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 :-)

regel waar de fout zich voor doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?      $timeNow = time() + ($this->VARS['offset']*3600);[/code] ?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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']);
?>


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?      $timeNow = time() + (date_default_timezone_set($this->VARS['offset'])*3600); ?>

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
 
PHP hulp

PHP hulp

26/11/2024 16:31:24
 
Thomas van den Heuvel

Thomas van den Heuvel

30/01/2018 16:40:44
Quote Anchor link
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?

EDIT: nu ik er over nadenk, dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$timeNow
= time() + ($this->VARS['offset']*3600);
?>

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
 
J opla

j opla

30/01/2018 16:48:14
Quote Anchor link
Hoi Thomas,

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
* ----------------------------------------------


Inderdaad, omdat iets werkt maakt het nog niet goed.
Maar lijkt de door mij voorgestelde verbetering correct? Of denk je van niet?
 
Ben van Velzen

Ben van Velzen

30/01/2018 17:00:10
Quote Anchor link
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.
Gewijzigd op 30/01/2018 17:01:44 door Ben van Velzen
 
Thomas van den Heuvel

Thomas van den Heuvel

30/01/2018 17:02:14
Quote Anchor link
Uhhhh... Het hangt er helemaal vanaf hoe die $timeNow verder gebruikt wordt.

Maar kijk nog eens naar je aanpassing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$timeNow
= time() + (date_default_timezone_set($this->VARS['offset'])*3600);
?>

Je stelt daar een tijdszone in terwijl je een tijdszone aanpast :/.

Je moet het als volgt zien:
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
<?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 />';
?>

Dit levert bijvoorbeeld het volgende op:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
J opla

j opla

30/01/2018 21:52:42
Quote Anchor link
@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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
   $timeNow
= time() + ($this->VARS['offset']*3600);
   $serverTime = time();
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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 :-)
Gewijzigd op 30/01/2018 21:57:19 door j opla
 



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.