2017-05-04 64 views
0

我正在研究一個需要profil的項目,其中的人員可以修改其信息。從PHP構建SQL更新語句的最佳方法

它的工作,但我想知道:什麼是最好的方式來改變一個MySQL數據庫中的行?我應該按價值修改價值還是更新一切?

例子: 這裏我得到了當前的名字和姓是,當它從什麼是目前在我的數據庫

例1不同,我只更新 - 由值值

我如果有更改,則對每個數據進行兩次查詢。

if((!empty($name)) && ($nom != $name_user)){ 
    $sql = "UPDATE user SET name_user='$name' WHERE id_user='$id'"; 
    mysqli_query($conn, $sql); 
    echo '<h2 class="center">Your name has been modified</h2>'; 
    } 

    if((!empty($firstname)) && ($firstname!= $firstname_user)){ 
    $sql = "UPDATE user SET name_user='$name' WHERE id_user='$id'"; 
    mysqli_query($conn, $sql); 
    echo '<h2 class="center">Your firstname has been modified</h2>'; 
    } 

爲例2 - 在一個查詢

它確實相同,但只使用一個查詢一切。

if(((!empty($firstname)) && ($firstname!= $firstname_user)) || ((!empty($firstname)) && ($firstname!= $firstname_user))){ 
    $sql = "UPDATE user SET name_user='$name', firstname_user='$firstname' WHERE id_user='$id'"; 
    mysqli_query($conn, $sql); 
    echo '<h2 class="center">Your profil has been modified</h2>'; 
    } 

只是在實際更改時更新值才更好嗎? (示例1)

即使只更改了一個值,更改兩個值會更好嗎? (示例2)

什麼可能是最好的表現?謝謝 !

+1

只更新已更改的值,並在一個查詢中完成所有操作。另外,使用[** prepared statements **](https://secure.php.net/manual/en/mysqli.prepare.php)避免[** SQL注入**](https://en.wikipedia .org/wiki/SQL_injection)攻擊。 –

+0

@AlexHowansky我瞭解準備好的陳述,這只是一個快速閱讀。你如何只使用一個查詢,你使用[switch](http://php.net/manual/fr/control-structures.switch.php)?在我的專業領域,我只有兩個領域,但未來我可能需要更多,你推薦我做什麼?謝謝btw! – Gingerboy

+0

有什麼區別,快速閱讀還是不快?爲什麼你不用任何閱讀準備好的語句,你應該? –

回答

0

執行單個UPDATE來修改所有必要的字段。有幾種方法來建立這個句子。這是一個基本的:

$fields = array("field1", "field2", "field3"); 
$values = array(); 

foreach ($fields as $field) 
{ 
    if (isset($_GET[$field]) AND !empty($_GET[$field])) 
    { 
     $values[$field] = "$field='" 
         . mysqli_real_escape_string($conn, $_GET[$field]) 
         ."'"; 
    }  
} 
$sql = "UPDATE user SET " . implode (',', $values) . " WHERE id_user='$id'"; 
mysqli_query($conn, $sql); 

注意:mysqli_real_escape_string()逃脫特殊字符。詳情here

測試它here

編輯: 如果擔心安全問題,認真考慮使用預處理語句,如一些評論指出。

+0

非常清晰靈活的答案,非常感謝! 我會編輯我原來的問題,因爲缺乏準備好的聲明確實會觸發每個人。 – Gingerboy

-1

我通常處理的情況一樣,這是通過使名稱相匹配的數據庫字段名的形式的方式,然後我把一個隱藏字段旁邊包含舊值與修改後的名稱可見輸入;

<input type="text" name="aboutme"> 
<input type="hidden" name="aboutme_old" value="<?= $aboutme ?>"> 
//$aboutme being the old value of the value to be changed 

然後在接收的PHP頁面上使用foreach語句來運行可能的字段列表並創建所需的語句。

<?php 
//Set the fields to check 
$fields = array ('firstname', 'secname', 'interests', 'aboutme'); 

//Start MYSQL query 
$mysql_query = 'UPDATE `table` SET '; 

$i = 0; 
//Run through the list 
foreach ($fields as $field) { 
    $old_field = $field. '_old'; //Set to the old value input name 
    $input = cleanInput($_POST[$field]); //cleanInput() is a made up function to check the data. 
    if ($i != 0) $mysql_query =. ', '; //Check if you need a comma 
    if ($_POST[$field] != $_POST[$old_field]) $mysql_query =. $field. ' = "' $input. '"'; 
    //Set the query if there is a change 
    $i++; 
} 
?> 

確保您使用的數據覈對之後將其穿過MYSQL之前否則,你的風險MYSQL注入和那只是並不好:)

一個側面說明,這有可能會向攻擊者提供信息如果他們意識到您的輸入名稱與您的數據庫字段名稱相同。 不過來測試他們首先要使它成爲你的數據庫,如果你已經具備了所有相關的保障措施不應該是一個問題。

祝你好運