2012-12-05 57 views
0

我想更新mysql數據庫中的一行。要做到這一點,我會用一個簡單的查詢是這樣的:爲動態數據庫創建更新查詢

"UPDATE `contactinfo` SET `Company` = 'Google', WHERE `id` = '1';" 

的問題是,該數據庫是動態的,用戶可以隨時添加列。所以我不知道列的名字。要找到名稱和創建表單張貼到會怎麼做MySQL的工作頁面使用此代碼:

<?php 
      $result = mysql_query("select * from contactinfo WHERE `id` = '".$rid."';"); 

      if (!$result) { 
       die('Query failed: ' . mysql_error()); 
      } 
      $i = 0; 
      while ($i < mysql_num_fields($result)) { 
       $meta = mysql_fetch_field($result, $i); 
       if (!$meta) { 
        echo "ERROR"; 
       } 
       $name = $meta->name; 

       $r = mysql_fetch_array(mysql_query("select * from contactinfo WHERE `id` = '".$rid."';")); 
       $content = $r[$name]; 

       if($name != 'id') { 
        echo "<tr><td align='center'><div align='left'>Edit ".$name."</div></td></tr>"; 
        echo "<tr><td align='center'><input type='text' value='" . $content . "' /></td></tr>"; 
       } 
       $i++; 
      } 
      mysql_free_result($result); 
     ?> 

這與輸入框,允許用戶編輯的內容創建了一個可愛的小表已被選中的行。行ID號($ rid)用於識別哪一行需要更改。

我的問題是,我如何從發佈的表單獲取行的新內容並創建一個查詢來更新它?我似乎無法弄清楚如何動態獲取表單的名稱以及寫入查詢的新內容。

如果需要澄清,請讓我知道,所有幫助表示讚賞。

謝謝。

+0

我試圖寫一個while循環來獲取帖子,並給他們所有的尊重變量,但由於我不知道在$ _POST ['名字'] – Olokoo

+0

@ Ian34中使用失敗 - 請記住$ _POST只是一個關聯數組,所以即使你不知道它們是什麼,你也可以獲得所有的鍵(字段名)。像這樣'foreach($ _ POST作爲$ key => $ value)' –

回答

2

最簡單的方法是在窗體中命名數據庫中字段的名稱。 比方說你有這種形式

<form action=""> 
    <input name="field[firstname]"> 
    <input name="field[lastname]"> 
    <input name="field[address]"> 
</form> 

你或許應該能夠創建基於字段名稱的表格也一樣,你可能已經這樣做了。 在該處理響應,你可以做這樣的事情的文件:

foreach($_POST['field'] as $field_name => $field_value) { 
    $sql_str[] = "{$field_name} = '{$field_value}'"; 
} 

這只是去通過來自後,提出適當的更新文本到另一個數組的「場」陣列。 然後只要做一個

mysql_query("UPDATE contactinfo SET ".implode(',', $sql_str)." WHERE `id` = '".$rid."';") 

把它放到數據庫中。

+0

哇,這個工作完美。永遠不會這樣做。謝謝! – Olokoo

+0

我建議你使用一個框架,它可能會讓你更容易:)。有一些很棒的東西會幫助你很多。 –

0

你可以做的是用一個位標誌在數據庫中添加一列,如果用戶是新的或舊的,該標誌將反映它。 用這種方法你可以更新用戶來說它是新的還是舊的。

希望這有助於。

0

您可能會很好地調查是否有可以使用的ORM框架。

無論如何,最簡單的做法是通過INPUT字段中的字段名稱。

$content = AddSlashes($content); // You may need HTMLEntities() here 

$field = <<<FIELD 
    <input type="text" value="$content" /> 
FIELD; 

此外,另一個有用的技巧是提供一個「受保護」字段的數組,或指定一個使字段不可更改的前綴。例如,你幾乎肯定不希望用戶能夠更改主鍵。

所以,你可以生成形式

if ('id' == $meta->name or 'pk' == $meta->name or (0 === strpos($meta->name, 'pk_'))) 
{ 
    // This is a primary key field 
    $html .= <<<PKFIELD 
    <input type="hidden" name="{$meta->name}" value="{$contents}" /> 
PKFIELD; 
    continue; 
} 
if (0 === strpos($meta->name, 'hf_')) 
{ 
    // hidden field, ignored (can't be changed) 
    continue; 
} 
if (0 === strpos($meta->name, 'ro_')) 
{ 
    // read-only field, shown but without even the name 
    $html .= <<<ROFIELD 
    <input type="text" readonly="readonly" class="readonly" value="{$contents}" /> 
ROFIELD; 
    continue; 
} 

或者你可以使用一個固定大小的前綴和模板的數組:

$fieldtpls = array(
    'pk_' => '<input type="hidden" name="{NAME}" value="{VALUE}" />', 
    'ta_' => '<textarea name="{NAME}">{VALUE}</textarea>', 
    'ro_' => '<input type="text" value="{VALUE}" readonly="readonly" />', 
); 

那麼你分析每個領域,將默認除非使用已知的前綴。您的用戶將不得不相應地命名字段。另一種可能性是允許一個「元表」來保存每個表和字段的類型和處理,但在這種情況下,您需要通過爲Meta創建一種「管理編輯器」來使用戶界面複雜化一些表:

table field type rw parameters 
users name text yes 
users id  hidden no 
users role text no 
users notes area yes class:"widearea" 

...和方式 ORM框架。