问题:mysql_fetch_array()/ mysql_fetch_assoc()/ mysql_fetch_row()/ mysql_num_rows等...期望参数1为资源或结果

我正在尝试从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(...);
标签:php,mysql

回答1:

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

mysql_ *扩展名

注意:不推荐使用 mysql_函数并已在php版本7中删除。

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

mysqli扩展
过程样式< / em>:

$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时,否则(至少)将生成无效的HTML。另外,数据库错误消息也不应显示给非管理员用户,因为它披露太多信息

回答2:

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

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

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

故障排除步骤

  • 确保已将开发服务器配置为显示所有错误。您可以将其放置在文件顶部或配置文件中: 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 之类的工具运行查询。如果查询中存在语法错误,这将告诉您它是什么。

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

  • 确保您逃避了自己的价值观。查询中的引号可能会导致查询失败(也使您不愿接受SQL注入)。使用 mysql_real_escape_string() 逃避您的输入。

  • 确保您没有混合使用mysqli_*mysql_*函数。它们不是同一件事,不能一起使用。 (如果要使用mysqli_*选择一个或另一个棍子,请参见下文。)

其他提示

mysql_*函数不应用于新代码。它们已不再维护,社区已经开始弃用过程。相反,您应该了解准备好的语句,并使用 PDO MySQLi 。如果您不确定,本文将有助于选择。如果您想学习,这里是好的PDO教程

回答3:

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

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可以解决问题。

回答4:

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注入。

回答5:

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

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

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

回答6:

请检查一次选定的数据库不是因为某些时候未选择数据库

检查

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

回答7:

您的代码应该是这样的

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

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

回答8:

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

回答9:

此查询应工作:

$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。

回答10:

$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(您的查询);

回答11:

如果您在此处尝试了所有操作,但均无法正常工作,则可能需要检查MySQL数据库排序规则。我的被​​定为瑞典人整理。然后,我将其更改为utf8_general_ci,所有内容都被点击了。

回答12:

$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查询。使用查询比这要好得多。

我已经完成了此查询,并且没有收到参数或布尔值之类的错误。

回答13:

尝试一下,它必须可以工作,否则您需要打印错误以指定问题

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

回答14:

可能有两个原因:

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

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

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

回答15:

尝试以下代码。可能工作正常。

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

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

回答16:

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

回答17:

不要使用已描述的mysql_ *函数(在PHP 5.5中描述的函数将在PHP 7中删除)。您可以使用 mysqli pdo

这是完整的选择查询

<?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();
?>

回答18:

<?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."'");

回答19:

在MySQL查询之前添加连接字符串变量。例如,以下代码中的$connt

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

回答20:

任何时候你得到...

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

...这很可能是因为您的查询存在问题。 prepare()query()可能返回FALSE(布尔值),但是这种通用的失败消息并没有给您太多的麻烦线索的方式。您如何找出查询的问题?您询问

首先,请确保错误报告已打开且可见:在打开 标记之后,将这两行添加到文件顶部:

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

如果您在php.ini中设置了错误报告,则无需担心。只要确保您能正确处理错误,并且永远不要向用户透露任何问题的真正原因。向公众揭示真正的原因可以是那些想要损害您的站点和服务器的人的金色雕版邀请。如果您不想向浏览器发送错误,则可以随时监视Web服务器错误日志。日志位置因服务器而异,例如,在Ubuntu上,错误日志通常位于/var/log/apache2/error.log。如果您正在Linux环境中检查错误日志,则可以在控制台窗口中使用tail-f/path/to/log来实时查看错误。你做的。

一旦您不再使用标准错误报告,就可以在数据库连接上添加错误检查,而查询将为您提供有关发生的问题的更多详细信息。看一下此示例,其中列名不正确。首先,返回一般致命错误消息的代码:

$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列,因此解决问题很简单。

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

回答21:

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

回答22:

尝试一下

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

回答23:

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

如果完成了,那么之后我就编写了这段代码,并且效果很好:

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'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}

回答24:

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

如果在脚本中使用多个查询,甚至包括其他包含查询或数据库连接的页面,那么可能在任何地方使用db_close()都会关闭数据库连接,因此请确保您没有在脚本中犯此错误。

回答25:

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

回答26:

请先检查您的连接。

然后,如果要从数据库中获取确切的值,则应编写:

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

回答27:

您还可以在执行获取数组

之前检查$result是否失败了
$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'];
       }
}

回答28:

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

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

回答29:

尝试此代码可以正常工作

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

回答30:

由于$ username是一个php变量,我们需要将其作为字符串传递给mysqli,因此由于在查询中u以单引号开头,因此我们将使用双引号,单引号和句号来进行表示("'。 $ 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。它简单但很安全

回到顶部