PHP mysql_affected_rows()我应该关心吗?

时间:2013-03-20 14:25:52

标签: php mysql

我一直在使用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');
        }  

2 个答案:

答案 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行时才会重定向(如果这对您很重要)。