当有结果或false
没有更多行时, mysql_fetch_row返回一个数组。
但是,当运行命令时发生与连接相关的错误时,预期的行为是什么?
或者更确切地说,我应该问...该功能mysql_fetch_row
是否需要数据库连接?
在我的盒子上,我实际上可以关闭连接 ( mysql_close
) 并且仍然可以完美地获取行。但是,我找不到任何文档说明这种行为是常态,或者甚至是预期的。
当有结果或false
没有更多行时, mysql_fetch_row返回一个数组。
但是,当运行命令时发生与连接相关的错误时,预期的行为是什么?
或者更确切地说,我应该问...该功能mysql_fetch_row
是否需要数据库连接?
在我的盒子上,我实际上可以关闭连接 ( mysql_close
) 并且仍然可以完美地获取行。但是,我找不到任何文档说明这种行为是常态,或者甚至是预期的。
我认为你应该调查 mysql_error
http://php.net/manual/en/function.mysql-error.php
mysql_* 函数已被贬值,您应该考虑使用 PDO 或 Mysqli。
有两种类型的“查询”函数:
mysql_query
每个人都使用的你的正常mysql_unbuffered_query
现在如果您使用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_row
mysql C-Library 的 -function手册:
检索结果集的下一行。在 mysql_store_result() 之后使用时,mysql_fetch_row() 在没有更多行要检索时返回 NULL。在 mysql_use_result() 之后使用时,当没有更多行要检索或发生错误时,mysql_fetch_row() 返回 NULL。
这表明隐含:
mysql_store_result
使用(缓冲正常查询),则mysql_fetch_row
如果没有更多行要获取,则仅返回 nullmysql_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 (加上发出警告)。
如果您真的必须检查连接错误等,请使用mysql_errno,但您真的不应该再使用 mysql 库,因为它已被弃用;继续使用 MySQLi 或 PDO
mysql_fetch_row() 调用 mysql_query() 如果有错误则返回错误。
您必须区分 的返回值mysql_query
和 的返回值mysql_fetch_row
。如果要检查连接相关的错误,首先检查返回值
$result = mysql_query(...) or die(mysql_error());
如果检查结果集的结尾,则检查mysql_fetch_row
.