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

当前回答

当查询中出现错误导致查询失败时,将显示此错误消息。它会在使用时显现出来:

mysql_fetch_array / mysqli_fetch_array () 作用是()/ mysqli_fetch_assoc () mysql_num_rows () / mysqli_num_rows ()

注意:如果查询不影响任何行,则不会出现此错误。只有语法无效的查询才会产生此错误。

故障排除步骤

Make sure you have your development server configured to display all errors. You can do this by placing this at the top of your files or in your config file: error_reporting(-1);. If you have any syntax errors this will point them out to you. Use mysql_error(). mysql_error() will report any errors MySQL encountered while performing your query. Sample usage: 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(); } Run your query from the MySQL command line or a tool like phpMyAdmin. If you have a syntax error in your query this will tell you what it is. Make sure your quotes are correct. A missing quote around the query or a value can cause a query to fail. Make sure you are escaping your values. Quotes in your query can cause a query to fail (and also leave you open to SQL injections). Use mysql_real_escape_string() to escape your input. Make sure you are not mixing mysqli_* and mysql_* functions. They are not the same thing and cannot be used together. (If you're going to choose one or the other stick with mysqli_*. See below for why.)

其他技巧

Mysql_ *函数不应该用于新代码。它们不再被维护,社区已经开始了弃用过程。相反,你应该学习准备语句并使用PDO或MySQLi。如果你不能决定,这篇文章将帮助你选择。如果你想学习,这里有一个很好的PDO教程。

其他回答

可能有两个原因:

在调用mysql_query函数之前,是否打开了到数据库的连接?我在你的代码里没看到。在进行查询之前使用mysql_connect。看到php.net/manual/en/function.mysql-connect.php 变量$username在单引号字符串中使用,因此它的值不会在查询中计算。查询肯定会失败。

第三,查询结构容易被SQL注入。您可以使用准备好的语句来避免这种安全威胁。

试试这个,它必须工作,否则您需要打印错误来指定您的问题

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

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

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

转到config。php。我也有同样的问题。验证用户名和密码,并且sql select的名称与配置相同。

任何时候你得到…

“警告:mysqli_fetch_object()期望参数1为mysqli_result,布尔给定”

…这很可能是因为您的查询有问题。prepare()或query()可能返回FALSE(一个布尔值),但是这个通用的失败消息不会给您留下太多线索。您如何发现您的查询有什么问题?你问!

首先,确保错误报告已打开并且可见:将这两行添加到文件的顶部,就在<?php标签:

error_reporting(E_ALL);
ini_set('display_errors', 1);

If your error reporting has been set in the php.ini you won't have to worry about this. Just make sure you handle errors gracefully and never reveal the true cause of any issues to your users. Revealing the true cause to the public can be a gold engraved invitation for those wanting to harm your sites and servers. If you do not want to send errors to the browser you can always monitor your web server error logs. Log locations will vary from server to server e.g., on Ubuntu the error log is typically located at /var/log/apache2/error.log. If you're examining error logs in a Linux environment you can use tail -f /path/to/log in a console window to see errors as they occur in real-time....or as you make them.

一旦您掌握了标准错误报告,在数据库连接和查询上添加错误检查将为您提供有关正在发生的问题的更多详细信息。看看这个列名不正确的例子。首先,返回通用致命错误消息的代码:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

这个错误是一般的,对您解决正在发生的问题没有多大帮助。

再写几行代码,就可以得到非常详细的信息,可以立即用来解决问题。检查prepare()语句的真实性,如果它是好的,你可以继续绑定和执行。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

如果出现问题,你可以发出一条错误消息,直接找到问题所在。在这种情况下,表中没有foo列,解决问题是微不足道的。

如果您愿意,可以将这种检查包含在函数或类中,并像前面提到的那样通过优雅地处理错误来扩展它。

首先检查你的连接。

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

$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%'");