PHP en 0 of null

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Core2016
  • Registratie: Oktober 2017
  • Laatst online: 12-11-2021
Hoi,
Hoe edit je een title? Want 3 x ! is ook weer iets te veel van het goede. Goed: Het volgende.

Er draait in this case een pfsense instance met een script die me mogelijk maakt om van de netwerken die er zijn een in en out kbps rate te geven doormiddel van json zodat ik die kan gebruiken waar nodig.

Ik heb een class gemaakt die me mogelijk maakt json te ‘parsen’ zodat ik met een getter op een (‘url/based’) manier de value kan pakken van wat is gegeven.
Voorbeeld:
code:
1
$json = Json::load( 'https://pfsense.home/homekit_bott.php?key=SuperSecretPfsenseKey&rates=1' , false );


Als ik dan een
code:
1
$json->get()

uitvoer krijg ik alles wat ik verwacht:
code:
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
38
39
40
41
42
43
44
45
46
 <?php  = stdClass::__set_state(array(
   'lan' => 
  stdClass::__set_state(array(
     'inKbps' => 0,
     'outKbps' => 4.057213389252503,
     'interface' => 'hn1',
  )),
   'opt6' => 
  stdClass::__set_state(array(
     'inKbps' => 0,
     'outKbps' => 0,
     'interface' => 'ovpns2',
     'friendlyiface' => 'opt6',
     'name' => 'GUEST_ACCESS_BLABLA',
     'monitorip' => '10.10.10.0,
     'sourceip' => '10.0.0.1',
     'delay' => '0.047ms',
     'loss' => '0.0%',
  )),
   'wan' => 
  stdClass::__set_state(array(
     'inKbps' => 0,
     'outKbps' => 0,
     'interface' => 'hn0',
     'friendlyiface' => 'wan',
     'name' => 'HN0_WAN_DHCP',
     'status' => 'okay',
     'monitorip' => 'x.x.x.x',
     'sourceip' => 'x.x.x.x',
     'delay' => '1.622ms',
     'loss' => '0.0%',
  )),
   'opt5' => 
  stdClass::__set_state(array(
     'inKbps' => 0,
     'outKbps' => 0,
     'interface' => 'ovpns1',
     'friendlyiface' => 'opt5',
     'name' => 'PRIVATE_ACCESS_VPNV4',
     'status' => 'okay',
     'monitorip' => '12.12.12.12',
     'sourceip' => '12.12.12.1',
     'delay' => '0.047ms',
     'loss' => '0.0%',
  )),
)); ?>


Door de getter in de json class is het mogelijk om zo dingen te pakken:
code:
1
$json->get(‘wan/monitorip’);


Dit geeft dan 'x.x.x.x';
Als ik het hele wan gebeuren wil hebben doe ik :

code:
1
$json->get(‘wan’);


Dit geeft dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php  = stdClass::__set_state(array(
   'inKbps' => 0,
   'outKbps' => 0,
   'interface' => 'hn0',
   'friendlyiface' => 'wan',
   'name' => 'HN0_WAN_DHCP',
   'status' => 'okay',
   'monitorip' => 'x.x.x.x',
   'sourceip' => 'x.x.x.x',
   'delay' => '1.631ms',
   'loss' => '0.0%',
)); ?>


Oke dit werkt allemaal. Het volgende.
Ik wil nu de outKbps hebben:
code:
1
$json->get(‘wan/outKbps’);


Dan word er niets gegeven, het is 0…. De outKbps kan 0 zijn, en die 0 is nodig voor de grafieken.

De bedoeling is dat
code:
1
$json->get(‘wan/outKbps’);
0 geeft, en dat doet het ook.

Het is 0.

En daar gebeurt iets wat ik niet begrijp.
De result geeft 0, de value van de get is 0 en die 0 wil ik weergeven. Het is pvd 0....

Maar omdat het 0 is krijg je niets, geen errors, heulemaal niets!!!
frustrating!

Hoe krijg ik het voor elkaar dat als de value = 0, het toch als 0 weergeven word?

Nogmaals ik krijg 0 als ik het echo, Ik snap er niets meer van. Hier een video voor de visueel ingestelde mensen: *snip* ja, nee, doei, zo werkt 't hier niet. Je kunt gewoon relevante code plaatsen in dit topic.

Ik weet dat het tijd is om te stoppen maar kan iemand me hier mee helpen?

[ Voor 4% gewijzigd door RobIII op 22-04-2020 00:55 ]

Beste antwoord (via Core2016 op 22-04-2020 23:52)


  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

Core2016 schreef op dinsdag 21 april 2020 @ 23:59:
maar

code:
1
$result = $json->get('wan/outKbps')


geeft 0 en omdat 0 wel iets zou moeten zijn?
Doe na die regel eens
code:
1
var_dump($result);

en zeg eens wat daar uit komt? Verder is je vraag in het Nederlands ook niet echt te begrijpen.

[ Voor 9% gewijzigd door DataGhost op 22-04-2020 00:55 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • SnakeSolidNL
  • Registratie: December 2012
  • Laatst online: 18-09 15:24
Wat als je het volgende doet:

$json->get(‘wan/outKbps’) ?? 0;

Of

$data = (int)$json->get('wan/Kbps');

[ Voor 29% gewijzigd door SnakeSolidNL op 21-04-2020 23:50 ]


Acties:
  • 0 Henk 'm!

  • Core2016
  • Registratie: Oktober 2017
  • Laatst online: 12-11-2021
Met de eerste blijft het 0.
En met de (int) word het een 1 en blijft het 1.

Als ik de 'wan' pak krijg ik een object met daarin outKbps dat 0 is en dat is te gebruiken.
Dus:
code:
1
$result = $json->get('wan')

geeft
code:
1
2
3
4
5
6
7
8
9
10
11
12
  stdClass::__set_state(array(
     'inKbps' => 0,
     'outKbps' => 0,
     'interface' => 'hn0',
     'friendlyiface' => 'wan',
     'name' => 'HN0_WAN_DHCP',
     'status' => 'okay',
     'monitorip' => 'x.x.x.x',
     'sourceip' => 'x.x.x.x',
     'delay' => '1.622ms',
     'loss' => '0.0%',
  ),


maar

code:
1
$result = $json->get('wan/outKbps')


geeft 0 en omdat 0 wel iets zou moeten zijn?

Omdat het 0 is. dumpt er niets. en als het echoed word dan is het wel 0.
Elke keer als er een waarde word opgevraagd door iets in het netwerk en het is 0 dan is er niets.


Maar als ik direct de outKbps pak, thus: ->get('wan/outKbps'). Dat kan 0 zijn en als het 0 is. Dan is er niets thus errors.

[ Voor 11% gewijzigd door Core2016 op 22-04-2020 00:11 ]


Acties:
  • 0 Henk 'm!

  • SnakeSolidNL
  • Registratie: December 2012
  • Laatst online: 18-09 15:24
En als je dit doet:

$data = $json->get('wan);

$out = $data->outKbps;
Of
$out = (int)$data->outKbps;
Of
$out = $data->outKbps ?? 0;

Acties:
  • +1 Henk 'm!

Verwijderd

Wat bedoel je met 'dumpt er niets'?

Als ik het zo lees werkt je json getter prima. Je schrijft dat je consistent de waarde 0 krijgt (dus geen null waarde als in niet geset)

Probleem lijkt me in de manier van 'dumpen' liggen. Die code zie ik niet. Gok dat daar een verkeerde test op null waarde in zit.

Het casten naar een int is overigens niet zinvol. In de dump staat een 0 zonder quotes, het is dus al een integer.

[ Voor 6% gewijzigd door Verwijderd op 22-04-2020 00:39 ]


Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Core2016 schreef op dinsdag 21 april 2020 @ 23:28:
Hoe edit je een title? Want 3 x ! is ook weer iets te veel van het goede.
"Help mij" hoeft anders ook niet.

Verder: ik kan er geen touw aan vast knopen, je roept consistent overal 0 waar ik 0 en null zou verwachten in je verhaal :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

Verwijderd

In je video zie ik ergens de functie 'empty' voorbij flitsen. Die geeft TRUE als je er de waarde 0 in stopt.

https://www.php.net/manual/en/function.empty.php

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

Core2016 schreef op dinsdag 21 april 2020 @ 23:59:
maar

code:
1
$result = $json->get('wan/outKbps')


geeft 0 en omdat 0 wel iets zou moeten zijn?
Doe na die regel eens
code:
1
var_dump($result);

en zeg eens wat daar uit komt? Verder is je vraag in het Nederlands ook niet echt te begrijpen.

[ Voor 9% gewijzigd door DataGhost op 22-04-2020 00:55 ]


Acties:
  • 0 Henk 'm!

  • Core2016
  • Registratie: Oktober 2017
  • Laatst online: 12-11-2021
Mijn excuus voor de frustratie op deze manier over te brengen. Ik denk echt dat het gister veel te laat is geworden. Ik had heel deze post niet moeten maken.

Het werkt dus wel als verwacht. Alleen om een of andere reden bleef het hangen? Ik heb de webserver eens opnieuw opgestart. En nu werkt het zoals verwacht.

de get('lan/outKbps'); geeft nu de 0, ook als ik het dump, print_r of echo. Super bedankt iig en ik zal de volgende keer maar eerst eens een nachtje gaan slapen alvorens een post te maken.

Acties:
  • +2 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 03-10 22:00
Gisteren gaf je ->get('whatever') een object terug. Als je een object evalueert naar een boolean, dan is dat true. En daarom wordt het een 1 als je het evalueert naar een int.

Daarbij is var_dump() trouwens je vriend. Als je het resultaat van die ->get() het ge-var_dump()'ed dan had je gezien waar je mee werkte, en zou je door gehad hebben dat waar jij mee dacht te werken niet hetgeen is waar PHP mee werkte.

Da's niet erg, weet je weer voor de volgende keer :)

[ Voor 45% gewijzigd door Freeaqingme op 22-04-2020 17:11 ]

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.

Pagina: 1