2

我有这个错误:

致命错误:在第 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);
 }

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

4

5 回答 5

7

这很可能是范围界定问题。这意味着$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 注入漏洞。使用准备好的语句来防止这个问题(或者至少使用类似的函数转义输入变量mysqli::real_escape_string)。

于 2013-02-11T22:27:06.490 回答
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 置于您的方法的范围内。这是一个快速而肮脏的解决方案,但在这种情况下可以工作。

于 2013-02-11T22:26:04.900 回答
2

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

您可以通过以下方式检查:echo print_r($mysqli);就在您在代码中调用 ->query 方法之前。

如果未正确设置,请在代码中向后跟踪变量,直到您了解原因

于 2013-02-11T22:23:36.803 回答
2

函数 check_login 中的变量 $mysqli 超出范围(它在函数外部声明),因此它为空。

于 2013-02-11T22:26:40.887 回答
1
public function connectDB($DBServer, $DBUser, $DBPass, $DBName) {
            global $con;
            $con = new mysqli($DBServer, $DBUser, $DBPass, $DBName) or die ("Error occured");
            return $con;

然后传入$con您定义或在任何地方运行的所有函数。

于 2015-03-24T07:54:14.750 回答