【问题标题】:How to execute a PHP function which is stored in MySQL database如何执行存储在 MySQL 数据库中的 PHP 函数
【发布时间】:2014-04-13 08:06:48
【问题描述】:

我正在寻找执行存储在 mysql 表中的 php 函数。 例如

SQL query: SELECT * FROM `modules` WHERE uid=2 LIMIT 0, 30 ;

Rows: 1

uid     moduleName  source  responsiveCode  active  
2   Testimonial     this is a function <?php echo getUrl(); ?>  12  0

现在我想在检索 uid 编号 2 时执行 getUrl() 函数

【问题讨论】:

  • 您可以查看php.net/eval,但请注意这可能是一个巨大的安全问题。
  • 正如所指出的,这是一个非常糟糕的做法。如果有办法不评估存储在 DB 中的函数,请考虑一下。

标签: php mysql function


【解决方案1】:

你可以像这样使用eval()

$result = mysqli_query($connection, "SELECT * FROM `modules` WHERE uid=2 LIMIT 0, 30");
$row = mysqli_fetch_assoc($result);
$function = $row['source'];

eval('?>' . $function . '<?php');

我强烈不建议您将函数存储在数据库中,因为这会带来巨大的安全风险。相反,您可以这样做:

uid | moduleName  | source             | responsiveCode | active 
---------------------------------------------------------------- 
2   | Testimonial | this is a function | 12             | 0

$result = mysqli_query($connection, "SELECT * FROM `modules` WHERE uid=2 LIMIT 0, 30");
$row = mysqli_fetch_assoc($result);
echo $row['source'] . getUrl(); //will still print the same

【讨论】:

  • 如果 eval 被禁用(通常是这样),您可以将函数写入文件,然后包含它 -- 可以 并不意味着这是一个好主意
  • @Paladin 好主意。但它比简单的eval() 需要更长的时间,特别是如果函数很长
  • 还要记住多次读取同一个文件会产生意想不到的结果。不建议使用 evalinclude 来完成 OP 想要实现的目标,因为它们代表着严重的安全风险。
  • @Jonan 是的,它会更慢......但它只能选择如何在没有 eval 的情况下处理环境......但我真的不认为函数长度和处理时间之间会有相关性。 I/O 会很慢,但在那之后我看不到它,这取决于函数的长度。@ fyrye 当然,必须有一些防止这种情况的保护
  • 更好的解决方案是将 $row['source'] 数据保存到一个物理唯一的文件名,而不是在数据库中。然后使用 $row['source'] 来存储唯一的文件名。检索行值时,调用include $row['source']; 降低数据库数据大小,并依赖 IO 进行包含。至于安全风险,OP 似乎正在尝试实施一个执行 PHP 代码的 CMS,这是不可取的。至于线程活动,您的回答将其推到了列表的顶部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多