2014-01-08 123 views
0

我有一個很難包裝我的頭周圍的foreach結構。我發現了很多當然的例子,但我似乎無法使它們適應我的需求。PHP foreach結構混亂

請考慮這個工作的例子,我有:

我收集兩個日期在HTML表單:

<form method="post"> 
    <legend>Minutes and Records</legend> 

    <label for="FirstAGMDate">First AGM Date (only if known)</label> 
    <input type="text" name="FirstAGMDate" value="2014-01-01" /> 

    <label for="MinutesInspectedFromDate">Minutes Inspected From Date</label> 
    <input type="text" name="MinutesInspectedFromDate" value="2014-01-02" /> 

    <input type="submit" name="submit" /> 
</form> 

在提交的值被推到MySQL數據庫與PDO準備語句:

if (isset($_POST['submit'])) { 
    $sql = "UPDATE jobsinglevalues SET Date = :FirstAGMDate WHERE FormId = 0; 
      UPDATE jobsinglevalues SET Date = :MinutesInspectedFromDate WHERE FormId = 1;"; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':FirstAGMDate'=>($_POST['FirstAGMDate']), ':MinutesInspectedFromDate'=>($_POST['MinutesInspectedFromDate']))); 
} 

這種方法沒有問題,但是當我需要爲一打輸入重複此操作時,這並不是很聰明。我想要做的只是使用一行sql來實現這一點;循環爲每個<input type="text" name="Value" />

我怎樣才能把它變成foreach循環?

在我的腦海它的工作原理是這樣的:

在提交每個輸入更新基於FormId在數據庫中的值,它遞增1每次循環從0開始。FormId不是一個主鍵,它只是簡單地反映了表單元素的顯示順序。

更新 - 工作示例

if (isset($_POST['submit'])) { 
$FormId = 0; 
    foreach($_POST['Value'] as $avalue){ 
     $sql = "UPDATE jobsinglevalues SET Date = :Value WHERE FormId = :FormId"; 
     $sth = $db->prepare($sql); 
     $sth->execute(array(':Value'=>($avalue), ':FormId'=>($FormId))); 
     ++$FormId; 
    } 
} 

這似乎邏輯上的工作給我!正確的解決方案是否類似?請讓我知道是否需要澄清任何事情。

三江源,

山姆

+1

首先,你需要獲取值的從柱的陣列,所以不是'<輸入名稱=「值」>''使用<輸入名稱=「值[]」>'。然後,您可以使用'foreach($ _ POST ['Value']作爲$ avalue){...}'在'foreach'中的語句中使用'$ avalue'變量。 – towr

+0

這應該是一個答案.. –

+0

@towr完美!這對我來說很有意義(!),並且可以用作一種享受。請作爲回答發佈,以便我可以upvote並將其標記爲正確的答案! – misterManSam

回答

1

讓我們確保我們所有的價值都在發佈後的數組開始;如果你不關心密鑰,你可以使用name="Values[]",但我會使用name="Value[FirstAGMDate]"等,所以我們知道一個值屬於什麼關鍵。

<form method="post"> 
    <legend>Minutes and Records</legend> 

    <label for="FirstAGMDate">First AGM Date (only if known)</label> 
    <input type="text" id="FirstAGMDate" name="Value[FirstAGMDate]" value="2014-01-01" /> 

    <label for="MinutesInspectedFromDate">Minutes Inspected From Date</label> 
    <input type="text" id="MinutesInspectedFromDate" name="Value[MinutesInspectedFromDate]" value="2014-01-02" /> 

    <input type="submit" name="submit" /> 
</form> 

現在我們可以處理髮布的數組值。如果我們想用鑰匙做點什麼,我們可以使用foreach($_POST['Value'] as $akey => $avalue),如果我們只對數值感興趣,那麼foreach($_POST['Value'] as $avalue)就足夠了。

$sql = "UPDATE jobsinglevalues SET Date = :Value WHERE FormId = :FormId;"; 
$sth = $db->prepare($sql); 
foreach($_POST['Value'] as $akey => $avalue) { 
    $sth->execute(array(':Value' => $avalue, ':FormId'=> $FormId)); 
    ++$FormId; 
} 

[編輯]按照由@AravindKishore編輯建議,創造了準備好的聲明循環之前做得更好。準備一次,永遠享受。