0

データベースにいくつかの文字列が保存されています(はい、それがベストプラクティスではないことはわかっていますが、他の誰かが設計したシステムで作業しているため、変更できません)。

たとえば、specialDatesというテーブルには、次の内容を含むcalculatedDate列があります。

 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になるように、これを機能させるにはどうすればよいですか?

4

2 に答える 2

1

あなたはあなたがしたくないあなたのリターン部分で$requestを逃れていました。このメソッドは機能するはずですが、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 );
于 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]();

ここからどこへでも行けます。これはエイリアス名「感謝祭」でも機能することに注意してください。そのため、この頭がおかしいアプローチが使用されている他の場所を知っていれば、データベースで置き換えることができるかもしれません...そうでない場合は、少なくとも最善を尽くしました.

于 2013-01-15T22:27:37.993 に答える