0

我正在尝试使用 mysqli->fetch_row()(或 fetch_object()、fetch_array())获取结果,但是当我在运行时运行代码时,它给了我以下错误:

致命错误:在第 23 行调用非对象中的成员函数 fetch_row()。

执行此操作的有问题的 var 是下面代码中的 $results。$user 和 $password 从包含该文件的另一个 .php 文件中获取它们的值,因此目前这并不重要。现在纠正我,如果我错了,但是如果 $results 被设置为 = $db->query($query) 那么它不应该继承 $db aka mysqli 类的属性吗?

class mySQLHelper{

    public function checkPass($user, $pass){
        global $db;
        $db =  new mysqli();
        $db->connect('localhost', 'root', '', 'mydb');
        if (mysqli_connect_errno()){
            echo 'Can not connect to database';
            echo mysqli_connect_errno(). mysqli_connect_error();
            exit;
            return false;
        }


        $query = "SELECT user, password FROM Users WHERE user = $user AND password = $pass " ;

       echo $query;

        $results = $db->query($query);

        while ($row = $results->fetch_row()){

            echo htmlspecialchars($row->user);
            echo htmlspecialchars($row->password);


        }

        $results->close();

        $url = 'http://'. $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/";
        if(!$results){
         //   mysqli_close($db);
          //  header("Location:.$url.login.php&msg=1");

        }

        else{
        //    mysqli_close($db);
        //    header("Location:.$url.featured.php");


        }

    }

}

4

5 回答 5

3

您的脚本缺少错误检查,因此未处理查询中的错误。

    $query = "SELECT user, password FROM Users 
    WHERE user = '$user' AND password = '$pass' " ;
    //           ^ quotes needed     

    echo $query;

    $results = $db->query($query);

    // handle a error in the query
    if(!$results)
      die($db->error);

    while ($row = $results->fetch_row()){
        echo htmlspecialchars($row->user);
        echo htmlspecialchars($row->password);
    }
于 2012-09-25T18:22:35.750 回答
3

您的查询在此行失败:

$results = $db->query($query);

因此,$resultsis false- 不是您期望的结果对象。

要解决此问题,您需要在变量周围添加引号(或使用准备好的语句):

$query = "SELECT user, password FROM Users WHERE user = '".$user."' AND password = '".$pass."' " ;

我建议更新以使用准备好的语句来防止 SQL 注入问题:

$stmt = $db->prepare('SELECT user, password FROM Users WHERE user = ? AND password = ?');
$stmt->bind_param('ss', $user, $pass);
$stmt->execute();
$results = $stmt->get_result();
于 2012-09-25T18:23:31.130 回答
2

如果您使用用户和密码字段文本或 varchar,那么您需要在它们周围使用单引号

$query = "SELECT user, password FROM Users WHERE user = '".$user."' AND password = '".$pass."' " ;
于 2012-09-25T18:22:30.620 回答
1

您必须检查查询是否正常运行:

if ($result = $mysqli->query($query))
{
}

使用: var_dump($results) 检查它包含什么

于 2012-09-25T18:24:35.190 回答
0

为什么你在尝试操纵它if($results) 之后还要检查它?

这个...

$results->close();
//...
if(!$results){
    //...
}

应该...

if(!$results){
    //...
}
$results->close();
于 2012-09-25T18:23:52.720 回答