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

#1楼

请检查一次选定的数据库是否不是,因为有时未选择数据库

校验

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

#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_*函数不应用于新代码。 它们已不再维护,社区已开始弃用过程 。 相反,您应该了解准备好的语句,并使用PDOMySQLi 。 如果您不能决定, 本文将有助于选择。 如果您想学习,这里有个不错的PDO教程


#3楼

如果您在这里尝试了所有操作,但没有成功,则可能要检查MySQL数据库排序规则。 我的被​​定为瑞典人整理。 然后,我将其更改为utf8_general_ci ,一切都随即生效。

我希望这可以帮助别人。


#4楼

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

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

#5楼

此查询应工作:

$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现在已被描述。


#6楼

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

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

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

#7楼

可能有两个原因:

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

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

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


#8楼

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


#9楼

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

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

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

#10楼

首先检查您的连接。

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

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

#11楼

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

代替使用WHERE查询,您可以使用此ORDER BY查询。 使用查询要比这好得多。

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


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

#13楼

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


#14楼

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

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

#15楼

您还可以在执行fetch数组之前检查$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'];
       }
}

#16楼

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

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

#17楼

试试这个代码可以正常工作

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

#18楼

在运行查询之前,请确保不使用db_close()关闭数据库:

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


#19楼

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


#20楼

您可以尝试此代码。 我在遇到类似于您的问题时较早找到了它。

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

#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楼

不要使用已描述的mysql_ *函数(在PHP 5.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();
?>

#23楼

查询可能由于各种原因而失败,在这种情况下,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 ) {
      ...

这些示例仅说明应该执行的操作(错误处理),而没有说明如何执行。 生产代码在输出HTML时不应使用or die ,否则它将(至少)生成无效的HTML。 另外,数据库错误消息不应显示给非管理员用户,因为它会显示过多信息


#24楼

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

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

另外,如果您不使用通配符,则没有必要使用LIKE条件:如果需要完全匹配,请使用=代替LIKE


#25楼

出现错误是由于使用单引号( ' )。 您可以这样查询:

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


#26楼

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


#27楼

您的代码应该是这样的

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

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


#28楼

尝试这个

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

#29楼

任何时候得到...

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

...这很可能是因为您的查询有问题。 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来查看错误的实时信息。

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

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

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


#30楼

$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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值