评估存储在数据库中的PHP代码

时间:2013-01-15 22:19:49

标签: php eval

我有几个字符串存储在数据库中(是的,我知道这不是最好的做法,但我正在使用别人设计的系统而且我无法改变它。)

例如,在我的名为specialDates的表中,我有一个包含以下内容的computedDate列:

 date('d', strtotime("thursday, november ".date("Y")." + 3 weeks")) 

将其存入我的代码并存储在名为$request['order_date']的变量中。

当在标准PHP代码中使用时,返回感恩节在当前年份所处的日期。我需要将此评估值(对于今年 - 2013年 - 值为28)传递给另一个查询。但我似乎无法获得评估的价值。

$query = 'SELECT count(orderID) as numberOfOrders FROM customer_orders WHERE customerID = ? AND orderDate = ?';
$param = array($request['customer_id'], eval($request['order_date']));

不起作用。当我试图将值反映到屏幕上时,执行此操作:

echo eval($request['order_date']);

或者这个:

echo eval(" return \$request['order_date']; ");

只打印出字符串的字面值(即date('d' etc.)而不是预期的评估值。

我做错了什么?

已更新 我在下面尝试了AScherer的答案,虽然当我只是将值反映到屏幕时它确实有效:

echo eval(" return {$request['order_date']}; ");

当我尝试在我的数组中使用eval时,它不起作用:

$param = array($request['customer_id'], eval("return {$request['order_date']}"));

我怎样才能使这个工作,以便我在数组中传递的值是实际值28,而不是字符串pre-eval?

2 个答案:

答案 0 :(得分:1)

你在退货部分逃避了$请求,你不想这样做。这个方法应该可行,但id建议添加返回数据库中的行,这样你就不必修改eval

$sql = "SELECT customer_id, CONCAT( 'return ', order_date, ';' ) as function from customer_orders WHERE customerID = ? AND orderDate = ?";
$param = array( $request[ 'customer_id' ], eval( $request[ 'function '] ) );

---
OR
---

$evalData = eval(" return {$request['order_date']}; ");
$param = array($request['customer_id'], $evalData );

答案 1 :(得分:-1)

是的,你可以改变它。如果不是一个明智的结果,那么就是一个有用的结果。

您的输入数据是一个字符串:

date('d', strtotime("thursday, november ".date("Y")." + 3 weeks"))

这是“计算今年感恩节”的信息。您可以设置一个查找表来检测此字符串以及要执行的所需函数:

$dateCalculations = array(
    'date(\'d\', strtotime("thursday, november ".date("Y")." + 3 weeks"))' => function() 
        {
            return date('d', strtotime("thursday, november ".date("Y")." + 3 weeks"));
        }
    'date(\'...whatever else is in the system...' => function(){}

    // alias names also work
    'thanksgiving' => function()
        {
            return date('d', strtotime("thursday, november ".date("Y")." + 3 weeks"));
        }
);

然后,您可以尝试从数组中的数据库中查找字符串,并立即获得您需要调用的函数:

$thanksgiving = $dateCalculations[$dbvalue]();

从这里你可以去任何地方。请注意,这也适用于别名“thanksgiving”,所以如果你知道这个脑卒中的方法还在哪里使用,你也许可以在数据库中替换它......如果没有,至少你已经尽了最大努力。< / p>