[php] curl geen "non-numeric value"

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
ik kom iets heel stom tegen en ik geraak er niet uit....

ik heb een esp32 die als je naar het adres "http://10.0.2.172/?rw_put=hoogte" gaat dat die een nummer geeft (bv 193). Dit is de hoogte die de sensor meet.

Ik wil met die waarde in php rekenen, maar het lukt niet 8)7

De eerste test via "file_get_contents" gaat naar de verkeerde url? hij geeft de ?rw_put=hoogte niet door en komt dus op de algemene pagina van de esp terecht?

De tweede test via Curl geeft wel een waarde weer, maar ik kan die niet omzetten naar een getal?

De code :
code:
1
2
3
4
5
6
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://10.0.2.172/?rw_put=hoogte');
$result = curl_exec($ch);
curl_close($ch);


Als ik de waarde van $result via echo weergeef, dan geeft hij netjes de waarde weer (bv 193).
Als ik hiervan dan de intval($result) neem, dan geeft dit 0? 8)7 8)7
Ongetwijfel doe ik iets heel stoms?

Alle reacties


Acties:
  • +1 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 17:35

Reinier

\o/

https://www.php.net/manual/en/function.intval.php zegt "Strings will most likely return 0 "

Wat doet (int)$result?

Acties:
  • +1 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
var_export($result); zodat je ziet wat de variabele precies bevat, want het is blijkbaar niet een string met enkel digits.

{signature}


Acties:
  • +1 Henk 'm!

  • HenkEisDS
  • Registratie: Maart 2004
  • Laatst online: 28-09 19:15
Print_r($result);

Zit je niet gewoon met een array te pielen ipv een integer?

En anders zit er misschien wat witruimte die je weg kunt trimmen met trim();

Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
ik heb het inderdaad kunnen oplossen met (int)$result, bedankt!

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Strings als "foo" ja, strings als "193" horen gewoon 193 te geven. Dat is zo'n beetje het hele bestaansrecht van de intval functie...
Promy schreef op woensdag 29 mei 2024 @ 23:59:
ik heb het inderdaad kunnen oplossen met (int)$result, bedankt!
Nu ben ik toch heel benieuwd naar wat @Voutloos of @HenkEisDS suggesties gaven... Er zit geheid een BOM of e.o.a. non-printable character of iets dergelijks in de weg wat intval niet leuk vindt (maar wat casten naar int met (int)$result schijnbaar dan weer prima vindt :? ).

[ Voor 43% gewijzigd door RobIII op 30-05-2024 00:03 ]

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:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
@RobIII : dat is juist het rare hier: ik had beide suggesties tussen de code gezet en ze gaven op de terminal alle 2 gewoon die waarde weer. Zet ik die (int) ervoor dan geeft de rest van het programma wel mooi die waarde. Er moet inderdaad iets 8)7 zitten die een fout geeft...

Misschien als 2e vraag: die
code:
1
file_get_contents("http://10.0.2.172/?rw_put=hoogte");

is dat normaal dat die de reply van de
code:
1
file_get_contents("http://10.0.2.172/");
geeft? (en dus de ?rw_put=hoogte negeert?

Acties:
  • +1 Henk 'm!

  • remyz
  • Registratie: Februari 2010
  • Laatst online: 17:40
In de PHP-documentatie van de file_get_contents functie staat:
Note:
If you're opening a URI with special characters, such as spaces, you need to encode the URI with urlencode().
Misschien lost dat je probleem op?

Acties:
  • +1 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Promy schreef op donderdag 30 mei 2024 @ 18:07:
@RobIII : dat is juist het rare hier: ik had beide suggesties tussen de code gezet en ze gaven op de terminal alle 2 gewoon die waarde weer. Zet ik die (int) ervoor dan geeft de rest van het programma wel mooi die waarde. Er moet inderdaad iets 8)7 zitten die een fout geeft...
Nee, dat kan niet.

Óf je maakte initieel een foutje bij de intval() code, óf je kijkt niet goed naar de var_export output. Die output geeft bijvoorbeeld een stringlengte weer, en met 3 digits zou je 3 lang verwachten. ;)

Einde van de opties. Als je niet overtuigd bent, kom dan maar op met de output van var_export én de snippet met intval(), dan kunnen we uitleggen wat er aan de hand is.

{signature}


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
@Voutloos Tnx voor de reply. Het lijkt er op dat ik ergens een tikfout maakte ofzo (moeilijk terug te halen, gesaved toen het werkte :) - sorry daarvoor), maar nu werkt ook de intval :?
Ter volledigheid de output van deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://10.0.2.172/?rw_put=hoogte');
$result = curl_exec($ch);
curl_close($ch);

var_export($result);
print("\r\n");
$test = intval($result);
$test = $test -10;
print($test);


dit geeft
code:
1
2
'196'
186


@remyz : die had ik ook geprobeerd met volgende code
code:
1
2
3
$adres = urlencode("http://10.0.2.172/?rw_put=hoogte");
$test2 = file_get_contents($adres);
print($test2);


komt deze reactie:
code:
1
PHP Warning:  file_get_contents(http%3A%2F%2F10.0.2.172%2F%3Frw_put%3Dhoogte): failed to open stream: No such file or directory in /root/scriptsJS/hoogtetest_totaal.php on line 46


maar aangezien het werkt via curl ga ik niet verder zoeken op de file_get_contents

Acties:
  • +1 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat was meest waarschijnlijk, tikfoutje kan gebeuren. :)

Toch nog gratis uitleg laatste fout: Het encoden doe je om een goede url syntax te houden. Maar de :// en overige slashes horen natuurlijk wel gewoon in een url. ;)

[ Voor 5% gewijzigd door Voutloos op 30-05-2024 21:58 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
Bedankt

ivm dat laatste: die urlencode lukt me toch niet :) de fout is wel ietsje anders.
Als ik deze code gebruik waar ik het gewone adres eruit haal
code:
1
2
3
$adres = urlencode("?rw_put=hoogte");
$test2 = file_get_contents("http://10.0.2.172/" . $adres);
print($test2);

dan krijg ik volgende foutmelding
code:
1
2
PHP Warning:  file_get_contents(http://10.0.2.172/%3Frw_put%3Dhoogte): failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found
 in /root/scriptsJS/hoogtetest_totaal.php on line 38

Acties:
  • +1 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Die hele urlencode suggestie is niet nodig hier, de ? en = zijn ook gewoon onderdeel van normale url syntax. Met spaties bijv weer wel.

Dat gezegd hebbende, file_get_contents met een url wrapper is onderhevig aan diverse ini settings, edge cases en slecht te fine-tunen. Lekker curlen en doorrrr :)

{signature}


Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Ja en nee. Het hangt er maar net vanaf wat die server terug stuurt.
Dus gebruik iets als ctype_digit() om te controleren en log de error als het niet zo is.

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1 Henk 'm!

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 18-09 20:05
Volgens mij moet je die url_encode uitvoeren op elke value van een request parameter. In dit geval dus om "hoogte", maar dat heeft hier geen nut.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Acties:
  • +1 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 28-09 18:33
De parameters zijn nu prima. Als je rekening wilt houden met bijzondere tekens, dan moet je bedenken dat je niet de eerste bent en er waarschijnlijk een mooie functie voor bestaat. Bijvoorbeeld:

code:
1
2
3
4
5
6
7
8
9
10
11
12
$url = 'http://10.0.2.172/';
$params = array(
    'rw_put' => 'hoogte'
);
$queryString = http_build_query($params);
$url .= '?' . $queryString;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
Pagina: 1