当前位置:  开发笔记 > 编程语言 > 正文

mysql_fetch_array()/ mysql_fetch_assoc()/ mysql_fetch_row()/ mysql_num_rows等...期望参数1是资源或结果

如何解决《mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows等期望参数1是资源或结果》经验,为你挑选了29个好方法。

我试图从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(...);

Edward Dale.. 659

查询可能由于各种原因而失败,在这种情况下,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扩展
程序样式:

$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 ) {
      ...

这些例子只是说明了什么应该做的(错误处理),而不是如何去做.or die输出HTML时不应使用生产代码,否则它将(至少)生成无效的HTML.此外,不应向非管理员用户显示数据库错误消息,因为它公开了太多信息.



1> Edward Dale..:

查询可能由于各种原因而失败,在这种情况下,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扩展
程序样式:

$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 ) {
      ...

这些例子只是说明了什么应该做的(错误处理),而不是如何去做.or die输出HTML时不应使用生产代码,否则它将(至少)生成无效的HTML.此外,不应向非管理员用户显示数据库错误消息,因为它公开了太多信息.


我打算为OP设计一个完整的错误处理机制,但我认为这可能超出了我的答案范围.
是的,但如果查询失败则使用die()是一点点.
而不是`if($ result === FALSE)`你可以使用`if(!$ result)`.如我错了请纠正我

2> John Conde..:

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

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> nik..:

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

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> 2ndkauboy..:

正如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> Matteo Riva..:

把报价放在一边$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> Chaitannya..:

你的代码应该是这样的

$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> Enis P. Agin..:

此查询应该有效:

$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(your query);



11> kolexinfos..:

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

我希望这可以帮助别人.



12> Amjad Omari..:

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

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


1)广泛的SQL注入,2)不包括导致OP的情况下的错误的错误处理.

13> 小智..:
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("$data[0]$data[1]$data[2]$data[3]");      
}

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

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



14> ravi..:

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

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

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


此代码受SQL注入,不应使用.

15> asim-ishaq..:

可能有两个原因:

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

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

第三,查询结构易于SQL注入.您可以使用预准备语句来避免此安全威胁.



16> 小智..:

如果用户具有唯一的用户名,则可以使用"=".没有必要喜欢.

您的查询将是:

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


此代码对SQL注入开放,不应该使用。

17> 小智..:

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



18> 小智..:

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

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



19> Manoj Kumar..:

不要使用depricated mysql_*函数(在PHP 5中删除将在php 7中删除).你可以用mysqli或pdo制作它

这是完整的选择查询

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



20> Suresh Ratte..:

试试这个

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


@panjehra mysql_*现在已被删除,将从php 7中删除.请改用mysqli_*

21> Jay Blanchar..:

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

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

...可能是因为您的查询存在问题.的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;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

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

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



22> 小智..:

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

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

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



23> 小智..:



24> 小智..:

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

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



25> 小智..:

首先检查您的连接.

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

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



26> user1012181..:

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



27> 小智..:

$result在执行fetch数组之前,您还可以检查是否出现故障

$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> Mithun Debna..:

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

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



29> Engr Zardari..:

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

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


此代码受SQL注入,不应使用.@EngrZardari如果你在你的生产系统上使用这个代码,你无疑已被黑客入侵,应该使用PDO或类似的准备/参数化查询来补救这种情况.有机器人可以自动测试这些漏洞.
1)你不知道我是否已经或没有在这里投票,无论是向上还是向下.2)正如我在第一次评论中所解释的那样; 你的答案没有引用问题(*boolean传递给mysql_fetch_array*),你有语法错误
您的代码示例中的引号都不正确.应用于第二个代码块的语法突出显示是一个错误的东西
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有