2012-01-09 110 views
0

我有一個表單,用戶可以更改他已經在數據庫中的個人信息。 什麼是最好的解決方案,只更新數據庫字段被更改,而不是所有可用的表單選項。PHP更新用戶信息

如果您有更好的建議,而不是將所有內容放在一個表格中,請告訴。

+1

你使用任何一種框架? – cmbuckley 2012-01-09 12:13:33

+0

在wamp服務器上的PHP/MYSQL,沒有框架,在記事本中編寫代碼。 – 2012-01-09 12:14:19

+2

唯一真正的傻瓜證明方法是在新數據提交後,在服務器端驗證/比較新數據與原始數據。這意味着你必須在'UPDATE'之前再次選擇''',或者在某種會話中存儲原始'SELECT'的結果。 – DaveRandom 2012-01-09 12:16:38

回答

2

更新整個用戶記錄,不考慮哪些字段發生了變化,哪些字段沒有發生變化。

一次更新所有字段的時間和內存效率大致與查詢哪些字段已更改相同。其實,你只是浪費你的時間逐一檢查字段,看看哪些更新。所以在更新之前進行這種檢查是沒有意義的。

1

提交更新表單後,您應該通過觸發選擇查詢where id = xyz然後檢查if($_POST['textboxname'] == $row['colname'])來檢查值,如果發現有任何更改,則添加到更新查詢其他明智地跳過該值。

如果你已經在這裏寫你的代碼,那麼這可能很容易理解你。

2

假設MySQL和你不介意使用會話,這裏是一個辦法做到這一點:

<?php 

    // Start the session 
    session_start(); 

    // The name of the table in the database 
    $table = 'table_name'; 
    // The primary key of the record we are dealing with 
    $id = 1; 
    // The name of the column that holds the primary key 
    $pkCol = 'id'; 

    // Connect to database somewhere here and store it in $conn 

    if (!empty($_POST['update'])) { 

    // Update the record 

    // Compare values from $_POST with values from $_SESSION and build an array of data that has changed 
    $changes = array(); 
    foreach ($_SESSION['original_data'] as $colName => $value) { 
     if ($_POST[$colName] != $value) { 
     $changes[] = "$colName = '".mysqli_real_escape_string($conn, $_POST[$colName])."'"; 
     } 
    } 

    // Build the query 
    $query = "UPDATE $table SET ".implode(', ', $changes)." WHERE $pkCol = {$_SESSION['record_id']}"; 

    // Do the query 
    if (!mysqli_query($conn, $query)) exit("Unable to update record in database"); 

    } 

    // generate the form 

    // Get original data from DB and store it in the session 
    $query = "SELECT * FROM $table WHERE $pkCol = $id"; 
    if (!$result = mysqli_query($conn, $query)) exit("Unable to get record from database"); 
    $_SESSION['original_data'] = mysqli_fetch_assoc($result); 
    $_SESSION['record_id'] = $id; 

    // Echo start of HTML page 
    echo "<html> 

    <head> 
    <title>Record update example</title> 
    </head> 

    <body> 
    <form method='post' action=''> 
     <input type='hidden' name='update' value='1' /> 
"; 

    // Generate inputs from data 
    foreach ($_SESSION['original_data'] as $colName => $value) { 
    if ($colName != $pkCol) { 
     $colName = htmlspecialchars($colName); 
     $value = htmlspecialchars($value); 
     echo "  $colName: <input type='text' name='$colName' value='$value' /><br />\n"; 
    } 
    } 

    // Close off HTML 
    echo " </form>\n </body>\n</html>"; 
1

你可以做侯賽因提出什麼(+1,順便說一句),或者你可以標記以某種方式更改項目,並且您可以將項目映射到您的ID。