Solved

execute functions using eval

Posted on 2008-06-19
19
185 Views
Last Modified: 2013-12-12
Hello,
I'm trying to get eval to execute functions but it's not working....that is I need it to be returned and not echoed.

I need this:
function doIt(){
$var = 'this is what i would like to output';
return $var;
}
eval(doit());
0
Comment
Question by:johnwry
  • 6
  • 6
  • 4
  • +1
19 Comments
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
You don't need eval() to get the return value back.  This should be enough...
function doIt(){

    $var = 'this is what i would like to output';

    return $var;

}

$my_value = doit();

Open in new window

0
 
LVL 48

Expert Comment

by:hernst42
Comment Utility
or as eval:
$x = eval('return doit();');

Open in new window

0
 
LVL 48

Accepted Solution

by:
hernst42 earned 168 total points
Comment Utility
or if output is one via eval use:

ob_start();
eval('doit();');
$out1 = ob_get_contents();
ob_end_clean();

http://www.php.net/manual/en/ref.outcontrol.php
0
 
LVL 27

Assisted Solution

by:yodercm
yodercm earned 166 total points
Comment Utility
function doIt(){
$var = 'this is what i would like to output';
return $var;
}
eval(doit());

NOTE that you have spelled the function doIt (with a capital I) and then invoked the function doit().

As the others said, don't use eval(), it's for something else entirely.

function doIt(){
$var = 'this is what i would like to output';
return $var;
}

$varvalue = doIt();
0
 

Author Comment

by:johnwry
Comment Utility
I understand that eval() is extremely dangerous and slow so should not be dealt with lightly.
My problem is that I am (force to) storing php functions in mysql and would like to execute those functions.  At the moment I am able to execute normal code and this works fine but I would really like to execute a function instead of storing huge amounts into mysql.
0
 
LVL 48

Expert Comment

by:hernst42
Comment Utility
So if the code comes from a database you can use something like this:

ob_start();
eval($row['code']);
$out1 = ob_get_contents();
ob_end_clean();
0
 

Author Comment

by:johnwry
Comment Utility
the function gets outputted when i have this:

function doIt(){
$var ='test';
echo $var;
}
but I need this:
function doIt(){
$var ='test';

return $var;
}

0
 
LVL 108

Assisted Solution

by:Ray Paseur
Ray Paseur earned 166 total points
Comment Utility
That echo() function writes to the browser output stream, unless you use output buffering.

try something like this:
ob_start();

doIt();

$var = ob_get_contents();

ob_end_clean();

Open in new window

0
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
LVL 48

Expert Comment

by:hernst42
Comment Utility
Then use the output buffer as I already posted in http:#21821075

The outputbuffer capatures all data written with echo and print. Then you can use the variable to process the result.
0
 

Author Comment

by:johnwry
Comment Utility
This almost works:
$query  = 'include 'files.php'; doit();';
$x = eval('return $query');

Problem is I have other code to run not just doit();

This does work:
$query  = 'include 'files.php'; doit();';
ob_start();
eval($query);
$contents.= ob_get_contents();
ob_end_clean();

but it doesn't allow for any other code to be outputted and $contents.= needs to be all my page (it's running through an engine).
0
 
LVL 48

Expert Comment

by:hernst42
Comment Utility
please post more information so we can make a complete solution for your need.
0
 

Author Comment

by:johnwry
Comment Utility
ok. sorry. Didn't think it would get this complicated.

What I have is a template engine and $contents is  the main content of the page.
It works fine except for now I want to develop a blog where each user can have their own url: mysite.com/user.html .
So, i have processed everything to where IF the page is user.html THEN we get the php code from mysql and run it:
$php = "includes 'file.php'; doit();"

$contents.= eval($php);

That WOULD have worked if it wasn't that I need to have the doit() function in there. If it was just php code it runs fine. At the moment if the function doit() ends with echo then the $contents output is placed outside the rest of the page. IF the function doit() ends with return then nothing is outputted.
hope this helps to clarify
0
 
LVL 48

Expert Comment

by:hernst42
Comment Utility
ok so you want to capute both parts, so try

$query  = 'include 'files.php'; doit();';
ob_start();
$contents .= eval("return $query");
$contents.= ob_get_contents();
ob_end_clean();
0
 

Author Comment

by:johnwry
Comment Utility
it outputs it but because doit() is ending with echo it posts the contents above the rest of the page.
0
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
John: Couple of things...

First you might try the code snippet.  

Second you might consider installing multiple instances of WordPress in different directories for each user who wants a blog.  It's easy enough to do and you get the heavy lifting already done for you by the wordpress community.

Just a thought, ~Ray
ob_start();

$query  = "include ('files.php'); doit();";

$contents .= eval("return $query");

$contents.= ob_get_contents();

ob_end_clean();

echo $contents;

Open in new window

0
 

Author Comment

by:johnwry
Comment Utility
thanks for the suggestion. I'm too far into my this CMS to drop it now.


0
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
Well, good luck with the project.  In any case, I think we have answered your questions about eval() and hopefully shown you many ways to achieve the objectives.  ~Ray
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

A publishing tool, a Version Control System, or a Collaboration Platform! These can be some of the defining words for the two very famous web-hosting Git repositories: Bitbucket and Github. Git is widely used amongst the programmers and developers f…
This article discusses four methods for overlaying images in a container on a web page
The viewer will learn how to count occurrences of each item in an array.
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now