PHP,Eval代码导致变量

时间:2016-07-12 14:38:46

标签: php laravel blade

我正在使用eval来执行来自数据库的PHP代码。代码用于元标记和页面标题。一个示例如下所示(这存储在表中):

$name . " test page title |".SiteSettings::getSiteNameAlternate();

然后在控制器中我这样做($ seo是一个具有meta_title的对象,该元素具有来自db的确切字符串):

$pageTitle = isset($seo->meta_title) ? @eval("echo $seo->meta_title") : null;

我正在使用Larevel框架,并将该页面标题传递给刀片模板,这是有效的。刀片代码

<title>{{ isset($page_title) ? $page_title : SiteSettings::defaultPageTitle() }}</title>

问题是因为eval中的回声我也得到了页面顶部的页面标题。

我尝试使用print(我知道的是哑)和printf。不工作。知道如何将该eval的值放在一个没有输出的变量中吗?

3 个答案:

答案 0 :(得分:2)

$pageTitle = isset($seo->meta_title) ? @eval("return $seo->meta_title;") : null;
如果设置了$seo->meta_title

会将$pageTitle分配给$seo->meta_title,否则会null

答案 1 :(得分:1)

如果我能正确理解您的问题,则会出现问题,因为您在echoeval执行了该问题。因此,您应该将$seo->meta_title的值存储到变量中,然后让视图echo

在您的控制器中,如果isset将元标题值存储为页面标题,除非null

$pageTitle = null;
if (isset($seo->meta_title)) {
    $metaTitle = '';
    eval("\$metaTitle = \"$seo->meta_title\";");
    $pageTitle = $metaTitle;
}

然后在你看来

<title>{{ isset($page_title) ? $page_title : SiteSettings::defaultPageTitle() }}</title>

答案 2 :(得分:0)

存储结果的好方法是使用ob_start,ob_get_contents和ob_end_clean

/*start buffering;*/
ob_start();

eval(echo isset($seo->meta_title) ? $seo->meta_title : "");

/* now catch the Buffer of the eval */

$pageTitle = ob_get_contents();

/* pageTitle contains now the value of the buffered echo */

/* stop buffering; */

ob_end_clean();

现在可以根据需要使用Controller