mysql_fetch_row会遇到连接错误吗?

时间:2013-03-11 16:31:02

标签: php mysql database-connection

mysql_fetch_row会在有结果时返回数组,如果没有更多行则返回false

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

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

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

5 个答案:

答案 0 :(得分:2)

我认为你应该研究一下mysql_error

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

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

答案 1 :(得分: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用于“无缓冲”调用。

我创建了一个simple PHP-script来测试它(太大而无法粘贴)。

引用mysql_fetch_row-function of the mysql C-Library的手册:

  

检索结果集的下一行。在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

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

关于错误情况下的行为:如果取消缓冲结果集失败(或者没有更多行),则PHP端mysql_fetch_result将返回false。 mysql_* - 函数不会抛出异常,但如果失败则会发出警告 - 在我的脚本中它会显示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_close关闭mysql连接,这个防御性代码将无效,因为句柄现在已关闭且mysql_errno返回false(加上发出警告)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

mysql_fetch_row()调用mysql_query(),如果出现错误则返回错误。

答案 4 :(得分:0)

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

的返回值
$result = mysql_query(...) or die(mysql_error());

如果检查结果集的结尾,则检查mysql_fetch_row的返回值。