0

編集: PHPを更新して、$ _ POSTハンドラーの配列から文字列への変換の問題を解決しました。whileループは正しい数のエントリを表示し、文字列を正しく置き換えますが、各ループのデータベースの最初のエントリの置き換えられた値のみを表示します終えた。

私は現在、テンプレートシステムを使用して人々に一括メッセージを送るシステムを構築しています。<{}>タグに含まれる値は、データベース結果の値に置き換えられます。たとえば、書き込まれるメッセージは次のようになります。

こんにちは<{firstname}><{lastname}>、<{date}>に<{product}>をご購入いただきありがとうございます。

置き換えられた結果は次のとおりです。

こんにちはジョーBloggs、2013年1月1日にスマートフォンをご購入いただきありがとうございます。

置換されるフィールドはデータベースから動的に作成され、データベースはユーザーがCSVドキュメントをアップロードすることによって作成されます。これは、フィールド名が予測できないことを意味し、show columns from tableSQL関数を使用して、探している名前を入力しています。

投稿された値から値を取得して、mysql_assocループを介して文字列内の値を置き換えるのに苦労しています。

フォーム入力のHTMLは、show columns各結果のからのPHPループを使用して作成され、各入力は次のようになります。

<input type="hidden" name="fields[]" value="column name" />

そしてtextarea:

<textarea name="message"></texarea>

これを処理する私のPHPは次のとおりです。

if(isset($_POST['fields'])) {
    $strings = array();
    foreach($fields as $f) {
        $strings[] = "/<{".$f."}>/";
    }
    $replace = $_POST['fields'];
}

そして、現在のループは次のとおりです。

$query = "select * from $table_name";
    $result = mysql_query($query) or die(mysql_error());
    $string = $_POST['message'];
    $pattern = $strings;

    while($name = mysql_fetch_array($result, MYSQL_ASSOC)) {
    foreach ($replace as $r) {
        $replacement[] = $name[$r];
    }
    $message = preg_replace($pattern, $replacement, $string);
    echo "<p>$message</p>";
    }

$table_nameドキュメントの先頭で宣言されています。

投稿は機能し、作成された配列は正しいように見えるので、私の問題はwhileループの内容にあると思います。現在のところ、何も返されません。配列に正しい置換値を取得し、$name[]ループ$replacementして各メッセージが正しくフォーマットされるようにするにはどうすればよいですか?

4

2 に答える 2

0

あなたはsprintfを見てみるべきです、もっと簡単かもしれません。

于 2013-02-19T13:23:16.097 に答える
0

問題を解決しました。$replacement = array();前に宣言する必要がありましたforeach。最終的な結果は次のとおりです。

while($name = mysql_fetch_array($result, MYSQL_ASSOC)) {
$replacement = array();
foreach ($replace as $r) {
    $replacement[] = $name[$r];
     }
  $message = preg_replace($pattern, $replacement, $string);
  echo "<p>$message</p>";
}
于 2013-02-20T10:59:23.047 に答える