我试图从一个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'];
}

当前回答

这个查询应该工作:

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

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

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

其他回答

传统上,PHP对代码中的错误实践和失败是宽容的, 这使得调试非常困难。 在这个特定的情况下,问题是mysqli和PDO 默认情况下,查询失败时不告诉你,只返回FALSE。 (我不会谈论被废弃的mysql扩展。 对预处理语句的支持是切换到PDO或mysqli的充分理由。) 但是您可以更改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未知列'emal'在'字段列表"在E:\htdocs\test\mysql_errors\pdo.php第8行 PDOException: SQLSTATE[42S22]:列未找到:1054在E:\htdocs\test\mysql_errors\pdo.php第8行“字段列表”中未知列“emal

如您所见,它准确地告诉您查询有什么问题,以及在代码中的哪里修复它。

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

致命错误:在E:\htdocs\test\mysql_errors\pdo.php第9行调用成员函数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();

你会得到

致命错误:未捕获的异常'mysqli_sql_exception'与消息'未知列'emal'在'字段列表"在E:\htdocs\test\mysql_errors\mysqli.php第8行 mysqli_sql_exception:在E:\htdocs\test\mysql_errors\mysqli.php第8行“字段列表”中的未知列“emal

没有MYSQLI_REPORT_ERROR (MYSQLI_REPORT_STRICT);你只能得到

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

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

您的代码应该是这样的

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

完成此操作后,您将在屏幕上显示查询。在服务器上尝试这个查询,看看它是否产生了所需的结果。大多数情况下,错误出现在查询中。其余的代码是正确的。

首先检查你的连接。

然后,如果你想从数据库中获取准确的值,那么你应该这样写:

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

或者你想获取LIKE类型的值,那么你应该这样写:

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

如果检查时没有出现任何MySQL错误,请确保正确创建了数据库表。这发生在我身上。寻找任何不需要的逗号或引号。

在To之前使用db_close()确保你没有关闭数据库 运行查询:

如果你在一个脚本中使用多个查询,即使你包含了包含查询或数据库连接的其他页面,那么在你使用db_close()的任何地方都可能关闭你的数据库连接,所以确保你没有在你的脚本中犯这个错误。