如何执行存储在数据库中(作为字符串)的 PHP 闭包
How to execute a PHP closure which is stored (as string) in database
我希望一些实体执行额外的代码(returns html),这些代码存储在它们自己的数据中,在数据库中。为此我试图在table的字段中存储一个闭包,并在检索它之后执行它。
闭包让我有机会封装脚本(在一个范围内)并在获取数据库后随时执行它。
问题是它不起作用。错误:'致命错误:未捕获错误:调用未定义 function function () {...
。
(前提:我知道'serialization of Closure is not allowed')
数据库中存储的闭包示例:
function() {
return '<h1>Today is '.date('d/m/Y').'</h1>';
};
获取数据并执行闭包:
//example of retrieve
$sql = "SELECT field FROM table";
$q = $link->query($sql);
$row = $q->fetchRow();
//execution, var must be contain the html processed in the closure
$var = $row['field']();
任何人都可以帮我解决这个错误或给我另一个构建这个场景的想法吗?
非常感谢。
您需要 eval
php 代码。
//execution, var must be contain the html processed in the closure
eval('$fn='.$row['field']);
$var = $fn();
Caution The eval() language construct is very dangerous because it
allows execution of arbitrary PHP code. Its use thus is discouraged.
If you have carefully verified that there is no other option than to
use this construct, pay special attention not to pass any user
provided data into it without properly validating it beforehand.
是否可以使用 printf 并将格式字符串存储在数据库中?在那种情况下,您将不需要(邪恶的)eval
。 format string 是 printf 或 sprintf 是相当强大的,但不能解决所有情况。但是您可以编写一个自定义的类似 printf 的函数来执行您想要的操作。
我希望一些实体执行额外的代码(returns html),这些代码存储在它们自己的数据中,在数据库中。为此我试图在table的字段中存储一个闭包,并在检索它之后执行它。
闭包让我有机会封装脚本(在一个范围内)并在获取数据库后随时执行它。
问题是它不起作用。错误:'致命错误:未捕获错误:调用未定义 function function () {...
。
(前提:我知道'serialization of Closure is not allowed')
数据库中存储的闭包示例:
function() {
return '<h1>Today is '.date('d/m/Y').'</h1>';
};
获取数据并执行闭包:
//example of retrieve
$sql = "SELECT field FROM table";
$q = $link->query($sql);
$row = $q->fetchRow();
//execution, var must be contain the html processed in the closure
$var = $row['field']();
任何人都可以帮我解决这个错误或给我另一个构建这个场景的想法吗?
非常感谢。
您需要 eval
php 代码。
//execution, var must be contain the html processed in the closure
eval('$fn='.$row['field']);
$var = $fn();
Caution The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.
是否可以使用 printf 并将格式字符串存储在数据库中?在那种情况下,您将不需要(邪恶的)eval
。 format string 是 printf 或 sprintf 是相当强大的,但不能解决所有情况。但是您可以编写一个自定义的类似 printf 的函数来执行您想要的操作。