2013-08-01 108 views
0

我有一個從PHP數據庫動態生成的表(這對我來說是一個勝利)。用戶可以按照她想要的方式輸入更改字段和記錄數連接在一個查詢字符串中的多個記錄

在點擊提交時,更新的記錄應該在數據庫中更新。我可以逃脫更新所有記錄,甚至沒有改變,但這是有點跛腳。我已經得到了序列化的數據字符串,它看起來像:

類別=電話& error_level = 1個& SERVICE_NAME = API &狀態=嚴重&筆記=無&類別=電話& error_level = 1 & SERVICE_NAME =內向+呼叫&狀態=嚴重&筆記=無&類別=電話& error_level = 2 & SERVICE_NAME =出站+呼叫&狀態=輕微+問題&筆記=無&類別=消費& error_level = 1 & SERVICE_NAME = www.website1.com &狀態=嚴重&筆記=無&類別=消費& error_level = ...

但是,我不知道如何着手;即我不知道如何處理這個查詢字符串。它現在包含所有行的所有值。我如何將它分解成記錄,以及如何在數據庫中更新它們?

我認爲將它們拆分爲具有正則表達式的行,然後迭代列表......但對我來說似乎很難受。有什麼想法嗎?

+0

用'&'分割。然後循環對。用'='分割它們,並將它們放入地圖中。爲什麼這樣哈克? – Ian

+0

僅僅因爲我還在學習,而且我不想在一個更好的解決方案已經存在的情況下做一些過度參與。 – thumbtackthief

+0

(即使用正則表達式,當有爆炸功能,我不知道) – thumbtackthief

回答

3

如果要獲取所有值,則不能使用多次相同的參數名稱。在這種情況下你只會得到一個值。

您可能需要做的是在輸入字段名稱中使用數組訪問表示法。

我假設你有每行的某種類型的整數ID,以便你知道數據庫中的行ID,並且可以將其返回。如果是這樣的話,你可以有你這樣的輸入:

(注:爲簡單起見,我顯示在表格中輸入既然你提到你有一個表)

<tr> 
    <td><input name="some_column_name[1]" ... /></td> 
    <td><input name="another_column_name[1]" ... /></td> 
    <td><input name="third_column_name[1]" ... /></td> 
</tr> 
<tr> 
    <td><input name="some_column_name[2]" ... /></td> 
    <td><input name="another_column_name[2]" ... /></td> 
    <td><input name="third_column_name[2]" ... /></td> 
</tr> 

注意如何在價值每個name屬性的括號將是該行的整數ID。現在

當你發佈此數據,PHP將裝配陣列在$_POST這樣的:

var_dump($_POST['some_column_name']); 
var_dump($_POST['another_column_name']); 
var_dump($_POST['third_column_name']); 

將輸出:

Array([1] => 'some value', [2] => 'some other value'); 
Array([1] => 'some value 2', [2] => 'some other value 2'); 
Array([1] => 'some value 3', [2] => 'some other value 3'); 

如果你想在一個多維度的所有張貼的值陣列,你甚至可以考慮做這樣的事情:

<tr> 
    <td><input name="table_data[1][some_column_name]" ... /></td> 
    <td><input name="table_data[1][another_column_name]" ... /></td> 
    <td><input name="table_data[1][third_column_name]" ... /></td> 
</tr> 
<tr> 
    <td><input name="table_data[2][some_column_name]" ... /></td> 
    <td><input name="table_data[2][another_column_name]" ... /></td> 
    <td><input name="table_data[2][third_column_name]" ... /></td> 
</tr> 

其中,當發佈時,會給你一個陣列像

Array 
([1] => Array(
    ['some_column_name'] => 'value', 
    ['another_column_name'] => 'value', 
    ['third_column_name'] => 'value' 
    ), 
[2] => Array(
    ['some_column_name'] => 'value', 
    ['another_column_name'] => 'value', 
    ['third_column_name'] => 'value' 
    ) 
) 

你可能會發現這更容易處理。

+0

+1,這是一個很好的答案。 – Matt

0

使自己熟悉陣列和JSON

JSON將幫助您序列化從JavaScript到PHP的數組。在PHP中,您可以遍歷(PHP)數組,然後處理數組的記錄並根據需要插入/更新到數據庫。

您不能像上面開始的那樣手動完成此操作,但要保留JavaScript和PHP的功能。

1

使用「&」作爲分隔符來分解您的數據字符串。循環遍歷結果數組,並使用「=」作爲分隔符分解每個項目。

但是你不能發送沒有編碼的字符串,否則PHP可能會在「&」字符處分割它,可能會造成混亂。或者,您可以獲取原始發佈數據並使用該字符串嘗試。

發送整個表格可能更容易,真的。

+0

爆炸聽起來很有希望(我剛剛知道它存在)。我要去調查,但首先: 我認爲這是原始數據。我從$(表單).serialize()獲得它。我錯了嗎? – thumbtackthief

+0

有幾種方法可以在PHP中獲取發佈數據。通常,您將使用$ _POST數組。這適用於格式與您的字符串格式一樣的表單和AJAX發佈數據。如果您將它作爲表單值發送,那麼它會是'val = blah .....',其中blah是您在上面發佈的字符串。然後你會在$ _POST ['val']中找到它。或者你可以把它作爲'php:// input'中的一大塊,並按我的建議進行解析。 – 2013-08-01 16:26:08

+0

您是否通過AJAX發送此內容?這簡化了事情。但首先要照顧別人提到的其他問題。 – 2013-08-01 16:29:46

0

現在看起來是這樣的

category=Phone 
error_level=1 
service_name=API 
status=Critical 
notes=None 

category=Phone 
error_level=1 
service_name=Inbound+Calls 
status=Critical 
notes=None 

category=Phone 
error_level=2 
service_name=Outbound+Calls 
status=Minor+issue 
notes=None 

category=Consumer 
error_level=1 
service_name=www.website1.com 
status=Critical 
notes=None 

目前,還沒有辦法區分不同的記錄,這樣你是不是能夠運行一個if語句來檢查,看看是否該記錄已更新。如果可以添加另一個包含行唯一ID的輸入字段(即使它是隱藏的),則可以運行If語句來檢查記錄是否已更改,然後在該行上運行MySQL Update語句。

沒有東西獨特的檢查,看它是否已被更新我只是刪除所有的行,並閱讀它們與每行的插入語句。