2013-02-19 20 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