mysql_fetch_row会在有结果时返回数组,如果没有更多行则返回false
。
但是在运行命令时发生与连接相关的错误时,预期的行为是什么?
或者更确切地说,我应该问...... 函数mysql_fetch_row
是否需要数据库连接?
在我的框中,我实际上可以关闭连接(mysql_close
)并仍然完美地获取行。但是,我找不到任何文档说明这种行为是常态,或者甚至是预期的。
答案 0 :(得分:2)
我认为你应该研究一下mysql_error
http://php.net/manual/en/function.mysql-error.php
mysql_ *函数已被折旧,您应该考虑使用PDO或Mysqli。
答案 1 :(得分:2)
有两种类型的“查询”功能:
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
用于“无缓冲”调用。
我创建了一个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
的返回值。