讨论内容:
- 什么是“ MySQL资源”。
- 是什么导致错误。
- 如何解决。
本文是Markus的第一期文章之后的系列(很有希望)中的第二期文章:
1:已发送标题 。由PHP专家在bytes.com上撰写的这些文章希望涵盖PHP新手经常以清晰简洁的方式遇到的常见的陷阱,并随后在bytes.com论坛上提出。
第2部分:提供的参数不是有效的MySQL结果指数:
- 什么是“ MySQL资源”?
- MySQL“链接”资源。
- MySQL“结果”资源。
- 是什么导致错误?
- 如何解决?
资源是到外部服务或数据源的链接。
(请参见PHP:资源-手册 )PHP有两种主要用于MySQL的主要资源类型:“ mysql_link”和“ mysql_result”。
1.1。 MySQL“链接”资源这些告诉PHP如何与MySQL通信。
您打电话的时候
mysql_connect ,PHP打开与MySQL服务器的连接。 如果成功,则打开连接并将连接详细信息存储在内存中。 “ mysql_link”资源是指向存储这些详细信息的存储位置的链接。 1.2。 MySQL“结果”资源这些指向PHP存储MySQL查询结果的内存位置。
当你做一个
mysql_query ,MySQL立即将结果集中的所有行返回给PHP。 但是,为了使您能够按照自己的速度遍历结果集,PHP将结果“缓存”在内存中,将数据的确切位置存储在“ mysql_link”资源中,以及代码在内部的位置结果集。 2.导致错误的原因是什么?当我们尝试将不是MySQL资源的变量传递到要求它们是MySQL资源的函数中时,会显示此警告。
mysql_fetch_row函数。这始终是错误处理错误的结果。 那是; 如果生成资源的功能失败,程序员将忘记编写故障保护。 常见的原因是当您将无效的数据库信息传递给
mysql_connect函数或将无效的SQL查询传递给mysql_query函数。 这些函数本身都不会导致错误,但是它们将返回FALSE而不是期望返回的MySQL资源,因此在以下代码中,使用其返回值的函数将无法正确运行,并显示此错误。我们在PHP论坛上看到了很多与此相关的问题。 刚接触PHP的开发人员通常会执行以下操作:
<?php
// Open a link to a MySQL database.
$my_link_resource = mysql_connect('host', 'usr', 'pwd');
mysql_select_db('db', $my_link_resource);
// Execute a query on the open database.
$sql = "SELECT stuff FROM my_table";
$my_result_resource = mysql_query($sql, $my_link_resource);
// Loop through the result set, printing each row.
while($row = mysql_fetch_row($my_result_resource)) {
var_dump($row); // For debug only!
}
?>
该代码中有3行可能会导致错误,例如本文所涉及的那一行:
- 第4行。 “ mysql_select_db”函数用于使用MySQL链接资源连接到MySQL,从而在打开的MySQL连接上设置活动数据库。 如果前面的“ mysql_connect”函数失败,则“ mysql_select_db”函数将不知道要使用哪个MySQL服务器,因此将失败,并给我们一条错误消息。
- 第8行。 同样,如果第3行上的“ mysql_connect”调用失败,则“ mysql_query”函数将不知道如何连接到MySQL,因此将失败。
- 第11行。 “ mysql_fetch_row”函数依赖于“ mysql_query”函数为其提供“ mysql_result”资源。 如果上述任何一个功能:“ mysql_connect”,“ mysql_select_db”或“ mysql_query”失败,则该功能也有可能失败。
您只需要做一件事即可确保该错误不会影响您:验证“ mysql_ *”函数的返回值。
您的操作方式非常简单:您使用
if ... else语句,用于检查这些函数的返回值是否实际上应为它们的预期值。 -考虑一下我之前向您展示的示例的重写。<?php
// Open a link to a MySQL database.
$my_link_resource = mysql_connect('host', 'usr', 'pwd');
if($my_link_resource === FALSE) {
echo 'Failed to connect to MySQL: ' . mysql_error();
exit;
}
if(!mysql_select_db('db', $my_link_resource)) {
echo 'Failed to select MySQL database: ' . mysql_error();
exit;
}
// Execute a query on the open database.
$sql = "SELECT stuff FROM my_table";
$my_result_resource = mysql_query($sql, $my_link_resource);
// Makes sure the query was successful
if($my_result_resource !== FALSE) {
// Loop through the result set, printing each row.
while($row = mysql_fetch_row($my_result_resource)) {
var_dump($row); // For debug only!
}
}
else {
echo 'MySQL Query failed.<br>';
echo ' - Error: ' . mysql_error() . '<br>';
echo " - Query: {$sql}<br>";
exit;
}
?>
这不会导致我们正在讨论的相当无用的警告,而会打印出有用的错误消息,可用于调试和解决问题。
但是,由于过于冗长,许多开发人员喜欢替换
if ... else通过简单的模具调用来阻止。 这使代码短了很多,但是作为回报,您失去了if ... else块给您的控制权。您可以像这样重写前面的示例,以合并此方法:
<?php
// Open a link to a MySQL database.
$my_link_resource = mysql_connect('host', 'usr', 'pwd') or die(mysql_error());
mysql_select_db('db', $my_link_resource) or die(mysql_error());
// Execute a query on the open database.
$sql = "SELECT stuff FROM my_table";
$my_result_resource = mysql_query($sql, $my_link_resource) or die(mysql_error());
// Loop through the result set, printing each row.
while($row = mysql_fetch_row($my_result_resource)) {
var_dump($row); // For debug only!
}
?>
但是无论如何,当您的MySQL函数失败时,这两种方法都会产生更多有用的错误消息。