php - mysql_fetch_array(发出( 或者mysqli_result ) , boolean ) 参数1都应该为资源

  显示原文与译文双语对照的内容

我正试图从一个MySQL表中选择数据,但得到了以下错误消息之一:

mysql_fetch_array() 需要参数 1为资源,布尔值为

或者

mysqli_fetch_array() 需要参数 1为 mysqli_result,布尔值为

这是我的代码:


$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'];
}

时间:

注意注释这个答案太旧了,使用了过时的mysql_函数 。 答案在大多数 mysqli_ function set (which is designed to be very similar)的用法上仍然是有效的,尽管在这个答案中语法可能有些不同。 请查阅 PHP mysqli手册来了解更多关于 mysqli_ 功能。

$result 传递到 mysql_fetch_array 之前检查。 你会发现它是 false,因为查询失败。 有关可能的返回值和如何处理它们的建议,请参阅 mysql_query 文档。


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

if($result === FALSE) { 
 die(mysql_error());//TODO: better error handling
}

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

这个例子只是为了说明应该做什么( 错误处理错误),而不是如何做。 输出代码在输出HTML时不应使用 or die,否则它将生成无效的HTML 。 此外,数据库错误消息不应显示给non-admin用户,因为它公开了太多信息。

当查询中出现错误导致它失败时,会显示这里错误消息。 它将在使用以下内容时显示:

  • mysql_fetch_array/mysqli_fetch_array()
  • mysql_fetch_assoc()/mysqli_fetch_assoc()
  • mysql_num_rows()/mysqli_num_rows()

注意注意: 如果你的查询没有任何行影响,这个错误就不会出现在 。 只有具有无效语法的查询才会生成这里错误。

故障排除步骤

  • 确保你的开发服务器配置为显示所有错误。 你可以将它的放在文件的顶部或者配置 file: error_reporting(-1); 。xml中。 如果你有任何语法错误,这将把它们指向你。

  • 使用 mysql_error()mysql_error() 。将报告在执行查询时遇到的任何错误。

    示例用法:

    
    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql ="SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
     echo mysql_error();
    }
    
    
  • 从 MySQL 命令行 或者类似 phpMyAdmin的工具运行你的查询。 如果你的查询中有语法错误,这将告诉你它是什么。

  • 请确定你的报价是正确的。 查询或者值周围缺少引号会导致查询失败。

  • 确保你正在转义你的值。 查询中的引号会导致查询失败( 同时还让你打开SQL注入) 。 使用 mysql_real_escape_string() 来转义输入。

  • 确保你没有混合 mysqli_*mysql_* 函数。 它们不一样,不能一起使用。 ( 如果你要选择一个或者另一个带有 mysqli_*的) 。 有关原因,请参见下文。

其他提示

mysql_* 函数不应用于新代码。 它们不再被维护,社区已经开始了废弃进程 。 相反,你应该了解预备语句和使用 PDOMySQLi 。 如果你无法决定,将帮助你选择。 如果你想学习,这里是好的PDO教程

单引号( ' ) 可能有问题。 你可以这样放置查询:


mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

它使用 mysql_real_escape_string 来防止 SQL注入 。 虽然我们应该使用mysqli或PDO_MYSQL扩展升级版本的php( PHP 5.5.0和更高版本), 但对于旧版本 mysql_real_escape_string 都会奏效。

就像 scompt.com 解释的那样,查询可能会失败。 使用这里代码获取查询的错误或者正确的结果:


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

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

if($result)
{
 while($row = mysql_fetch_array($result))
 {
 echo $row['FirstName'];
 }
} else {
 echo 'Invalid query: '. mysql_error()."n";
 echo 'Whole query: '. $query; 
}

有关进一步信息,请参阅文档 mysql_query()

实际的错误是单引号,所以变量 $username 没有被解析。 但是你真的应该使用 mysql_real_escape_string($username) 避免SQL注入。

$username 周围加上引号。字符串值与数值相反,必须用引号括起来。


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

此外,如果你不使用通配符,也没有使用 LIKE 条件: 如果需要精确匹配,请使用 = 而不是 LIKE

请检查选定的数据库不是因为某些时间数据库未被选中

检查


mysql_select_db('database name ')or DIE('Database name is not available!');

在MySQL查询之前,然后转到下一步


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

f($result === FALSE) {
 die(mysql_error());

你的代码应该是这样


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

if($result === FALSE) {
 die(mysql_error("error message for the user")); 
}

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

完成之后,你就可以在屏幕上打印查询了。 在你的服务器上尝试这个查询,看看它是否产生了预期的结果。 大多数时候,错误在查询中。 其余代码正确。

这里查询应该有效:


$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
 echo $row['FirstName'];
}

问题是单引号,因此你的查询失败并返回 FALSE,而你的危难循环无法执行。 使用 % 可以匹配任何包含字符串( 比如 SomeText-$username-SomeText )的结果。

这只是对你的问题的回答,你应该实现其他帖子中提到的内容: 错误处理,使用转义字符串( 用户可以在字段中键入任何内容,你必须确保它不是任意代码),使用 PDO,而不是 mysql_connect 。


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

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

有时将查询作为 @mysql_query(your query); 取消


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

使用单引号定义字符串,而PHP不解析单引号分隔字符串。 为了获得变量插值,你需要使用双引号或者字符串串联( 或者结合在一起) 。 有关更多信息,请参阅 http://php.net/manual/en/language.types.string.php

另外,你应该检查mysql_query是否返回了有效的结果资源,否则 fetch_*,num_rows等将无法在结果上工作,因为不是结果 ! 例如:


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

if( $result === FALSE ) {
 trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
 while( $row = mysql_fetch_array($result) ) {
 echo $row['username'];
 }
}

http://us.php.net/manual/en/function.mysql-query.php 用于更多信息。

...