2013-02-19 87 views
0

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

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

您好< {}名字> < {}姓氏>,感谢您购买< {}产品的>上< {日期和时间}>。

随着替换结果为:

你好李四,感谢您在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在文档的开头声明。

该文章的作品,并创建阵列似乎是正确的,所以我认为我的问题是与 内循环。到目前为止,它什么都不返回,我怎样才能得到$name[]的正确替换值到$replacement数组中,然后循环遍历,这样每个消息的格式都是正确的?

+0

'$ strings =“/<{".$_POST['fields']。“}> /”;' - 数组到字符串的转换,看看错误日志 – BattleBit 2013-02-19 11:38:04

+0

我修正了:'$ fields = $ _POST ['fields']; \t \t $ strings = array(); \t \t的foreach($字段$ F){ \t \t \t $串[] = “/ <{".$f."}> /”; \t \t}' 但它现在循环条目总数的结果的第一个条目。 – Matt 2013-02-19 12:02:48

回答

0

好的我已经解决了这个问题,我需要在foreach之前声明$replacement = array();。最终结果如下:

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>"; 
} 
0

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

+0

你能提供一个关于如何工作的例子吗?从我从PHP Docs站点了解到的情况来看,sprintf和vsprintf都需要以特定方式对初始字符串进行格式化,这意味着用诸如%s之类的内容替换<{}>包含的短语,这需要使用不同替换的附加循环功能。 – Matt 2013-02-19 13:58:58