我有几个字符串存储在数据库中(是的,我知道这不是最好的做法,但我正在使用别人设计的系统而且我无法改变它。)
例如,在我的名为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?
答案 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>