致命错误:在非对象上调用成员函数query()

时间:2013-02-11 22:20:40

标签: php mysqli

我有这个错误:

致命错误:在第8行的/Applications/XAMPP/xamppfiles/htdocs/login.php中调用非对象的成员函数query()

这一行是这样的:

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

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

5 个答案:

答案 0 :(得分:7)

这很可能是scoping问题。这意味着您在包含文件中定义的变量$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注入漏洞。使用prepared statements来防止此问题(或者至少使用mysqli::real_escape_string之类的函数来转义输入变量。

答案 1 :(得分:3)

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放在方法的范围内。 这是一个快速而肮脏的解决方案,但在这种情况下可以使用。

答案 2 :(得分:2)

看起来你的$ mysqli变量没有在执行查询的代码范围内正确设置。你能否确认$ mysqli确实是一个mysqli对象,而不是设置为null?

您可以在代码中调用 - >查询方法之前执行以下操作来检查:echo print_r($mysqli);

如果设置不正确,请在代码中向后跟踪变量,直到看到原因

答案 3 :(得分:2)

函数check_login中的变量$ mysqli超出了范围(它在函数外部声明)所以它是null。

答案 4 :(得分:1)

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

然后在您定义或运行的所有函数中传递$con