首页 文章

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

提问于
浏览
895

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

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

要么

mysqli_fetch_array()期望参数1为mysqli_result,给定布尔值

要么

在布尔/非对象上调用成员函数fetch_array()

这是我的代码:

$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 = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);

30 回答

  • 630

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

    mysql_ extension* :

    注意mysql_函数已被弃用,已在php 7中删除 .

    在将 $result 传递给 mysql_fetch_array 之前检查 $result . 你'll find that it' s 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'];
    }
    

    mysqli extension
    程序风格:

    $username = mysqli_real_escape_string($mysqli, $_POST['username']);
    $result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");
    
    // mysqli_query returns false if something went wrong with the query
    if($result === FALSE) { 
        yourErrorHandler(mysqli_error($mysqli));
    }
    else {
        // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
        foreach( $result as $row ) {
            ...
    

    OO风格:

    $username = $mysqli->escape_string($_POST['username']);
    $result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");
    
    if($result === FALSE) { 
        yourErrorHandler($mysqli->error); // or $mysqli->error_list
    }
    else {
        // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
        foreach( $result as $row ) {
          ...
    

    使用准备好的声明:

    $stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
    if ( !$stmt ) {
        yourErrorHandler($mysqli->error); // or $mysqli->error_list
    }
    else if ( !$stmt->bind_param('s', $_POST['username']) ) {
        yourErrorHandler($stmt->error); // or $stmt->error_list
    }
    else if ( !$stmt->execute() ) {
        yourErrorHandler($stmt->error); // or $stmt->error_list
    }
    else {
        $result = $stmt->get_result();
        // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
        foreach( $result as $row ) {
          ...
    

    这些示例仅说明应该执行的操作(错误处理),而不是如何执行操作 . 生产环境 代码在输出HTML时不应使用or die,否则它将(至少)生成无效的HTML . 此外,不应将数据库错误消息显示给非管理员用户,因为discloses too much information .

  • 59

    当您的查询中出现导致其失败的错误时,将显示此错误消息 . 使用时它会表现出来:

    • mysql_fetch_array / mysqli_fetch_array()

    • mysql_fetch_assoc() / mysqli_fetch_assoc()

    • mysql_num_rows() / mysqli_num_rows()

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

    Troubleshooting Steps

    • 确保已将开发服务器配置为显示所有错误 . 您可以将它放在文件顶部或配置文件中:error_reporting(-1); . 如果您有任何语法错误,这将指出它们 .

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

    样品用法:

    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之类的工具运行查询 . 如果您的查询中有语法错误,这将告诉您它是什么 .

    • 确保您的报价正确无误 . 查询或值周围缺少引号可能导致查询失败 .

    • 确保您逃脱了自己的 Value 观 . 查询中的引号可能导致查询失败(并且还允许您对SQL注入开放) . 使用mysql_real_escape_string()来转义您的输入 .

    • 确保您没有混合 mysqli_*mysql_* 功能 . 它们不是同一个东西,不能一起使用 . (如果你打算用 mysqli_* 选择一个或另一个 . 请参阅下面的原因 . )

    Other tips

    mysql_* 函数不应用于新代码 . 它们不再被维护,社区已经开始了deprecation process . 相反,你应该了解prepared statements并使用PDOMySQLi . 如果你无法决定,this article将有助于选择 . 如果你想学习,这里是good PDO tutorial .

  • 10

    此处发生错误是由于使用单引号( ' ) . 您可以像这样输入查询:

    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 将会有所作为 .

  • 8

    scompt.com explained,查询可能会失败 . 使用此代码获取查询的错误或正确的结果:

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

    有关详细信息,请参阅documentation for mysql_query() .

    实际错误是单引号,因此未解析变量 $username . 但是你应该使用 mysql_real_escape_string($username) 来避免SQL注入 .

  • 35

    $username 附近加上报价 . 字符串值与数字值相对,必须用引号括起来 .

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

    此外,如果您不使用通配符,则使用 LIKE 条件没有意义:如果您需要完全匹配,请使用 = 而不是 LIKE .

  • 5

    请选择数据库后检查,因为有时未选择数据库

    校验

    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());
    
  • 53

    你的代码应该是这样的

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

    完成后,您将在屏幕上打印查询 . 在您的服务器上尝试此查询,看看它是否产生了所需的结果 . 大多数情况下,错误都在查询中 . 其余的代码是正确的 .

  • 34
    $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等对结果不起作用,因为不是结果! IE:

    $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了解更多信息 .

  • 15

    此查询应该有效:

    $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现在已被删除 .

  • 7
    $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);

  • 25

    如果您在此处尝试了所有操作,但它不起作用,您可能需要检查MySQL数据库排序规则 . 我的目标是瑞典校对 . 然后我把它改成了 utf8_general_ci ,所有东西都点了进去 .

    我希望这可以帮助别人 .

  • 6
    $query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";
    
    while( $data = mysql_fetch_array($query))
    {
        echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
    }
    

    您可以使用此ORDER BY查询,而不是使用WHERE查询 . 使用查询比使用它要好得多 .

    我已经完成了这个查询,并且没有得到像参数或布尔值这样的错误 .

  • 161

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

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

    请尝试以下代码 . 它可能工作正常 .

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

    可能有两个原因:

    • 在调用mysql_query函数之前,您是否打开了与数据库的连接?我在你的代码中没有看到 . 在进行查询之前使用mysql_connect . 见 php.net/manual/en/function.mysql-connect.php

    • 变量 $username 在单引号字符串中使用,因此不会在查询中评估其值 . 查询肯定会失败 .

    第三,查询的结构很容易出现SQL injection . 您可以使用预准备语句来避免此安全威胁 .

  • 108

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

  • 12
    <?php
        $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_query("SELECT * FROM Users WHERE UserName ='".$username."'");
    
  • 4

    在MySQL查询之前包含连接字符串变量 . 例如, $connt 在此代码中:

    $results = mysql_query($connt, "SELECT * FROM users");
    
  • 14

    不要使用depricated mysql_ *函数(在PHP 5中删除将在php 7中删除) . 你可以用mysqlipdo做到这一点

    这是完整的选择查询

    <?php
    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDB";
    
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 
    
    $sql = "SELECT id, firstname, lastname FROM MyGuests";
    $result = $conn->query($sql);
    
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            // code here 
        }
    } else {
        echo "0 results";
    }
    $conn->close();
    ?>
    
  • 43

    试试这个

    $username = $_POST['username'];
    $password = $_POST['password'];
    $result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');
    
    if($result){
    while($row = mysqli_fetch_array($result))
    {
        echo $row['FirstName'];
    }
    }
    
  • 9

    首先,检查您与数据库的连接 . 是否连接成功?

    如果已经完成,那么之后我编写了这段代码,它运行良好:

    if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
        $Q1mrks = $_GET['q1mrks'];
        $marks = $_GET['marks'];
        $qt1 = $_GET['qt1'];
    
        $qtype_qry = mysql_query("
            SELECT *
            FROM s_questiontypes
            WHERE quetype_id = '$qt1'
        ");
        $row = mysql_fetch_assoc($qtype_qry);
        $qcode = $row['quetype_code'];
    
        $sq_qry = "
            SELECT *
            FROM s_question
            WHERE quetype_code = '$qcode'
            ORDER BY RAND() LIMIT $Q1mrks
        ";
        $sq_qry = mysql_query("
            SELECT *
            FROM s_question
            WHERE quetype_code = '$qcode'
            LIMIT $Q1mrks
        ");
        while ($qrow = mysql_fetch_array($sq_qry)) {
            $qm = $qrow['marks'] . "
    "; $total += $qm . "
    "; } echo $total . "/" . $marks; }
  • 14
    <?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'];
     }
     ?>
    
  • 10

    任何时候你得到......

    “警告:mysqli_fetch_object()期望参数1为mysqli_result,boolean给出”

    ...可能是因为您的查询存在问题 . prepare()query() 可能返回 FALSE (布尔值),但是这个通用的失败消息并没有给你留下太多线索 . 你怎么知道你的查询有什么问题?你问!

    首先,确保打开并显示错误报告:在打开 <?php 标记后立即将这两行添加到文件的顶部:

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

    如果您在php.ini中设置了错误报告,则不必担心这一点 . 只需确保您优雅地处理错误,并且永远不会向用户透露任何问题的真正原因 . 向公众展示真正的事业可以为那些想要伤害您的网站和服务器的人提供金色邀请函 . 如果您不想将错误发送到浏览器,则可以始终监视Web服务器错误日志 . 日志位置因服务器而异,例如,在Ubuntu上,错误日志通常位于 /var/log/apache2/error.log . 如果您正在检查Linux环境中的错误日志,则可以使用 tail -f /path/to/log 在控制台窗口中查看实时发生的错误....或者在制作它们时 .

    一旦您对标准错误报告进行了 balancer ,就会在数据库连接上添加错误检查,并且查询将为您提供有关正在进行的问题的更多详细信息 . 看一下列名不正确的示例 . 首先,返回通用致命错误消息的代码:

    $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;
        echo $error; // 1054 Unknown column 'foo' in 'field list'
    }
    

    如果出现问题,您可以吐出一条错误消息,直接告诉您该问题 . 在这种情况下,表中没有 foo 列,解决问题是微不足道的 .

    如果选择,您可以在函数或类中包含此检查,并通过如前所述优雅地处理错误来扩展它 .

  • 40

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

    如果您在脚本中使用多个查询,即使您包含其他包含查询或数据库连接的页面,那么您可能在任何地方使用db_close()来关闭数据库连接,因此请确保您是不要在你的脚本中犯这个错误 .

  • 27

    首先检查您的连接 .

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

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

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

  • 20

    在执行fetch数组之前,你也可以检查是否有这样的错误.1183147_是这样的

    $username = $_POST['username'];
    $password = $_POST['password'];
    $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
    if(!$result)
    {
         echo "error executing query: "+mysql_error(); 
    }else{
           while($row = mysql_fetch_array($result))
           {
             echo $row['FirstName'];
           }
    }
    
  • 15

    您可以尝试此代码 . 当我遇到类似你的问题时,我早些时候发现了它 .

    if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];
    
    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];
    
    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "
    "; $total += $qm . "
    "; } echo $total . "/" . $marks; }
  • 10

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

    include_once(db_connetc.php');
    

    要么

    // 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); .

  • 8

    试试这个代码就可以了

    将post变量赋给变量

    $username = $_POST['uname'];
    
       $password = $_POST['pass'];
    
      $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');
    
    if(!empty($result)){
    
        while($row = mysql_fetch_array($result)){
            echo $row['FirstName'];
         }
    }
    

相关问题