mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数1是资源

新手上路,请多包涵

我正在尝试从 MySQL 表中选择数据,但收到以下错误消息之一:

mysql_fetch_array() 期望参数 1 是资源,给定的布尔值

这是我的代码:

 $username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}

原文由 iamjonesy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 387
2 个回答

查询可能由于各种原因而失败,在这种情况下,mysql_* 和 mysqli 扩展都将从各自的查询函数/方法返回 false 。您需要测试该错误情况并相应地处理它。

mysql_ 扩展名

注意 mysql_ 函数已被弃用,并已在 php 版本 7 中删除。

检查 $result 在将其传递给 mysql_fetch_array 之前。你会发现是 false 因为查询失败。请参阅 [ mysql_query ][1] 文档以获取可能的返回值以及如何处理它们的建议。

 $username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) {
    trigger_error(mysql_error(), E_USER_ERROR);
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

原文由 Edward Dale 发布,翻译遵循 CC BY-SA 4.0 许可协议

传统上,PHP 可以容忍代码中的不良做法和错误,这使得调试非常困难。在这种特定情况下,问题是 mysqliPDO 默认情况下都不会告诉您,当查询失败时只返回 FALSE 。 (我不会谈论贬低的 mysql 扩展。对 准备好的语句 的支持足以切换到 PDOmysqli 。)但是您可以更改 PHP 的默认行为,以便在查询失败时始终抛出 _异常_。

对于 PDO :使用 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 error_reporting(E_ALL);

$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$result = $pdo->query('select emal from users');
$data = $result->fetchAll();

这将向您显示以下内容:

致命错误:未捕获异常 ‘PDOException’ 并带有消息 ‘SQLSTATE[42S22]:未找到列:1054 Unknown column ‘emal’ in ‘field list” in E:\htdocs\test\mysql_errors\pdo.php 第 8 行

PDOException:SQLSTATE [42S22]:未找到列:1054 第 8 行 E:\htdocs\test\mysql_errors\pdo.php 中的“字段列表”中的未知列“emal”

如您所见,它准确地告诉您查询出了什么问题,以及在代码中的何处修复它。

没有 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 你会得到

致命错误:在第 9 行的 E:\htdocs\test\mysql_errors\pdo.php 中的布尔值上调用成员函数 fetchAll()

对于 mysqli :使用 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

 error_reporting(E_ALL);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');

$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();

你会得到

致命错误:第 8 行 E:\htdocs\test\mysql_errors\mysqli.php 中的未捕获异常 ‘mysqli_sql_exception’ 和消息 ‘Unknown column ‘emal’ in ‘field list”

mysqli_sql_exception:第 8 行 E:\htdocs\test\mysql_errors\mysqli.php 中“字段列表”中的未知列“emal”

没有 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 你只会得到

致命错误:在第 10 行的 E:\htdocs\test\mysql_errors\mysqli.php 中的布尔值上调用成员函数 fetch_all()

当然,您可以手动检查 MySQL 错误。但是,如果每次我打错字——或者更糟——每次我想查询数据库时都必须这样做,我会发疯的。

原文由 Paul Spiegel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题