FUDforum
Fast Uncompromising Discussions. FUDforum will get your users talking.

Home » Imported messages » comp.lang.php » PHP Newbie can't evaluate numerical string as number
Show: Today's Messages :: Polls :: Message Navigator
Switch to threaded view of this topic Create a new topic Submit Reply
PHP Newbie can't evaluate numerical string as number [message #175919] Mon, 07 November 2011 16:25 Go to next message
Graham is currently offline  Graham
Messages: 4
Registered: November 2011
Karma: 0
Junior Member
I'm a Perl veteran (well almost!) but a PHP newbie. I've got a simple
subtraction formula in 'vars.php' as follows:

<?php
$formula = "!big_number - !small_number";
?>

I then include it in 'test.php' along with a few variables, do a bit of
string replacement, run eval on it, then print it

<?PHP
include 'vars.php';
$big_number = 30000;
$small_number = 3000;
$formula = str_replace("!", "$", $formula);
eval("\$formula = \"$formula\";");
//$formula = intval($formula);
//settype($formula, "integer");
print ("formula = $formula\n");
?>

The above gives me...'formula = 30000 - 3000'
when of course what I want is...'formula = 27000'

A few of the many things I've tried are commented out. Please put me out of
my misery someone!
Re: PHP Newbie can't evaluate numerical string as number [message #175920 is a reply to message #175919] Mon, 07 November 2011 16:56 Go to previous messageGo to next message
The Natural Philosoph is currently offline  The Natural Philosoph
Messages: 993
Registered: September 2010
Karma: 0
Senior Member
Graham wrote:
> I'm a Perl veteran (well almost!) but a PHP newbie. I've got a simple
> subtraction formula in 'vars.php' as follows:
>
> <?php
> $formula = "!big_number - !small_number";
> ?>
>
> I then include it in 'test.php' along with a few variables, do a bit of
> string replacement, run eval on it, then print it
>
> <?PHP
> include 'vars.php';
> $big_number = 30000;
> $small_number = 3000;
> $formula = str_replace("!", "$", $formula);
> eval("\$formula = \"$formula\";");
> //$formula = intval($formula);
> //settype($formula, "integer");
> print ("formula = $formula\n");
> ?>
>
> The above gives me...'formula = 30000 - 3000'
> when of course what I want is...'formula = 27000'
>
> A few of the many things I've tried are commented out. Please put me out of
> my misery someone!
>
>
>
why not parse $formula using sscanf?
Re: PHP Newbie can't evaluate numerical string as number [message #175921 is a reply to message #175919] Mon, 07 November 2011 17:52 Go to previous messageGo to next message
Denis McMahon is currently offline  Denis McMahon
Messages: 634
Registered: September 2010
Karma: 0
Senior Member
On Mon, 07 Nov 2011 16:25:42 +0000, Graham wrote:

> I'm a Perl veteran (well almost!) but a PHP newbie. I've got a simple
> subtraction formula in 'vars.php' as follows:
>
> <?php
> $formula = "!big_number - !small_number"; ?>
>
> I then include it in 'test.php' along with a few variables, do a bit of
> string replacement, run eval on it, then print it
>
> <?PHP
> include 'vars.php';
> $big_number = 30000;
> $small_number = 3000;
> $formula = str_replace("!", "$", $formula); eval("\$formula =
> \"$formula\";");
> //$formula = intval($formula);
> //settype($formula, "integer");
> print ("formula = $formula\n");
> ?>
>
> The above gives me...'formula = 30000 - 3000' when of course what I want
> is...'formula = 27000'
>
> A few of the many things I've tried are commented out. Please put me out
> of my misery someone!

Does the following working example help?

<?php

$big_number = 50000;
$small_number = 5000;

$formula1 = "\$result1 = \$big_number - \$small_number;";
$formula2 = "return(\$big_number - \$small_number);";

echo "\$formula1 = '{$formula1}'\n";
echo "\$formula2 = '{$formula2}'\n";

eval($formula1);
$result2 = eval($formula2);

echo "\$result1 = {$result1}\n";
echo "\$result2 = {$result2}\n";

?>

Rgds

Denis McMahon
Re: PHP Newbie can't evaluate numerical string as number [message #175922 is a reply to message #175919] Mon, 07 November 2011 22:49 Go to previous messageGo to next message
Thomas 'PointedEars'  is currently offline  Thomas 'PointedEars'
Messages: 701
Registered: October 2010
Karma: 0
Senior Member
Graham wrote:

> I'm a Perl veteran (well almost!) but a PHP newbie. […]
> <?php
> $formula = "!big_number - !small_number";
> ?>
> […]
> $big_number = 30000;
> $small_number = 3000;
> $formula = str_replace("!", "$", $formula);
> eval("\$formula = \"$formula\";");

You don't want a string, so don't make a string – remove the `\"'.
(I don't think Perl is so much different in that regard.)

> […]
> The above gives me...'formula = 30000 - 3000'
> when of course what I want is...'formula = 27000'

HTH

PointedEars
--
When all you know is jQuery, every problem looks $olvable.
Re: PHP Newbie can't evaluate numerical string as number [message #175923 is a reply to message #175921] Tue, 08 November 2011 08:41 Go to previous messageGo to next message
Graham is currently offline  Graham
Messages: 4
Registered: November 2011
Karma: 0
Junior Member
Unfortunately not. Here you introduce the formula into the main script,
whereas I need to introduce it in a separate script (or import it from a
database) to save me having to amend it countless times if it ever changes.
Hence me using str_replace to change !big_number to $big_number. Although
this worked, I was still left with a 'numerical string' which I couldn't
evaluate. So I guess my question is how do you evaluate a numerical string
such as '30000 - 3000'?

"Denis McMahon" <denismfmcmahon(at)gmail(dot)com> wrote in message
news:4eb81acf$0$28518$a8266bb1(at)newsreader(dot)readnews(dot)com...
> On Mon, 07 Nov 2011 16:25:42 +0000, Graham wrote:
>
>> I'm a Perl veteran (well almost!) but a PHP newbie. I've got a simple
>> subtraction formula in 'vars.php' as follows:
>>
>> <?php
>> $formula = "!big_number - !small_number"; ?>
>>
>> I then include it in 'test.php' along with a few variables, do a bit of
>> string replacement, run eval on it, then print it
>>
>> <?PHP
>> include 'vars.php';
>> $big_number = 30000;
>> $small_number = 3000;
>> $formula = str_replace("!", "$", $formula); eval("\$formula =
>> \"$formula\";");
>> //$formula = intval($formula);
>> //settype($formula, "integer");
>> print ("formula = $formula\n");
>> ?>
>>
>> The above gives me...'formula = 30000 - 3000' when of course what I want
>> is...'formula = 27000'
>>
>> A few of the many things I've tried are commented out. Please put me out
>> of my misery someone!
>
> Does the following working example help?
>
> <?php
>
> $big_number = 50000;
> $small_number = 5000;
>
> $formula1 = "\$result1 = \$big_number - \$small_number;";
> $formula2 = "return(\$big_number - \$small_number);";
>
> echo "\$formula1 = '{$formula1}'\n";
> echo "\$formula2 = '{$formula2}'\n";
>
> eval($formula1);
> $result2 = eval($formula2);
>
> echo "\$result1 = {$result1}\n";
> echo "\$result2 = {$result2}\n";
>
> ?>
>
> Rgds
>
> Denis McMahon
Re: PHP Newbie can't evaluate numerical string as number [message #175924 is a reply to message #175923] Tue, 08 November 2011 08:56 Go to previous messageGo to next message
Erwin Moller is currently offline  Erwin Moller
Messages: 228
Registered: September 2010
Karma: 0
Senior Member
On 11/8/2011 9:41 AM, Graham wrote:
> Unfortunately not. Here you introduce the formula into the main script,
> whereas I need to introduce it in a separate script (or import it from a
> database) to save me having to amend it countless times if it ever changes.
> Hence me using str_replace to change !big_number to $big_number. Although
> this worked, I was still left with a 'numerical string' which I couldn't
> evaluate. So I guess my question is how do you evaluate a numerical string
> such as '30000 - 3000'?

I think Dennis showed that trick: use eval().
Personally I think it is ugly, but it works.

example:
$myNumericString = "30000 - 300";
$myEval = '$myResult = '.$myNumericString.';';
eval ($myEval);
echo $myResult;

(not tested)

A warning:
I once had to develop a webside where people needed to enter formula's
that worked on data (a bit like MS Excel, but serverside).
For example:
"SUM(**somefield**) / COUNT(**somefield**)"
They needed to be stored in a database too, and the number of possible
manipulations (like SUM and COUNT) were limited.
If I were to eval() that string blindly, I would open up a the side to a
lot of missery (naughty commands, eg file_put_contents()), so I ended up
writing a parser that took the formula apart, and if it used anything
outside my small list of allowed manipulations, I refused the formula.

I am not sure where your formula's come from, but if they are entered by
users, take some care before using eval().


Regards,
Erwin Moller


>
> "Denis McMahon"<denismfmcmahon(at)gmail(dot)com> wrote in message
> news:4eb81acf$0$28518$a8266bb1(at)newsreader(dot)readnews(dot)com...
>> On Mon, 07 Nov 2011 16:25:42 +0000, Graham wrote:
>>
>>> I'm a Perl veteran (well almost!) but a PHP newbie. I've got a simple
>>> subtraction formula in 'vars.php' as follows:
>>>
>>> <?php
>>> $formula = "!big_number - !small_number"; ?>
>>>
>>> I then include it in 'test.php' along with a few variables, do a bit of
>>> string replacement, run eval on it, then print it
>>>
>>> <?PHP
>>> include 'vars.php';
>>> $big_number = 30000;
>>> $small_number = 3000;
>>> $formula = str_replace("!", "$", $formula); eval("\$formula =
>>> \"$formula\";");
>>> //$formula = intval($formula);
>>> //settype($formula, "integer");
>>> print ("formula = $formula\n");
>>> ?>
>>>
>>> The above gives me...'formula = 30000 - 3000' when of course what I want
>>> is...'formula = 27000'
>>>
>>> A few of the many things I've tried are commented out. Please put me out
>>> of my misery someone!
>>
>> Does the following working example help?
>>
>> <?php
>>
>> $big_number = 50000;
>> $small_number = 5000;
>>
>> $formula1 = "\$result1 = \$big_number - \$small_number;";
>> $formula2 = "return(\$big_number - \$small_number);";
>>
>> echo "\$formula1 = '{$formula1}'\n";
>> echo "\$formula2 = '{$formula2}'\n";
>>
>> eval($formula1);
>> $result2 = eval($formula2);
>>
>> echo "\$result1 = {$result1}\n";
>> echo "\$result2 = {$result2}\n";
>>
>> ?>
>>
>> Rgds
>>
>> Denis McMahon
>
>


--
"That which can be asserted without evidence, can be dismissed without
evidence."
-- Christopher Hitchens
Re: PHP Newbie can't evaluate numerical string as number [message #175925 is a reply to message #175924] Tue, 08 November 2011 09:35 Go to previous messageGo to next message
Graham is currently offline  Graham
Messages: 4
Registered: November 2011
Karma: 0
Junior Member
Yes it works! (although I admit I'm not entirely sure why). Many thanks! And
apologies to Denis for having doubted him.

Thanks also for the warning on using formula in this way. The formula in
question (a bit more complex than A-B) is actually embodied in UK Govenment
legislation, so I won't be letting users mess with it.

R's
Graham Stow

"Erwin Moller"
<Since_humans_read_this_I_am_spammed_too_much(at)spamyourself(dot)com> wrote in
message news:4eb8eed0$0$6947$e4fe514c(at)news2(dot)news(dot)xs4all(dot)nl...
> On 11/8/2011 9:41 AM, Graham wrote:
>> Unfortunately not. Here you introduce the formula into the main script,
>> whereas I need to introduce it in a separate script (or import it from a
>> database) to save me having to amend it countless times if it ever
>> changes.
>> Hence me using str_replace to change !big_number to $big_number. Although
>> this worked, I was still left with a 'numerical string' which I couldn't
>> evaluate. So I guess my question is how do you evaluate a numerical
>> string
>> such as '30000 - 3000'?
>
> I think Dennis showed that trick: use eval().
> Personally I think it is ugly, but it works.
>
> example:
> $myNumericString = "30000 - 300";
> $myEval = '$myResult = '.$myNumericString.';';
> eval ($myEval);
> echo $myResult;
>
> (not tested)
>
> A warning:
> I once had to develop a webside where people needed to enter formula's
> that worked on data (a bit like MS Excel, but serverside).
> For example:
> "SUM(**somefield**) / COUNT(**somefield**)"
> They needed to be stored in a database too, and the number of possible
> manipulations (like SUM and COUNT) were limited.
> If I were to eval() that string blindly, I would open up a the side to a
> lot of missery (naughty commands, eg file_put_contents()), so I ended up
> writing a parser that took the formula apart, and if it used anything
> outside my small list of allowed manipulations, I refused the formula.
>
> I am not sure where your formula's come from, but if they are entered by
> users, take some care before using eval().
>
>
> Regards,
> Erwin Moller
>
>
>>
>> "Denis McMahon"<denismfmcmahon(at)gmail(dot)com> wrote in message
>> news:4eb81acf$0$28518$a8266bb1(at)newsreader(dot)readnews(dot)com...
>>> On Mon, 07 Nov 2011 16:25:42 +0000, Graham wrote:
>>>
>>>> I'm a Perl veteran (well almost!) but a PHP newbie. I've got a simple
>>>> subtraction formula in 'vars.php' as follows:
>>>>
>>>> <?php
>>>> $formula = "!big_number - !small_number"; ?>
>>>>
>>>> I then include it in 'test.php' along with a few variables, do a bit of
>>>> string replacement, run eval on it, then print it
>>>>
>>>> <?PHP
>>>> include 'vars.php';
>>>> $big_number = 30000;
>>>> $small_number = 3000;
>>>> $formula = str_replace("!", "$", $formula); eval("\$formula =
>>>> \"$formula\";");
>>>> //$formula = intval($formula);
>>>> //settype($formula, "integer");
>>>> print ("formula = $formula\n");
>>>> ?>
>>>>
>>>> The above gives me...'formula = 30000 - 3000' when of course what I
>>>> want
>>>> is...'formula = 27000'
>>>>
>>>> A few of the many things I've tried are commented out. Please put me
>>>> out
>>>> of my misery someone!
>>>
>>> Does the following working example help?
>>>
>>> <?php
>>>
>>> $big_number = 50000;
>>> $small_number = 5000;
>>>
>>> $formula1 = "\$result1 = \$big_number - \$small_number;";
>>> $formula2 = "return(\$big_number - \$small_number);";
>>>
>>> echo "\$formula1 = '{$formula1}'\n";
>>> echo "\$formula2 = '{$formula2}'\n";
>>>
>>> eval($formula1);
>>> $result2 = eval($formula2);
>>>
>>> echo "\$result1 = {$result1}\n";
>>> echo "\$result2 = {$result2}\n";
>>>
>>> ?>
>>>
>>> Rgds
>>>
>>> Denis McMahon
>>
>>
>
>
> --
> "That which can be asserted without evidence, can be dismissed without
> evidence."
> -- Christopher Hitchens
Re: PHP Newbie can't evaluate numerical string as number [message #175926 is a reply to message #175925] Tue, 08 November 2011 09:57 Go to previous messageGo to next message
Denis McMahon is currently offline  Denis McMahon
Messages: 634
Registered: September 2010
Karma: 0
Senior Member
On Tue, 08 Nov 2011 09:35:02 +0000, Graham wrote:

> Yes it works! (although I admit I'm not entirely sure why). Many thanks!
> And apologies to Denis for having doubted him.

Heads up - we don't top post in newsgroups. Reply goes at the bottom so
that reading naturally down the page response is after the comment it
applies to.

If you read the php manual for eval http://uk.php.net/manual/en/
function.eval.php , all is explained:

There are two ways to get a value from eval into the script that calls
eval:

a) use return inside the eval code, and assign the value of eval to a
variable, viz:

$evalResult = eval("return $big_number - $small_number;");
echo $evalResult;

b) assign the result to a variable inside the eval code:

eval("$evalResult = $big_number - $small_number;");
echo $evalResult;

These are the two methods I attempted to show in my example.

Rgds

Denis McMahon
Re: PHP Newbie can't evaluate numerical string as number [message #175927 is a reply to message #175926] Tue, 08 November 2011 10:08 Go to previous messageGo to next message
Tim Streater is currently offline  Tim Streater
Messages: 328
Registered: September 2010
Karma: 0
Senior Member
In article <4eb8fcf9$0$28445$a8266bb1(at)newsreader(dot)readnews(dot)com>,
Denis McMahon <denismfmcmahon(at)gmail(dot)com> wrote:

> Heads up - we don't top post in newsgroups. Reply goes at the bottom so
> that reading naturally down the page response is after the comment it
> applies to.

We? You only speak for yourself.

--
Tim

"That excessive bail ought not to be required, nor excessive fines imposed,
nor cruel and unusual punishments inflicted" -- Bill of Rights 1689
Re: PHP Newbie can't evaluate numerical string as number [message #175928 is a reply to message #175919] Tue, 08 November 2011 10:19 Go to previous messageGo to next message
Jonathan Stein is currently offline  Jonathan Stein
Messages: 43
Registered: September 2010
Karma: 0
Member
Den 07-11-2011 17:25, Graham skrev:

> <?php
> $formula = "!big_number - !small_number";
> ?>

function myFormula($big_number, $small_number) {
return $big_number - $small_number;
}

> <?PHP
> include 'vars.php';
> $big_number = 30000;
> $small_number = 3000;
> $formula = str_replace("!", "$", $formula);
> eval("\$formula = \"$formula\";");
> //$formula = intval($formula);
> //settype($formula, "integer");
> print ("formula = $formula\n");
> ?>

include 'vars.php';
print myFormula(30000, 3000);

Regards

Jonathan
Re: PHP Newbie can't evaluate numerical string as number [message #175929 is a reply to message #175926] Tue, 08 November 2011 10:27 Go to previous messageGo to next message
Graham is currently offline  Graham
Messages: 4
Registered: November 2011
Karma: 0
Junior Member
"Denis McMahon" <denismfmcmahon(at)gmail(dot)com> wrote in message
news:4eb8fcf9$0$28445$a8266bb1(at)newsreader(dot)readnews(dot)com...
> On Tue, 08 Nov 2011 09:35:02 +0000, Graham wrote:
>
>> Yes it works! (although I admit I'm not entirely sure why). Many thanks!
>> And apologies to Denis for having doubted him.
>
> Heads up - we don't top post in newsgroups. Reply goes at the bottom so
> that reading naturally down the page response is after the comment it
> applies to.
>
> If you read the php manual for eval http://uk.php.net/manual/en/
> function.eval.php , all is explained:
>
> There are two ways to get a value from eval into the script that calls
> eval:
>
> a) use return inside the eval code, and assign the value of eval to a
> variable, viz:
>
> $evalResult = eval("return $big_number - $small_number;");
> echo $evalResult;
>
> b) assign the result to a variable inside the eval code:
>
> eval("$evalResult = $big_number - $small_number;");
> echo $evalResult;
>
> These are the two methods I attempted to show in my example.
>
> Rgds
>
> Denis McMahon

I hang my head in shame! Thinking about it, i've been critised for top
posting before, but couldn't remember the drill as I post to newsgroups so
rarely. Thanks for being patient and polite (unlike some). And thanks for
the very thorough explanation which I now follow.

R's
Graham Stow
Re: PHP Newbie can't evaluate numerical string as number [message #175930 is a reply to message #175927] Tue, 08 November 2011 17:49 Go to previous message
Denis McMahon is currently offline  Denis McMahon
Messages: 634
Registered: September 2010
Karma: 0
Senior Member
On Tue, 08 Nov 2011 10:08:42 +0000, Tim Streater wrote:

> In article <4eb8fcf9$0$28445$a8266bb1(at)newsreader(dot)readnews(dot)com>,
> Denis McMahon <denismfmcmahon(at)gmail(dot)com> wrote:
>
>> Heads up - we don't top post in newsgroups. Reply goes at the bottom so
>> that reading naturally down the page response is after the comment it
>> applies to.
>
> We? You only speak for yourself.

I think I can fairly safely claim to speak for the majority of people who
actually take part in conversations using usenet (as opposed to people
who use websites which present a web based interface to usenet) when I
point out that by long standing convention, in usenet, replies go below
the comments they refer to.

Rgds

Denis McMahon
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: shiping cart program
Next Topic: he discount UGG boots are best known for its "Classic" sheepskin boots.
Goto Forum:
  

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ]

Current Time: Wed Nov 27 09:42:22 GMT 2024

Total time taken to generate the page: 0.02169 seconds