我一直在使用PHP INSERT / UPDATE代码中的一个相当基本的概念。在每次INSERT / UPDATE之后我是否应该总是检查受影响的行数,因为在绝大多数情况下我只执行一次INSERT / UPDATE并且通过检查只有一行受到影响它似乎导致了比修复更多的问题
下面是执行INSERT / UPDATE的标准代码,如果用户正在更新记录而不更改任何内容,则此代码将失败,因为受影响的行将为0.我可以编写代码来检查至少有一个字段已更改但是在大型表格上,这看起来非常笨重,并且想知道它是否真的值得,因为我从来没有通过检查这个数字从未发现任何错误。
<?php
$whereSql = '';
$groupSql = 'INSERT INTO';
if(isset($_POST['id']) && is_numeric($_POST['id'])){
$groupSql = 'UPDATE';
$whereSql = 'WHERE id = ' . $_POST['id'];
}
$groupSql .= ' sometable SET name="' . $name . '" ' . $whereSql;
$groupDb = mysqli_query($groupSql, $dbObject) or die("Login DB error:".mysql_error());
if(mysqli_affected_rows($dbObject) == 1){
//redirect
}else{
die('System Error');
}
答案 0 :(得分:4)
您应该检查查询的返回值。影响/不返回任何行的选择/更新查询是 NOT 错误条件,它只是一个空结果集,或者碰巧什么都没有影响的更新。
$result = mysql_query($sql) or die(mysql_error());
^^^^^^^^^^^^^^^^^^^^^
考虑一个用户注册系统,它检查是否存在匹配的用户名:
SELECT id FROM users WHERE username='foo';
如果用户foo
不存在,系统将禁止并声明发生错误。但是空结果集 NOT 错误。它只是意味着用户可以使用用户名。
处理成绩的系统相同:
UPDATE students SET failed=true WHERE score < 50;
获得0个受影响的行并非失败。这只是意味着所有学生都通过了。
答案 1 :(得分:1)
我建议检查查询是否失败,如果没有,那么是否有多行受影响。
$groupDb = mysql_query($groupSql, $dbObject);
if (false === $groupDb) {
die("Login DB error:".mysql_error())
if (mysql_affected_rows($dbObject) > 1) {
die('System Error: failed to ' . $action . ' a document Group');
} else {
//redirect
}
这样,只有在成功查询的情况下以及受影响的行数少于2行时才会重定向(如果这对您很重要)。