2012-11-16 31 views
0

我正在开发一个PHP Web应用程序,该应用程序允许用户编辑从数据库抓取的值。用户点击“编辑”链接,并使用数据库表中的数据填充字段(如果有的话)。如果没有任何数据,则所有字段都显示为空白。MySQL用户使用现有数据更新行

当用户点击'保存'时,表单被提交到POST,并且这些值通过“UPDATE”查询保存到数据库。

我通过检查“受影响的行”来检查查询的结果。如果它等于0,那么更改没有通过,我告诉用户。

但是,当用户使用与该行已包含的完全相同的值进行更新时,我遇到了一些小问题。

例如, A行有A,B,C,D列,它们的值分别为1,2,3,4。

如果用户编辑该行,并与值1,2,3,4提交,该行将不会受到影响,我的输出消息会说,查询失败时,“更新”是真的和以前一样并经历了很好。

现在我只能和输出:“更新后的值是一样的旧的或有一些错误的表和列名检查日志。”

我发送一条消息给这个错误的日志。然后我输出查询,以便用户可以看到。

事情是,我希望我的程序在提到错误时提供信息。有没有办法让程序对更新进行分类,该更新与最初的行完全相同?成功了吗?

 // construct query, execute query, check if any rows have been affected 
    $query = "UPDATE table SET status='$status', client='$client' WHERE key='$key'"; 
    $result = $conn->query($query); 
    if(mysqli_affected_rows($conn) === 0) 
    { 
     echo "Something went wrong. Entry not updated. Check the logs.\n"; 
     echo $query; 
     error_log(mysqli_error($conn)); 
    } 

我也想过,如果条件中,如果$result === false$result === true只是检查,而是将这项工作?

任何洞察力,非常感谢。

谢谢!

+2

由于您正在使用'mysqli',您必须**必须利用[SQL占位符工具](http://php.net/manual/en/mysqli-stmt.prepare.php)避免严重的[SQL注入漏洞](http://bobby-tables.com/php)。你永远不应该将用户变量插入到你的查询字符串中。这只是一条线路,它可以让您免于极其尴尬的事情,如果不是事业的破坏性事件。 – tadman

+0

@tadman感谢您的建议。我是PHP的新手,所以当人们发布链接供我学习时,它非常有用。 –

+0

@tadman正是我应该如何处理我的查询和输入?我使用mysqli_real_escape_string过滤了输入,但是我也应该在执行它们之前绑定变量并准备语句,对吗? :) –

回答

1

如果你想检查你的查询有错误,你可以检查-1而不是0

如果mysqli_affected_rows返回0这意味着没有更新,因为没有更改值或没有匹配WHERE条件。如果您需要区分这两者,则可能需要执行额外的SELECT查询。

而且您需要使用带有绑定变量的预准备语句来避免sql注入问题。

+0

谢谢你的回答! –