为了账号安全,请及时绑定邮箱和手机立即绑定

mysql_fetch_array()/mysql_fetch等…期望参数1是资源或结果

mysql_fetch_array()/mysql_fetch等…期望参数1是资源或结果

开满天机 2019-05-30 17:37:00
我正在尝试从MySQL表中选择数据,但我得到了以下错误消息之一:MySQL_FETCH_Array()期望参数1是资源,布尔给定或mysqli_FETCH_Array()期望参数1为mysqli_test,布尔给定或调用布尔/非对象上的成员函数FETCH_Array()这是我的密码:$username = $_POST['username'];$password = $_POST['password'];$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');while($row = mysql_fetchmysql_fetch_array()/mysql_fetch等…期望参数1是资源或结果_array($result)) {    echo $row['FirstName'];}同样的情况也适用于以下代码$result = mysqli_query($mysqli, 'SELECT ...');// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean givenwhile( $row=mysqli_fetch_array($result) ) {    ...和$result = $mysqli->query($mysqli, 'SELECT ...');// Call to a member function fetch_assoc() on a non-objectwhile( $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(...);
查看完整描述

4 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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

欧式:

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


查看完整回答
反对 回复 2019-05-30
?
三国纷争

TA贡献1804条经验 获得超7个赞

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

  • 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_*。见下文的原因。)

查看完整回答
反对 回复 2019-05-30
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

这里发生错误是由于使用单引号(')。您可以这样放置查询:

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

它正在使用mysql_real_escape_string用于防止SQL注入。虽然我们应该使用MySQLi或PDO_MySQL扩展来升级PHP版本(PHP5.5.0及更高版本),但是对于旧版本mysql_real_escape_string会成功的。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 1197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信