2013-11-26 45 views
1

我正在嘗試嘗試通過使用PHP的表單來查找通過表單更改給定表中數據的最佳和最有效的方法。更新或只插入已更改的列

該場景是一個表中的項目列表,如果您右鍵單擊編輯項目,則向MySQL請求所有數據並填充字段。

用戶可以在任何字段中更改或保留數據,然後按下保存,將所有內容都發送回PHP。

最簡單的辦法是隻更新所有列,無論它們是否發生了變化,即:

$this->model->set('name', 'some name string from the form', $itemId); 
$this->model->set('price', 'number from the form', $itemId); 
...etc... 

所以可能我可以改變只是名稱和不必要的更新列,其餘與收到的數據相同的數據。 (作爲一個側面的問題,MySQL是否知道這一點,並忽略幕後更新?)

執行智能更新的好方法是比較兩個數組嗎?一個包含原始數據,另一個包含來自用戶的數據。如果給定索引的值不匹配,那麼它必須已經更改,更新也如此?

即一個很簡單的例子:

if($submittedValues['name'] != $originalValues['name']) 
{ 
    ...Update... 
} 

回答

0

我想你回答你的問題,你可以比較兩個數組,無論是在你的PHP代碼或使用JavaScript和,而不是每一件事發送到服務器,只發送更改的值。

但一般來說,我不會在意是否重置所有數據,再次影響所有字段的過程可能比在數組中新舊數據之間進行比較更快,如果我正在進行多次查詢,我會非常小心到數據庫,但它只有一個更新查詢


什麼能測試有意思的是,當用戶左派空字段,然後將請求發送一個空字符串,在結束它的更新請求將插入一個空字符串,其中NULL值會有更好的含義

+0

在NULL值的情況下,我會得到它只是EM pty列中的值。如果它是存儲在左連接的表中的值,例如,項目序列號,其中不是每個項目都有一個,它會刪除一行。 – imperium2335

+0

複選框也可能會導致問題,因爲他們沒有出現在請求中,如果他們沒有打勾,即你不會得到...&checkbox1 =&somethingelse = ... – imperium2335

+0

是的複選框,你應該在後端處理(PHP的腳本)如果沒有值被髮送,那將意味着它沒有被選中 –