0

我有几个字符串存储在数据库中(是的,我知道这不是最佳实践,但我正在使用其他人设计的系统,我无法更改它。)

例如,在我的名为 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?

4

2 回答 2

1

您在返回部分中逃避了 $request,这是您不想做的。这种方法应该可以工作,但我建议添加返回数据库中的行,这样你就不必修改 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 );
于 2013-01-15T22:22:07.177 回答
-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”,因此如果您知道在其他地方还使用了这种脑残方法,那么您可以在数据库中替换它……如果没有,至少您已尽力而为。

于 2013-01-15T22:27:37.993 回答