PHP mysql_受影响的_行()我应该关心吗?

PHP mysql_受影响的_行()我应该关心吗?,php,mysql,Php,Mysql,在我的PHP插入/更新代码中,我一直在努力解决一个相当基本的概念。在每次插入/更新之后,我是否应该始终检查受影响的行数,因为在绝大多数情况下,我只执行一次插入/更新,并且通过检查只有一行受影响,这似乎会导致比修复问题更多的问题 $groupDb = mysql_query($groupSql, $dbObject); if (false === $groupDb) { die("Login DB error:".mysql_error()) if (mysql_affected_rows

在我的PHP插入/更新代码中,我一直在努力解决一个相当基本的概念。在每次插入/更新之后,我是否应该始终检查受影响的行数,因为在绝大多数情况下,我只执行一次插入/更新,并且通过检查只有一行受影响,这似乎会导致比修复问题更多的问题

$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
}
下面是我执行插入/更新的标准代码,如果用户在不更改任何内容的情况下更新记录,则此代码将失败,因为受影响的行将为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');
        }  

您应该检查查询的返回值。不影响/不返回行的select/update查询不是一个错误条件,它只是一个空结果集,或者是一个碰巧不影响任何内容的更新

$result = mysql_query($sql) or die(mysql_error());
                            ^^^^^^^^^^^^^^^^^^^^^
考虑一个用户注册系统,该系统检查是否存在匹配的用户名:

SELECT id FROM users WHERE username='foo';
如果用户
foo
不存在,您的系统将呕吐并声明发生错误。但空结果集不是错误。它只是意味着用户名可供用户使用

对于处理等级的系统也是如此:

UPDATE students SET failed=true WHERE score < 50;
updatestudents SET failed=true,其中分数<50;

获取0个受影响的行不是失败。这只意味着所有学生都通过了。

您应该检查查询的返回值。不影响/不返回行的select/update查询不是一个错误条件,它只是一个空结果集,或者是一个碰巧不影响任何内容的更新

$result = mysql_query($sql) or die(mysql_error());
                            ^^^^^^^^^^^^^^^^^^^^^
考虑一个用户注册系统,该系统检查是否存在匹配的用户名:

SELECT id FROM users WHERE username='foo';
如果用户
foo
不存在,您的系统将呕吐并声明发生错误。但空结果集不是错误。它只是意味着用户名可供用户使用

对于处理等级的系统也是如此:

UPDATE students SET failed=true WHERE score < 50;
updatestudents SET failed=true,其中分数<50;

获取0个受影响的行不是失败。这只意味着所有学生都通过了。

我建议检查查询是否失败,如果没有,则检查是否有多行受影响

$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行时(如果这对您很重要),您才会重定向。我建议检查查询是否失败,如果没有,则检查是否有多行受影响

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

-0.49用于2013年使用
mysql\u查询。
如果mysql\u受影响的行($dbObject)=-1,为什么不打印错误。从手动->返回成功时受影响的行数,如果上次查询失败,返回-1。@这是遗留问题code@TheoKouzelis:那就别胡闹了。很明显,它是有效的。@如果你阅读了这个问题,那么它在2013年使用
mysql\u查询时不会出现-0.49。如果mysql\u影响了行($dbObject)=-1,为什么不打印错误呢。从手动->返回成功时受影响的行数,如果上次查询失败,返回-1。@这是遗留问题code@TheoKouzelis:那就别胡闹了。如果你读了这个问题,它显然是有效的