2017-05-04 31 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注入和那只是并不好:)

一个侧面说明,这有可能会向攻击者提供信息如果他们意识到您的输入名称与您的数据库字段名称相同。 不过来测试他们首先要使它成为你的数据库,如果你已经具备了所有相关的保障措施不应该是一个问题。

祝你好运