21. maj 2005 - 21:20Der er
44 kommentarer og 1 løsning
Problemer med heltal!
Hej.
Jeg er igang med at lave en shop, hvor man skal kunne skrive antal i et textfelt. Der skal maximum kunne bestilles 300.
Jeg prøvede først at lave en if-sætning, hvor den tjekkede om min $_REQUEST["antal"] var over 0 og under 300, og ellers skulle der komme en fejl. Men den kunne ikke rigtig behandle min 'antal' som en integer, så prøvede jeg noget andet, hvor den køre en while-løkke op til 300 og hvor den så tjekkede hele tiden med en if-sætning om $i var ligemed $_REQUEST["antal"], hvis den så ikke havde fået en eneste positiv, så kom der fejl meddelse. Det virkede såmen fint nok, MEN der er et lille problem, for hvis jeg skriver "16sdf4f" i mit antal-felt (uden anførelsestegn selvfølgelig) så kunne den godt tilføje det til kurven, da if-sætningen så 16sdf4f som 16, så når min $i nåede op til 16 gav den positivt fra sig. Nogle der ved hvad jeg skal gøre? Enten en måde, så jeg kun kan skrive heltal i mit textfelt, og gøre så den ikke er under 1 og over 300, eller en idé til, hvordan jeg får min if-sætning til at være mere kritisk.
Håber der var nogle der forstod mig, det blev vidst lidt rodet, ellers må i lige spørge om flere detajler, eller en forenkelse. Hæver med glæde pointene!
if (is_numeric($Antal) { // Det er ikke nog med en test vha is_numeric // Den tillader nemlig også tal som "1e3". if (preg_match("/[1-9]\d{0,2}/", $Antal)) { if (0 < $Antal AND $Antal < 300) { // Lovlig værdi } else { $Lovlig = "NEJ"; }
2 sek, ser det er en stavefejl. Men nu har jeg rettet den, og kan se at den ikke virker optimal som nielle også skriver, da jeg skrev 1e3 tilføjede den 100 antal af varen, til min indkøbskurv. Men jeg prøver lige det script nielle har lavet.
Grunden til at "1e3" accepteres af is_numeric er at det faktisk er et lovligt tal. Det er "videnskabelig notation" (også kaldet "Euler notation" somme tider).
og det vil det også gøre ved det du lavede? Fordi så må det jo blive sådan, hvis det ikke kan være anderledes, folk må også kunne se, hvis der ligger 100 af en vare for meget i kurven.
Men jeg tester endnu, jeg tilpasser lige koden resten af min kode, da den er lidt kringlet.
Ved det ekstra tjek jeg har tilføjet - preg_match("/[1-9]\d{0,2}/", $Antal) - sikre man sig at set indtastede består af ét cifre mellem 1-9 og mellem 0-9. Dette tjek sikre altså at det der er indtastet er en af tallene '1', '2', ..., '999'.
Det ser ud til at virke nogenlunde, dog kan jeg godt tilføje varer med decimaler, så hvis jeg skriver 1.5 så får jeg halvanden vare. Er det noget der kan gøres noget ved?
Fra manualen (http://dk2.php.net/preg_match) Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.
I har begge hjulpet meget, så jeg synes da i har fortjent 100 point hver. Hvad siger i til at nielle lægger et svar her, og at jeg så opretter et nyt spm til hmortensen?
Eftersom dit alternativ - (int)$Antal - involvere en konvertering af en tekst-streng til et tal, så er jeg bestemt ikke sikker på at det faktisk ikke er mere effektivt at bruge et regulært udtryk i dette tilfælde.
Generelt kan jeg fortælle at motoren nede under regulære udtryk er endog meget effektivt implementeret.
For the record: Nu har jeg også lavet en benchmark - godt nok i C# - og der var RexExp metoden ca. dobbelt så langsom som casting-metoden. Det er ikek hvad jeg ville kalde "væsentlig langsommere" men det er trods alt langsommere.
Bortset fra al den interessante snak som performance, så har hmortensen’s metode stadig den svaghed at den lader tal på formen "1e2" passere igennem som godkendte. Dette kan give interessante problemer når værdien af $antal skal skrives til databasen.
Nå, men ved i hvad. Jeg tror jeg snart går i seng, så hvis der var nogle der skulle have nogle point, så må i lige smide et svar, ellers tager jeg dem til mig igen.
21/05-2005 23:48:45> Se *det* er jo værd at få testet efter. Er vi nu også 100% sikker på at vi får teksten "1e2" og ikke tallet 1e2 fra $_POST("antal")? :^|
m0nk3y> Tag du dem bare igen - det er som hmortensen siger. Under alle omstændigheder er 100 point alt for meget for en opgave som denne. :^)
Så skulle der ik være nogle smuthuller: if (is_numeric($tal) && $tal == (int)$tal && $tal > 0 && $tal < 301)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.