[PHP]Rekenmachine berekent niet maar geeft string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
Nu moet ik voor school dus een rekenmachine maken in PHP met een HTML formulier. Grandioos gammel en onveilige funties en weetikwat niet meer dus, maar dat maakt hier even niets uit, mocht iemand daar nog tips over hebben ;)

Ik forceer de formulier input naar "double" & controleer of het van niet leeg was of er alleen text in stond/een nul. Helaas wil het berekenen niet goed gaan, er blijft alleen een string uitkomen en ik snap niet wat het probleem is!

"wat" is een "+" "-" "*" of "/" vanaf het HTML form en zou dus samen met de getallen een berekening moeten vormen (regel 11)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<? $getal1 = (double)$_GET["getal1"]; echo "Getal 1 is: $getal1"; ?>
<br />
<? $getal2 = (double)$_GET["getal2"]; echo "Getal 2 is: $getal2"; ?>
<br />
<? $wat = $_GET["wat"]; echo "Functie is: $wat"; ?>
<br />
<br />
<?
$uitkomst = $getal1.$wat.$getal2;
If ($getal1 == 0 or $getal2 == 0)
    {
    echo "Alleen bij de invoer van cijfers gaat dit script iets doen, sorry! (rekenen met een nul heeft weinig zin)";
    }
Else
    {
    echo "$getal1 $wat $getal2=$uitkomst";
    }
?>
</html>
</head>


Maar $uitkomst blijft gewoon een string.. waar ik de haakjes ook omheen zet!

[ Voor 3% gewijzigd door Cio op 23-09-2007 21:01 ]

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
$uitkomst = $getal1.$wat.$getal2; <- daar plak je alles aan elkaar als een string. Misschien is het op te lossen met eval, maar dat is niet bepaald veilig ;)

Acties:
  • 0 Henk 'm!

  • kingmuze
  • Registratie: Februari 2003
  • Laatst online: 24-10-2024

kingmuze

so don&#039;t fear

RAJH schreef op zondag 23 september 2007 @ 21:04:
$uitkomst = $getal1.$wat.$getal2; <- daar plak je alles aan elkaar als een string. Misschien is het op te lossen met eval, maar dat is niet bepaald veilig ;)
Inderdaad. Anders bouw gewoon een switch statement:
code:
1
2
3
4
5
6
7
8
9
10
11
switch ($wat) {
    case "+":
        $result = $getal1 + $getal2;
        break;
    case "-":
        $result = $getal1 - $getal2;
        break;
    case "kwardraad":
        $result = $getal1 * $getal1;
        break;
}

[gvr]muze[nl] says: fear is the mind killer


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46

Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
Ja, dacht zelf ook al dat alles gewoon een string werd, maar
code:
1
$uitkomst = ($getal1$wat$getal2)

werkte ook niet. Goed, eval lijkt inderdaad de oplossing (en ja, ongecontroleerde form input als code laten uitvoeren.. niet slim dus bij een serieuze toepassing!). Nu nog even toepassen...
kingmuze schreef op zondag 23 september 2007 @ 21:14:
[...]
Inderdaad. Anders bouw gewoon een switch statement:
Jaaaa... maar das natuurlijk niet zo schoon! Dat was mijn laatste hoop :P

[ Voor 29% gewijzigd door Cio op 23-09-2007 21:19 ]

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Hoewel er al oplossingen zijn gegeven is het als programmeur wel handig om te weten dat de dingen die je "wat" noemt beter bekend zijn onder de naam "operator".

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

Verwijderd

Je vindt eval beter dan een oplossing met een switch? En waarom dan...?

Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Verwijderd schreef op zondag 23 september 2007 @ 21:25:
Je vindt eval beter dan een oplossing met een switch? En waarom dan...?
Omdat je in het geval van een eval de boel goed moet controleren omdat het anders (flink) mis kan gaan.
Aan zijn post te lezen denk ik niet dat de TS daar zin in heeft.

Acties:
  • 0 Henk 'm!

Verwijderd

SH4D3H schreef op zondag 23 september 2007 @ 21:28:
[...]

Omdat je in het geval van een eval de boel goed moet controleren omdat het anders (flink) mis kan gaan.
Aan zijn post te lezen denk ik niet dat de TS daar zin in heeft.
Dus kun je toch beter een switch gebruiken...?

Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Verwijderd schreef op zondag 23 september 2007 @ 21:35:
[...]
Dus kun je toch beter een switch gebruiken...?
Sorry, had niet helemaal goed gelezen.
Maar ja, als je niet van plan bent de string die je door eval gaat halen goed te controleren is de switch een veel betere (lees: veiligere) optie.

Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
Johnny schreef op zondag 23 september 2007 @ 21:23:
Hoewel er al oplossingen zijn gegeven is het als programmeur wel handig om te weten dat de dingen die je "wat" noemt beter bekend zijn onder de naam "operator".
wat = gewoon de naam van de variabele toch? Zodra er een + o.i.d. van word gemaakt is het pas een operator. Muggeziften kunnen we allemaal. Bedankt voor de hulp maar nee dankje :)

@Waltor & SH4D3H
Dit is korter, overzichtelijker en de controle wat het script als opdracht gaat via een form, niet door de URL aan te passen. Aangezien de getal variabelen dus cijfers/double's worden en de wat variabele maar 4 opties heeft kan er weinig fout gaat (foutmelding of berekening!)

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Ik kan wel fijn die variablen aanpassen, voor de submit ;)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Stel:
PHP:
1
2
3
<?php
eval( '$uitkomst = ' . $getal1 . $wat . $getal2 . ';' );
?>

url.php?getal1=10&getal2=20&wat=+1;willekeurigefunctie();1+

Edit: semicolon :o :>

[ Voor 7% gewijzigd door SH4D3H op 23-09-2007 22:11 ]


Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
Snake schreef op zondag 23 september 2007 @ 21:47:
Ik kan wel fijn die variablen aanpassen, voor de submit ;)
_/-\o_ jij wint, maar dit is 1e jaars HBO informatica... en een bijbehorende docent.

Anyway, mijn eval krijg ik ook niet aan de praat...

code:
1
2
$uitkomst = ($getal1.$wat.$getal2);
eval ($uitkomst);


en de voorbeelden op internet helpen ook voor geen meter.. allemaal doodleuk ge copy-paste van dezelfde bron.

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Je eval heeft zo ook geen zin.
Het is alsof je ergens in je script zet:
1+1;

Zie mijn post voor een werkend voorbeeld ;)

Edit:
Om het probleem uit mijn post op te lossen kun je natuurlijk een regex gebruiken.
Gewoon alleen getalletjes en +-*/ toestaan.

[ Voor 35% gewijzigd door SH4D3H op 23-09-2007 22:09 ]


Acties:
  • 0 Henk 'm!

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 01-07-2023
Cio schreef op zondag 23 september 2007 @ 20:59:
Grandioos gammel en onveilige funties en weetikwat niet meer dus, maar dat maakt hier even niets uit, mocht iemand daar nog tips over hebben ;)
Zo zie je maar, of je wilt of niet tips krijg je toch. Je bent er toch ook om te leren niet :D
code:
1
2
3
4
5
6
<?
If ($getal1 == 0 or $getal2 == 0)
    {
    echo "Alleen bij de invoer van cijfers gaat dit script iets doen, sorry! (rekenen met een nul heeft weinig zin)";
    }
?>
Is is_numeric niet wat, dan kun je ook rekenen met nul. Ondankt dat dat in deze context niet zoveel nut heeft is je calculator dan niet beperkt. Wel even checken op delen door 0.

[ Voor 32% gewijzigd door Serpie op 23-09-2007 22:11 ]


Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
SH4D3H schreef op zondag 23 september 2007 @ 21:55:
[...]

Stel:
PHP:
1
2
3
<?php
$uitkomst = eval( $getal1 . $wat . $getal2 );
?>

url.php?getal1=10&getal2=20&wat=+1;willekeurigefunctie();1+
Actually... die eval WERKT niet eens... dus dan kan je ook niets uitvoeren he ;)

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Cio schreef op zondag 23 september 2007 @ 22:08:
[...]
Actually... die eval WERKT niet eens... dus dan kan je ook niets uitvoeren he ;)
Nu wel denk ik O-)
Semicolon vergeten.

Edit: En natuurlijk $uitkomst in de eval :+
Tis al laat denk ik dan maar :'(

[ Voor 14% gewijzigd door SH4D3H op 23-09-2007 22:11 ]


Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
Serpie schreef op zondag 23 september 2007 @ 22:07:
[...]
Is is_numeric niet wat, dan kun je ook rekenen met nul. Ondankt dat dat in deze context niet zoveel nut heeft is je calculator dan niet beperkt. Wel even checken op delen door 0.
Krijg nu de ***, die wist NIEMAND me te vertellen op school, ook de docent niet (zat met gettype te klooien voor het eten, besloten maar gewoon te forcen naar double). Mooiere oplossing, maar dit werkt nu al.

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
SH4D3H schreef op zondag 23 september 2007 @ 22:10:
[...]

Nu wel denk ik O-)
Semicolon vergeten.

Edit: En natuurlijk $uitkomst in de eval :+
Tis al laat denk ik dan maar :'(
Het probleem was dus, dat binnen de eval functie de hele string per deel opgebouwd moet worden, omdat anders deze als code buiten de eval functie werd uitgevoerd! Bedankt, hier kan ik wat mee!

werkende code (bedankt allemaal!)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<? $getal1 = (double)$_GET["getal1"]; echo "Getal 1 is: $getal1"; ?>
<br />
<? $getal2 = (double)$_GET["getal2"]; echo "Getal 2 is: $getal2"; ?>
<br />
<? $wat = $_GET["wat"]; echo "Functie is: $wat"; ?>
<br />
<br />
<?
eval('$uitkomst = '.$getal1.$wat.$getal2.';');
If ($getal1 == 0 or $getal2 == 0)
    {
    echo "Alleen bij de invoer van cijfers gaat dit script iets doen, sorry! (rekenen met een nul heeft weinig zin)";
    }
Else
    {
        echo "$getal1$wat$getal2=$uitkomst";
    }
?>
</html>
</head>


en het form natuurlijk
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<form name="data" method="GET" action="http://localhost/resultaat.php">
Getal 1:<input type="text" name="getal1"> <br /><br />

<input type="radio" name="wat" value="+">Optellen
<input type="radio" name="wat" value="-">Aftrekken
<input type="radio" name="wat" value="*">Vermenigvuldigen
<input type="radio" name="wat" value="/">Delen <br /><br />

Getal 2 <input type="text" name="getal2"> <br /><br />

<input type="submit" value="Bereken" />
</head>
</html>

[ Voor 55% gewijzigd door Cio op 23-09-2007 22:23 ]

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

Verwijderd

Gebruik voor zoiets als dit alsjeblieft geen eval(). Nu gaat dat misschien nog goed, maar als je met meerdere mensen aan een programma werkt is het een hel. Bouw je programma zo logisch mogelijk op, dan vallen onregelmatigheden een stuk sneller op.

Concreet: het switch-statement is makkelijk te doorgronden. Eén blik en je weet precies wat het stuk code doet. Bij jouw voorbeeld met eval() heb ik dat niet. Daar ben ik minutenlang aan het zoeken naar houvast.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Cio schreef op zondag 23 september 2007 @ 22:16:
[...]
Het probleem was dus, dat binnen de eval functie de hele string per deel opgebouwd moet worden, omdat anders deze als code buiten de eval functie werd uitgevoerd!
Nee, dan deed je iets anders fout. ;)

En zelfs al zou dit een 1e jaars opdracht zijn en zou security in het geheel niet meetellen, hoor je voor de switch oplossing een punt meer te krijgen dan voor een eval() versie.

{signature}


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Voutloos schreef op zondag 23 september 2007 @ 22:25:
[...]
En zelfs al zou dit een 1e jaars opdracht zijn en zou security in het geheel niet meetellen, hoor je voor de switch oplossing een punt meer te krijgen dan voor een eval() versie.
Eval is niet per definitie fout of minder imo.
Als je er maar voor zorgt dat het netjes gecontroleerd wordt.
In een switch gaat dat wat makkelijker, maar met een fatsoenlijke regex zou een eval ook probleemloos moeten kunnen zijn.

Acties:
  • 0 Henk 'm!

  • Cio
  • Registratie: November 2005
  • Laatst online: 13-05 12:05
@Niels

Die eval code is nu simpel lijkt me, maar weinig geschikt voor serieus gebruik. Beter kan ie wat lager ja, das helemaal duidelijk.

@Voutloos
code:
1
eval ($uitkomst = $getal1.$wat.$getal2;);

Probleem was toch dat de ; al als code gezien werden en mijn $wat als een string?

Door alles als string te plaatsen en vervolgens die string als code te laten uitvoeren werkte het wel. Mmkay.. wellicht niet zo schoon als ik dacht, maar wel kort :X

Vette nieuwe game? Poepluiers zal je bedoelen!


Acties:
  • 0 Henk 'm!

Verwijderd

SH4D3H schreef op zondag 23 september 2007 @ 22:28:
Eval is niet per definitie fout of minder imo.
Als je er maar voor zorgt dat het netjes gecontroleerd wordt.
In een switch gaat dat wat makkelijker, maar met een fatsoenlijke regex zou een eval ook probleemloos moeten kunnen zijn.
Niet moeilijk doen als het makkelijk kan.

Ik ben een enorme aanhanger van pluriformiteit, maar in dit geval zie ik er de voordelen niet van in. Switches zijn ingevoerd om programmeurs het leven makkelijker te maken in een geval als dit. Een eval met controle is dan niet fout, maar maakt het programma nodeloos ingewikkeld.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Met een switch is die check triviaal te doen door gewoon bij de default case stennis schoppen.
Eval() is echt een heel andere gedachtegang qua programmeren en imo moet je niet zo maar naar dergelijke middelen willen grijpen.

{signature}


Acties:
  • 0 Henk 'm!

  • kingmuze
  • Registratie: Februari 2003
  • Laatst online: 24-10-2024

kingmuze

so don&#039;t fear

Cio schreef op zondag 23 september 2007 @ 22:12:
[...]


Krijg nu de ***, die wist NIEMAND me te vertellen op school, ook de docent niet (zat met gettype te klooien voor het eten, besloten maar gewoon te forcen naar double). Mooiere oplossing, maar dit werkt nu al.
Offtopic: Waarom leren ze jullie geen Java als eerste taal in plaats van PHP (niks mis met PHP, alleen erg onduidelijk voor beginners die echt willen leren programmeren).

[gvr]muze[nl] says: fear is the mind killer

Pagina: 1