1

当有结果或false没有更多行时, mysql_fetch_row返回一个数组。

但是,当运行命令时发生与连接相关的错误时,预期的行为是什么?

或者更确切地说,我应该问...该功能mysql_fetch_row是否需要数据库连接?

在我的盒子上,我实际上可以关闭连接 ( mysql_close) 并且仍然可以完美地获取行。但是,我找不到任何文档说明这种行为是常态,或者甚至是预期的。

4

5 回答 5

2

我认为你应该调查 mysql_error

http://php.net/manual/en/function.mysql-error.php

mysql_* 函数已被贬值,您应该考虑使用 PDO 或 Mysqli。

于 2013-03-11T16:33:08.223 回答
2

有两种类型的“查询”函数:

现在如果您使用mysql_query完整的结果集存储在客户端上。因此,一旦mysql_query返回,就不需要服务器通信。您可以获取结果集的大小并使用mysql_seek. 在内部使用该函数mysql_store_result,如果在客户端获取结果时服务器死机,您的mysql_query调用将失败。但是,如果结果集完全存储在客户端上,mysql_fetch_row并且在您获取它们时服务器死机,则客户端不会失败。

如果你使用mysql_unbuffered_query,你需要有一个有效的链接,因为结果集没有存储在客户端上——而是在你调用时获取每一行mysql_fetch_row。因此,如果链接“死亡”,下一次调用mysql_fetch_row将失败。C 函数mysql_use_result用于“无缓冲”调用。

我创建了一个简单的 PHP 脚本来测试它(太大而无法粘贴)。

引用mysql_fetch_rowmysql C-Library 的 -function手册:

检索结果集的下一行。在 mysql_store_result() 之后使用时,mysql_fetch_row() 在没有更多行要检索时返回 NULL。在 mysql_use_result() 之后使用时,当没有更多行要检索或发生错误时,mysql_fetch_row() 返回 NULL。

这表明隐含:

  • 如果mysql_store_result使用(缓冲正常查询),则mysql_fetch_row如果没有更多行要获取,则仅返回 null
  • 如果mysql_use_result使用(无缓冲查询),则mysql_fetch_row在没有更多行从服务器获取下一行时出错时返回 null。

没有提到任何平台特定的行为,所以我认为这适用于所有平台。当然,我们必须深入研究这些函数的源代码才能确定。

关于发生错误时的行为:mysql_fetch_result如果未缓冲结果集的获取失败(或者如果没有更多行),PHP 端将返回 false。-functionsmysql_*不会抛出异常,但如果发生故障,则会发出警告 - 在我的脚本中它说Warning: mysql_fetch_row(): 8 is not a valid MySQL result resource in .... 因此,如果您想检查错误,则必须执行以下操作:

while($row = mysql_fetch_row($result)) {
   // do stuff
}

if(mysql_errno($dbhandle) !== 0) {
    echo "there was an error: ", mysql_error($dbhandle), PHP_EOL;
}

如果您想编写真正的防御性代码,则无论您使用哪种查询功能,都必须这样做。

顺便说一句:如果 mysql-connection 用 关闭,此防御性代码将不起作用mysql_close,因为句柄现在已关闭并mysql_errno返回 false (加上发出警告)。

于 2013-03-11T18:02:08.963 回答
0

如果您真的必须检查连接错误等,请使用mysql_errno,但您真的不应该再使用 mysql 库,因为它已被弃用;继续使用 MySQLi 或 PDO

于 2013-03-11T16:34:34.867 回答
0

mysql_fetch_row() 调用 mysql_query() 如果有错误则返回错误。

于 2013-03-11T16:35:27.313 回答
0

您必须区分 的返回值mysql_query和 的返回值mysql_fetch_row。如果要检查连接相关的错误,首先检查返回值

$result = mysql_query(...) or die(mysql_error());

如果检查结果集的结尾,则检查mysql_fetch_row.

于 2013-03-11T16:49:20.493 回答