2

データベース内にデータを保存する必要があります。データベースからデータを取得するときは、文字列内の関数と変数をそのように処理する必要があります。

$str = "<p>Dear {$this->name},</p>"

次に、これをデータベースに保存し、文字列を取得して実行するときに

eval("\$detail= \"$detail\";");

次に、変数に名前が入力されます。これはまさに私が必要としていたものであり、正常に動作します。

問題は、この変数をパラメーターとして関数を実行したいということです。

例。ucwords変数にしたいです。

私が試してみました:

$str = "<p>Dear {ucwords($this->name)},</p>"  //just echoed {ucword(->name)},
$str = "<p>Dear {ucwords($this->name)},</p>"  //Fatal error: Function name must be a string,

私は正しい方向に進んでいますか?これはまったく可能ですか?

4

3 に答える 3

3

PHPコードをデータベースに保持する必要はありません。これは悪い習慣であり、セキュリティの脆弱性につながる可能性もあります。

代わりに、次のようにデータベース文字列に格納します。

<p>Dear [name],</p>

そして、あなたがそれを取得するとき、あなたはただすることができます:

$stringFromDb = str_replace("[name]", $this->name, $stringFromDb);

また

$stringFromDb = str_replace("[name]", ucwords($this->name), $stringFromDb);

他の一般的なアプローチは、を使用することsprintfです。%sしたがって、値のプレースホルダーとしてデータベース文字列に格納する必要があります。

例:

<p>Dear %s,</p>

と置き換えます

$stringFromDb = sprintf($stringFromDb, ucwords($this->name));
于 2013-01-09T14:56:57.403 に答える
1

あなたが探しているように見えるのは、単純なテンプレート言語です。

PHP を書いてからずいぶん経ちますが (その理由を突然思い出しました...)、ここに私が作り上げたものがあります。

$a->nameオブジェクト ( ) と配列 ( )の両方$a["name"]を入力オブジェクトとしてサポートする必要があります。

に新しいフィルター (名前 -> 関数名のマッピング) を追加できます$valid_filters

$valid_filters = array("title" => "ucfirst", "upper" => "strtoupper");

function _apply_template_helper($match) {
  global $_apply_template_data, $valid_filters;
  $var = $match[1];
  $filter = $valid_filters[trim($match[2], ':')];
  $value = is_array($_apply_template_data) ? $_apply_template_data[$var] : $_apply_template_data->$var;
  if($filter && !empty($value)) $value = call_user_func($filter, $value);
  return !empty($value) ? $value : $match[0];
}

function apply_template($template, $data) {
  global $_apply_template_data;
  $_apply_template_data = $data;
  $result = preg_replace_callback('/\{\{(.+?)(:.+?)?\}\}/', "_apply_template_helper", $template);
  $_apply_template_data = null;
  return $result;
}

それの使い方:

$template = "Hello {{name:title}}, you have been selected to win {{amount}}, {{salutation:upper}}";
echo apply_template($template, array("name"=>"john", "amount" => '$500,000', "salutation" => "congratulations"));

結果:

こんにちはジョン、あなたは $500,000 の当選者に選ばれました。おめでとうございます

于 2013-01-09T15:26:19.553 に答える
0

私は次の作品を見つけました、

クラス自体に関数が含まれている場合は、次のコードを使用して呼び出すことができます

<p>Dear {\$this->properCase(\$this->rl_account->name)},</p>

しかし、Alex Amiryanが前述したように、データベースにコードを持たせずに、これを実行できるようにしたいと思います。

于 2013-01-09T15:11:46.153 に答える