Problems Using Eval

Problems Using Eval

am 26.09.2007 10:11:45 von Smiley

I'm fooling around with using Eval and trying to manipulate a few things. I
ran into a couple of weird results. First of all, in one place I used the
following code:

$filestring = str_replace(" $filestring = str_replace("?>", "\n?>\n", $filestring);

Not a huge thing, just making things easier to read for me. But doing this
gives me an error, even when I comment those lines out. I have to remove
them completely, it seems to be interpreting the ?> and when they're in quotes or commented out. Why is that?

Second thing, I'm having trouble getting eval to work with some of the code,
and I have no idea why. It grabs the code to eval from other files, and I
can't see any reason why it shouldn't work. This is the error message I'm
getting:

Parse error: parse error, unexpected $ in
/homepages/htdocs/parrot0123/tester.php(498) : eval()'d code on line 44

I exploded the eval code and print_r'd the results, and this is what I got:

Array
(
[0] => global $monthname;
[1] => global $config;
[2] => $now = time();
[3] => $today = getdate($now);
[4] => $curmonth = $today['mon'];
[5] => $curyear = $today['year'];
[6] => // Determine whether it's a leap year
[7] => $leapyear = 0;
[8] => $remainder = $curyear % 400;
[9] => if(!$remainder)
[10] => {
[11] => $leapyear = 1;
[12] => }
[13] => else
[14] => {
[15] => $remainder = $curyear % 100;
[16] => if ($remainder)
[17] => {
[18] => $remainder = $curyear % 4;
[19] => if (!$remainder)
[20] => {
[21] => $leapyear = 1;
[22] => }
[23] => }
[24] => }
[25] => // Set the number of days per month
[26] => $mdays[1] = 31;
[27] => $mdays[2] = 28 + $leapyear;
[28] => $mdays[3] = 31;
[29] => $mdays[4] = 30;
[30] => $mdays[5] = 31;
[31] => $mdays[6] = 30;
[32] => $mdays[7] = 31;
[33] => $mdays[8] = 31;
[34] => $mdays[9] = 30;
[35] => $mdays[10] = 31;
[36] => $mdays[11] = 30;
[37] => $mdays[12] = 31;
[38] => // Calculate the day of the week that the first day of this
months falls on
[39] => $_POST['nowmonth'] = mktime(0, 0, 0, $curmonth, 1, $curyear);
[40] => $cmstamp = $_POST['nowmonth'];
[41] => $datevals = getdate($ts);
)There's no line 44, what could the problem possibly be?

Re: Problems Using Eval

am 26.09.2007 12:27:59 von Erwin Moller

Smiley wrote:
> I'm fooling around with using Eval and trying to manipulate a few things. I
> ran into a couple of weird results. First of all, in one place I used the
> following code:
>
> $filestring = str_replace(" > $filestring = str_replace("?>", "\n?>\n", $filestring);
>
> Not a huge thing, just making things easier to read for me. But doing this
> gives me an error, even when I comment those lines out. I have to remove
> them completely, it seems to be interpreting the ?> and > when they're in quotes or commented out. Why is that?

Hi Smiley,

I tested it, and that is NOT happening here (PHP5.2).
What version are you on?

Most probably PHP sees them as begin and end of script.
Maybe it helps to escape them in your case.
Like this:
$filestring = str_replace("\<\?", "\n\<\?\n", $filestring);

Or are you maybe using this code TOO in the wretched eval way you
describe below?


>
> Second thing, I'm having trouble getting eval to work with some of the code,
> and I have no idea why. It grabs the code to eval from other files, and I
> can't see any reason why it shouldn't work. This is the error message I'm
> getting:

Why are you using eval?

>
> Parse error: parse error, unexpected $ in
> /homepages/htdocs/parrot0123/tester.php(498) : eval()'d code on line 44
>
> I exploded the eval code and print_r'd the results, and this is what I got:
>
> Array
> (
> [0] => global $monthname;
> [1] => global $config;
> [2] => $now = time();
> [3] => $today = getdate($now);
> [4] => $curmonth = $today['mon'];
> [5] => $curyear = $today['year'];
> [6] => // Determine whether it's a leap year
> [7] => $leapyear = 0;
> [8] => $remainder = $curyear % 400;
> [9] => if(!$remainder)
> [10] => {
> [11] => $leapyear = 1;
> [12] => }
> [13] => else
> [14] => {
> [15] => $remainder = $curyear % 100;
> [16] => if ($remainder)
> [17] => {
> [18] => $remainder = $curyear % 4;
> [19] => if (!$remainder)
> [20] => {
> [21] => $leapyear = 1;
> [22] => }
> [23] => }
> [24] => }
> [25] => // Set the number of days per month
> [26] => $mdays[1] = 31;
> [27] => $mdays[2] = 28 + $leapyear;
> [28] => $mdays[3] = 31;
> [29] => $mdays[4] = 30;
> [30] => $mdays[5] = 31;
> [31] => $mdays[6] = 30;
> [32] => $mdays[7] = 31;
> [33] => $mdays[8] = 31;
> [34] => $mdays[9] = 30;
> [35] => $mdays[10] = 31;
> [36] => $mdays[11] = 30;
> [37] => $mdays[12] = 31;
> [38] => // Calculate the day of the week that the first day of this
> months falls on
> [39] => $_POST['nowmonth'] = mktime(0, 0, 0, $curmonth, 1, $curyear);
> [40] => $cmstamp = $_POST['nowmonth'];
> [41] => $datevals = getdate($ts);
> )There's no line 44, what could the problem possibly be?
>


I have no clue what you are trying to accomplish with this strange
approach, but I think you better start redesinging your app right away.
Avoid eval. It is bugprone, opens up securityholes, and is extremely
hard to debug.
Simply don't.

Sorry I cannot be of more help.
I think you'll find most people in here won't encourage this approach.

Regards,
Erwin Moller

Re: Problems Using Eval

am 26.09.2007 12:39:30 von ragearc

> I have no clue what you are trying to accomplish with this strange
> approach, but I think you better start redesinging your app right away.
> Avoid eval. It is bugprone, opens up securityholes, and is extremely
> hard to debug.
> Simply don't.

That's what I thought as well. Why not simply include that file? I
mean, it would surely give you less headaches...

Re: Problems Using Eval

am 26.09.2007 17:39:03 von Smiley

"RageARC" wrote in message
news:1190803170.330649.206250@g4g2000hsf.googlegroups.com...
>
> That's what I thought as well. Why not simply include that file? I
> mean, it would surely give you less headaches...
>

What I'm trying to do is figure out a way to work in simplified coding
statements for an end user who uses a system so that they can have a greater
deal of control without needing to know PHP code. The simplified code is
interpreted, but I also wanted the ability for users to put in their own PHP
code so I'm using eval to those parts of it.

Re: Problems Using Eval

am 26.09.2007 17:51:18 von luiheidsgoeroe

On Wed, 26 Sep 2007 10:11:45 +0200, Smiley wrote:

> I'm fooling around with using Eval and trying to manipulate a few =

> things. I
> ran into a couple of weird results. First of all, in one place I used=
=

> the
> following code:
>
> $filestring =3D str_replace(" > $filestring =3D str_replace("?>", "\n?>\n", $filestring);

Works here...

> Second thing, I'm having trouble getting eval to work with some of the=
=

> code,
> and I have no idea why. It grabs the code to eval from other files, a=
nd =

> I
> can't see any reason why it shouldn't work. This is the error message=
=

> I'm
> getting:
>
> Parse error: parse error, unexpected $ in
> /homepages/htdocs/parrot0123/tester.php(498) : eval()'d code on line 4=
4
>
> I exploded the eval code

Why? The raw data would tell you more.... And there's no possibly removi=
ng =

of 'empty' elements. Also be very aware of HTML rendering: look at the =

source of the output, not how it displays in a browser.

and print_r'd the results, and this is what I
> got:
>
> Array
> (


Can't say I see any problem so quickly.
-- =

Rik Wasmus

Re: Problems Using Eval

am 27.09.2007 10:23:39 von Erwin Moller

Smiley wrote:
> "RageARC" wrote in message
> news:1190803170.330649.206250@g4g2000hsf.googlegroups.com...
>> That's what I thought as well. Why not simply include that file? I
>> mean, it would surely give you less headaches...
>>
>
> What I'm trying to do is figure out a way to work in simplified coding
> statements for an end user who uses a system so that they can have a greater
> deal of control without needing to know PHP code. The simplified code is
> interpreted, but I also wanted the ability for users to put in their own PHP
> code so I'm using eval to those parts of it.

Hi Smiley,

I am aware of the fact it must be irritating to receive responses like
this, but we advise this because we want to help.

If your goal is to simplify coding statements, I would start using OOP
instead.

So instead of building an array with pieces of code on each line, build
an object that has methods that do the same.

You'll end up with code like:
$smileyObj->resetCalc();
$smileyObj->add(12);
$smileyObj->add(34.5);
$smileyObj->add(1.123);
echo $smileyObj->calculateAverage();

One (very good) reason OOP exists/is popular is the fact you can hide
complexity behind a simple method.
Allthough I don't want to say my example (average calculation) has
anything to do with complexity. ;-)

Regards,
Erwin Moller