Solved

execute functions using eval

Posted on 2008-06-19
19
189 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 109

Expert Comment

by:Ray Paseur
ID: 21820995
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
ID: 21821005
or as eval:
$x = eval('return doit();');

Open in new window

0
 
LVL 48

Accepted Solution

by:
hernst42 earned 168 total points
ID: 21821016
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
Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

 
LVL 27

Assisted Solution

by:yodercm
yodercm earned 166 total points
ID: 21821023
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
ID: 21821059
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
ID: 21821075
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
ID: 21821120
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 109

Assisted Solution

by:Ray Paseur
Ray Paseur earned 166 total points
ID: 21821145
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
 
LVL 48

Expert Comment

by:hernst42
ID: 21821160
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
ID: 21821307
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
ID: 21821328
please post more information so we can make a complete solution for your need.
0
 

Author Comment

by:johnwry
ID: 21821425
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
ID: 21821458
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
ID: 21821827
it outputs it but because doit() is ending with echo it posts the contents above the rest of the page.
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 21849037
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
ID: 22510925
thanks for the suggestion. I'm too far into my this CMS to drop it now.


0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 22511045
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

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Build an array called $myWeek which will hold the array elements Today, Yesterday and then builds up the rest of the week by the name of the day going back 1 week.   (CODE) (CODE) Then you just need to pass your date to the function. If i…
Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

813 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

17 Experts available now in Live!

Get 1:1 Help Now