从manual上知道了mysql_affected_rows函数当UPDATE前后的数据一样时会返回异常值, 下面有个方便的解决办法,从官方munual上看到 bdobrica at gmail dot com 留言的: As a solution to the problem pointed in the post reffering to mysql_affected_rows() returning 0 when you are making an update query and the fields are not modified although the query is val 在PHP与MySQL交互时,有时候我们需要获取SQL语句(如UPDATE)执行后影响的数据行数。通常情况下,我们可以使用`mysql_affected_rows()`函数来获取这一信息。然而,当UPDATE语句更新的字段与原数据相同,即没有实际改变任何值时,`mysql_affected_rows()`函数可能会返回0,这在某些情况下可能会被视为异常或错误。 为了解决这个问题,我们可以参考bdobrica at gmail dot com在官方手册上的建议,编写一个自定义函数,如下所示: ```php function mysql_modified_rows() { $info_str = mysql_info(); $a_rows = mysql_affected_rows(); ereg("Rows matched: ([0-9]*)", $info_str, $r_matched); return ($a_rows < 1)?($r_matched[1]?$r_matched[1]:0):$a_rows; } ``` 这个函数首先调用`mysql_info()`获取执行后的信息字符串,然后使用正则表达式匹配其中的"Rows matched"部分,以获取匹配的行数。如果`mysql_affected_rows()`返回0(表示没有受影响的行),则返回匹配的行数;否则,直接返回`mysql_affected_rows()`的值。 需要注意的是,此函数依赖于`ereg()`函数,该函数在PHP 7.3之后已被废弃,因此在新版本的PHP中,应使用`preg_match()`替代。替换后的代码如下: ```php function mysql_modified_rows() { $info_str = mysql_info(); $a_rows = mysql_affected_rows(); preg_match("/Rows matched: (\d+)/", $info_str, $r_matched); return ($a_rows < 1)?($r_matched[1]?$r_matched[1]:0):$a_rows; } ``` 此外,`mysql_affected_rows()`、`mysql_info()`等函数是旧版的MySQL扩展(mysql extension)的一部分,这些函数在PHP 7.0以后已被废弃,推荐使用mysqli或PDO_MySQL扩展进行数据库操作,因为它们提供了更好的性能和安全性。例如,使用mysqli,你可以用`mysqli::$affected_rows`属性或`mysqli::affected_rows`方法来获取影响的行数。 在处理MySQL异常时,我们还需要关注错误报告和异常处理。在PHP中,可以使用try-catch结构来捕获和处理MySQL相关的异常。例如: ```php try { // 连接数据库 $mysqli = new mysqli('host', 'user', 'password', 'database'); // 检查连接是否成功 if ($mysqli->connect_error) { throw new Exception("Failed to connect to MySQL: " . $mysqli->connect_error); } // 执行SQL语句 $mysqli->query("YOUR UPDATE QUERY"); // 获取受影响的行数 $modified_rows = $mysqli->affected_rows; } catch (Exception $e) { echo "An error occurred: " . $e->getMessage(); } finally { // 关闭数据库连接 $mysqli->close(); } ``` 在这个例子中,如果在连接数据库或执行SQL时发生错误,程序会捕获异常并打印错误消息,而不会导致整个脚本崩溃。无论是否发生异常,都会关闭数据库连接。 在MySQL存储过程中,也可以通过DECLARE和 SIGNAL/RESIGNAL 语句进行异常处理。例如: ```sql DELIMITER // CREATE PROCEDURE example_procedure() BEGIN DECLARE exit handler for SQLEXCEPTION BEGIN SHOW ERRORS LIMIT 1; RESIGNAL; -- 重新抛出当前异常 END; -- 正常的存储过程逻辑 UPDATE table SET column = value WHERE condition; END // DELIMITER ; ``` 这段存储过程定义了一个异常处理器,当出现SQL异常时,它会显示第一条错误信息,并重新抛出异常,使得调用者能够捕获和处理。 当遇到`mysql_affected_rows()`返回异常值的问题时,可以采用自定义函数来解决,同时在编写PHP和MySQL代码时,应注意使用现代的API和最佳实践来提高代码质量和健壮性。此外,对异常的妥善处理是保证程序稳定运行的关键。
- 粉丝: 6
- 资源: 907
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助