致命错误:调用一个成员函数查询()非对象上(Fatal error: Call to a membe

2019-07-19 18:15发布

我得到这个错误:

致命错误:调用一个成员函数查询()非对象上在/Applications/XAMPP/xamppfiles/htdocs/login.php第8行

该生产线是这样的:

$res = $mysqli->query("SELECT * FROM user WHERE user='$user' and password='$pw'");

这是login.php中:

$user = $_POST['user'];
$pass = $_POST['pass'];
$pw = md5($pass); 
include_once('connect.php');

function check_login($user,$pw,&$result){
    $res = $mysqli->query("SELECT * FROM user WHERE user='$user' and password='$pw'");
    $cont = 0;
    while($row = $res->fetch_object()){
        $cont++;
        $result = $row;
    }
    if($cont == 1){
        return 1;
    }
    else{
        return 0;
    }
}

if(!isset($_SESSION['userid'])){
  if(isset($_POST['login'])){
    if(check_login($user,$pw,$result) == 1){
        session_start();
        $_SESSION['userid'] = $result->id_user;
        header("location:index.php?var=ok");
    }
    else{
        header('location:index.php?var=log');
    }
  }
}

和connect.php的代码:

$mysqli = new mysqli('localhost', 'root', 'pass', 'cms' );
if ($mysqli->connect_error) {
   die('Error de Conexión (' . $mysqli->connect_errno . ') '
        . $mysqli->connect_error);
 }

可能是什么问题呢? 连接数据库的问题?

Answer 1:

这很可能是一个范围界定问题。 这意味着变量$mysqli您在包含文件中定义为外check_login功能的范围(即未在此函数内已知的)。

你可以尝试获得$mysqli从具有全局范围变量

function check_login($user,$pw,&$result){
    global $mysqli;
    $res = $mysqli->query("SELECT * FROM user WHERE user='$user' and password='$pw'");
    // ...

编辑 :哦,你也应该介意在你的代码中的SQL注入vulnerabiliy。 使用准备好的语句 ,以防止出现此问题(或者至少像函数逃不出你的输入变量mysqli::real_escape_string )。



Answer 2:

function check_login($user,$pw,&$result){
    global $mysqli;
    $res = $mysqli->query("SELECT * FROM user WHERE user='$user' and password='$pw'");
    $cont = 0;
    while($row = $re[...]

心灵的“全局”。 这使VAR在方法的范围。 这是一个快速和肮脏的解决方案,但在这种情况下工作。



Answer 3:

它看起来像你的$ mysqli的变量没有被正确设置你的代码的范围内,多数民众赞成执行查询。 你能否证实$ mysqli的确实是一个mysqli的对象,而不是,比方说,设置为空?

您可以通过执行检查: echo print_r($mysqli); 您电话之前 - 在你的代码>查询方法。

如果没有设置得当,向后跟踪变量在你的代码,直到你明白为什么



Answer 4:

在功能check_login变量$ mysqli的超出范围(它是声明函数以外),所以它是空的。



Answer 5:

public function connectDB($DBServer, $DBUser, $DBPass, $DBName) {
            global $con;
            $con = new mysqli($DBServer, $DBUser, $DBPass, $DBName) or die ("Error occured");
            return $con;

然后通过$con在所有定义或任何地方运行的功能。



文章来源: Fatal error: Call to a member function query() on a non object
标签: php mysqli