PHP-常见的新手陷阱,2:提供的参数不是有效的MySQL结果

讨论内容:

  • 什么是“ MySQL资源”。
  • 是什么导致错误。
  • 如何解决。
常见的新手陷阱

本文是Markus的第一期文章之后的系列(很有希望)中的第二期文章:

1:已发送标题

由PHP专家在bytes.com上撰写的这些文章希望涵盖PHP新手经常以清晰简洁的方式遇到的常见的陷阱,并随后在bytes.com论坛上提出。

第2部分:提供的参数不是有效的MySQL结果

指数:

  1. 什么是“ MySQL资源”?
    1. MySQL“链接”资源。
    2. MySQL“结果”资源。
  2. 是什么导致错误?
  3. 如何解决?
1.什么是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行可能会导致错误,例如本文所涉及的那一行:
  1. 第4行。 “ mysql_select_db”函数用于使用MySQL链接资源连接到MySQL,从而在打开的MySQL连接上设置活动数据库。 如果前面的“ mysql_connect”函数失败,则“ mysql_select_db”函数将不知道要使用哪个MySQL服务器,因此将失败,并给我们一条错误消息。
  2. 第8行。 同样,如果第3行上的“ mysql_connect”调用失败,则“ mysql_query”函数将不知道如何连接到MySQL,因此将失败。
  3. 第11行。 “ mysql_fetch_row”函数依赖于“ mysql_query”函数为其提供“ mysql_result”资源。 如果上述任何一个功能:“ mysql_connect”,“ mysql_select_db”或“ mysql_query”失败,则该功能也有可能失败。
3.如何解决?

您只需要做一件事即可确保该错误不会影响您:验证“ 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函数失败时,这两种方法都会产生更多有用的错误消息。

From: https://bytes.com/topic/php/insights/881516-php-common-newbie-pitfalls-2-supplied-argument-not-valid-mysql-result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值