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

当前回答

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

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

同样,如果不使用通配符,使用LIKE条件也没有意义:如果需要精确匹配,则使用=而不是LIKE。

其他回答

因为$username是一个PHP变量,我们需要将它作为字符串传递给mysqli,所以在查询中,你以单引号开始,我们将使用双引号,单引号和句号来连接("'.$username.'"),如果你以双引号开始,你将反转引号('".$username."')。

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

$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的使用已经贬值了很多,改用PDO。它很简单,但非常安全

<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>

传统上,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错误。 但如果每次我打错字都要这么做,我会疯掉的 或者更糟——每次我想查询数据库的时候。

当数据库连接失败时,通常会出现错误,因此请确保连接数据库或包含数据库文件。

include_once(db_connetc.php');

OR

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if

最佳实践是在sqlyog中运行查询,然后将其复制到页面代码中。 始终将查询存储在一个变量中,然后回显该变量。然后传递给mysql_query($query_variable);。

您的代码应该是这样的

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

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