2

良い一日、

スクリプトに問題があります。私がやっていることは次のとおりです。

ユーザーにメールを送信したい。サインアップ確認用のデザイン、最近のニュース用のデザインなど、さまざまな種類のメール用にさまざまなテンプレートがあります。そこで、テーブルを作成し、各デザインを content という列に完全な HTML コードとともに保存しました。

この目的のために、私のデータベース設計は非常に単純です。

ID    |    type    |    content

1     |   signup   |    <html> ... <body> .. content of email ... </body></html>

だから、右上は私のデータベースです。ID 1 のフィールド 今、誰かがサインアップしたときに、上の表からコンテンツを取得した電子メールを彼に送信しようとしています。コンテンツ フィールドの下のテキストは次のようになります。

<html>
.
.
<body>
Good Day,

You have successfully created your account.
Please activate your account now by clicking below:

<a href="activate.php?md5=$md5&code=$code">ACTIVATE</a>

</body>
</html>

上記のコードでは、アクティベート リンクをチェックアウトする場合、PHP 変数 $md5 と $code を使用しました。対応する値が実際の電子メールに出力されると考えています。ただし、 $md5$codeのようにそのまま出力されます。

まあ、私はほとんど調査をしなかったし、いくつかのフォーラムからそれを知った.

1 つ目: HTML テンプレートのコンテンツをこれらの PHP 変数と共にデータベースに追加しましたが、それらはデータベースの列自体の値になり、PHP 変数として扱われなくなりました。

2番目: eval()関数を使用して動作させたと主張する人がいます。セキュリティの観点から、ユーザーではなくデータベースから値を取得しないため、evalを使用できます。試してみましたが、まだ何もありません。

以下は、eval() で試したコードです。

$md5    =   $row['md5'];  // These variables values I'm expecting to come in template content
$code   =   $row['activ_code'];  // These variables values I'm expecting to come in template content

ob_start();
eval("\$template_content = \"$template_content\";");
$message    =   $template_content;
ob_end_clean();

誰かがこれで私を助けることができますか? メール機能を使用している同じページに完全なテンプレート (HTML) を配置したくありません。コードを短くきれいに保つ代わりに、コードを醜く見せます。

助けてください!

4

4 に答える 4

3

str_replace http://php.net/manual/en/function.str-replace.phpを使用して、これらの変数をタグ (%MD5% など) に置き換えます。$code を引き続き使用することはできますが、これは読み取り可能ではなく、間違ったテキストが置換される可能性があります (文字列「this was $codeveloped」を考えてください)。

混合 str_replace (混合 $search 、混合 $replace 、混合 $subject [, int &$count ] ) この関数は、指定された置換値で置き換えられた、件名内の検索のすべての出現を含む文字列または配列を返します。

それで、

$template_content = '<a href="activate.php?md5=%MD5%&code=%CODE%">ACTIVATE</a>';
$template_content = str_replace("%MD5%", $md5, $template_content);
$template_content = str_replace("%CODE%", $code, $template_content);

str_replace も引数として配列を受け入れるので、これはより良いものかもしれません

$placeholders = array("%MD5%", "%CODE%");
$values = array($md5, $code);
$template_content = str_replace($placeholders, $values, $template_content);

Eval は潜在的に危険であり、一般的にやり過ぎです

于 2013-07-30T10:09:08.233 に答える
1

あなたの問題は、評価しているテキストの二重引用符です。

機能させるには、それらをエスケープする必要があります。

eval("\$template_content = \"" . addslashes($template_content) . "\";");
$message = $template_content;

その後、問題なく動作します。

完全な動作例を次に示します。

$template_content = '<html>
.
.
<body>
Good Day,

You have successfully created your account.
Please activate your account now by clicking below:

<a href="activate.php?md5=$md5&code=$code">ACTIVATE</a>

</body>
</html>';


$md5    =   "HEREGOESMD5";
$code   =   "CodeCodeCodeCode";

eval("\$template_content = \"" . addslashes($template_content) . "\";");
$message = $template_content;

echo $message;
于 2013-07-30T10:24:36.027 に答える
0
<php
echo '<a href="activate.php?md5='.$md5.'&code='.$code.'">ACTIVATE</a>';
?>
于 2013-07-30T10:14:29.133 に答える