我有这个错误:
致命错误:在第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);
}
可能是什么问题?连接数据库的问题?
答案 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)
答案 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
。