Permalänk
Medlem

[MOSMS] Få tag i priset

Förstår inte detta riktigt, när jag kör SMS-simulatorn så är tariff alltid 0 i resultatet, blir det likadant om någon SMS:ar?
Om jag gör så här:

if($tariff == 0) { echo '0 kr'; }

Så fungerar det ju självklart.

<?php // Stäng av PHP:s felrapportering error_reporting(0); // Plocka ut avsändarnumret $nr = $_REQUEST['nr']; // Plocka ut SMS-meddelandet $sms = urldecode($_REQUEST['sms']); // Plocka ut priset slutanvändaren blev debiterad (för egen vinststatistik) $tariff = $_REQUEST['tariff']; // Plocka ut operatören SMS:et skickades in via (för egen vinststatistik) $operator = $_REQUEST['operator']; if($tariff == 190) { echo '190 kr'; } else if($tariff == 200) { echo '200 kr'; } ?>

Permalänk
Medlem

Nu var det länge sen, men du skulle kunna prova:

// Plocka ut priset slutanvändaren blev debiterad (för egen vinststatistik) (int)$tariff = $_REQUEST['tariff'];

Det tvingar variabled $tariff att räknas som en siffra.

En annan lösning är att behandla det som en sträng: (ej rekommenderat)

if($tariff == "190") { echo '190 kr'; }

Eftersom jag satte hartassar runt siffran är det inte längre en siffra utan en sträng med "bokstäver".

Permalänk
Hedersmedlem
Skrivet av Ernesto:

Nu var det länge sen, men du skulle kunna prova:

// Plocka ut priset slutanvändaren blev debiterad (för egen vinststatistik) (int)$tariff = $_REQUEST['tariff'];

Det tvingar variabled $tariff att räknas som en siffra.

En annan lösning är att behandla det som en sträng: (ej rekommenderat)

if($tariff == "190") { echo '190 kr'; }

Eftersom jag satte hartassar runt siffran är det inte längre en siffra utan en sträng med "bokstäver".

PHP är så "slappt" att saker som:

$ php -r '$a = 50; if ($a == "50") echo "OK\n"; else echo "--\n";' OK $ php -r '$a = "50"; if ($a == 50) echo "OK\n"; else echo "--\n";' OK $ php -r '$a = "50"+1; if ($a == 51) echo "OK\n"; else echo "--\n";' OK

alla fungerar. Vill man inkludera datatyp i jämförelsen så får man använda operatorn `===':

$ php -r '$a = 50; if ($a === "50") echo "OK\n"; else echo "--\n";' -- $ php -r '$a = "50"; if ($a === 50) echo "OK\n"; else echo "--\n";' -- $ php -r '$a = "50"+1; if ($a === 51) echo "OK\n"; else echo "--\n";' OK

I sista fallet ser vi att `"50"+1`, dvs additionen av en sträng och en `int`, automatiskt konverteras till en `int`.

Att `$tariff` alltid är "== 0" för trådskaparen är troligen för att den får det booleanska värdet `False`, alternativt `NULL`, som evaluerar till just `0`:

$ php -r '$a = False; if ($a === 0) echo "OK\n"; else echo "--\n";' -- $ php -r '$a = False; if ($a == 0) echo "OK\n"; else echo "--\n";' OK $ php -r '$a = NULL; if ($a == 0) echo "OK\n"; else echo "--\n";' OK

Att `$tariff` är `False` skulle kunna tyda på att anropet misslyckats, och/eller så är `$_REQUEST['$tariff']` helt enkelt inte satt, och då returneras `NULL`. Använd exempelvis `var_dump()` för att få full koll på vad som gömmer sig i en variabel:

$ php -r '$a = False; var_dump($a);' bool(false)

Notera alltså hur PHP hanterar ett index som inte existerar:

$ php -r '$a = []; if ($a["tariff"] == 0) echo "OK\n"; else echo "--\n";' PHP Notice: Undefined index: tariff in Command line code on line 1 OK

Har man inte aktiverat alla varningar (se `error_reporting`) så får man inte ens en "PHP notice", och PHP tolkar alltså ett icke-existerande vektorindex som `NULL`, vilket också är `0`:

$ php -r '$a = []; var_dump($a["tariff"]);' PHP Notice: Undefined index: tariff in Command line code on line 1 NULL

Kort sagt, så om man vill göra jämförelser där `False` och `NULL` kan ha oväntade följder, vilket gäller hyfsat ofta, så får man se till att få koll på `===`. Mer information om hur PHP använder `==` och `===` (och varianter som `!==`, etc.) finns i manualen.

En relaterad vanlig fälla är hur strängen "0" hanteras: vad ger egentligen `empty("0")`?

Skrivet av Rick21:

// Stäng av PHP:s felrapportering error_reporting(0);

Det låter som en dålig idé under utvecklingsarbetet. Stäng av det när tjänsten är "live" för all del, men under utvecklingen är det ju ovärderlig information i felrapporter och varningar. Tanken är inte att detta ska användas för att få PHP att "hålla tyst" om en massa saker för sakens skull, utan man bör i vilket fall lösa alla varningar och fel innan koden körs skarpt.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.