preg_replace一个字符串中的值,其值来自mysql assoc while循环

时间:2013-02-19 10:56:13

标签: php arrays while-loop preg-replace

编辑:更新了PHP以解决$ _POST处理程序中的数组到字符串转换问题,while循环现在显示正确的条目数并正确替换字符串,但只显示替换的值对于每个循环的数据库中的第一个条目。

我目前正在构建一个使用模板系统批量发送消息的系统。 < {}>中包含的值标签将被数据库结果中的值替换。例如,写入的消息可能是:

  

您好< {firstname}>< {lastname}>,感谢您购买< {product}>在< {date}>。

将替换后的结果视为:

  

您好Joe Bloggs,感谢您在2013年1月1日购买智能手机。

要替换的字段是从数据库动态创建的,而数据库又是由用户上传CSV文档创建的。这意味着字段名称是不可预测的,我正在使用show columns from table SQL函数来填充我要查找的名称。

我正在努力从我的发布值中获取值,以通过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数组然后循环,以便正确格式化每条消息?

2 个答案:

答案 0 :(得分:0)

你应该看看sprintf,可能会更容易。

答案 1 :(得分: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>";
}