0

在我的 PHP 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');
        }  
4

2 回答 2

4

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

$result = mysql_query($sql) or die(mysql_error());
                            ^^^^^^^^^^^^^^^^^^^^^

考虑一个用户注册系统,它检查是否存在匹配的用户名:

SELECT id FROM users WHERE username='foo';

如果用户foo不存在,您的系统将发出错误并声称发生了错误。但是空的结果集不是错误。它只是意味着用户名可供用户使用。

对于处理成绩的系统也是如此:

UPDATE students SET failed=true WHERE score < 50;

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

于 2013-03-20T14:31:10.407 回答
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 行(如果这对您很重要)的情况下,您才会重定向。

于 2013-03-20T14:31:40.333 回答