2013-02-11 24 views
2

我得到這個錯誤的:致命錯誤:調用一個成員函數查詢()非對象

致命錯誤:調用一個成員函數查詢()一個非對象在/應用/ 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'); 
    } 
    } 
} 

甲nd代碼connect.php:

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

可能是什麼問題?連接數據庫的問題?

+1

'$ mysqli'不在你的函數範圍內。 – datasage 2013-02-11 22:25:55

回答

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注入vulnerabiliy。使用prepared statements來防止這個問題(或者至少用mysqli::real_escape_string這樣的函數來逃脫你的輸入變量)。

+0

這是問題所在。謝謝大家的快速響應並幫助我。 編輯:我知道我的代碼在SQL注入中很脆弱。我正在學習PHP,所以一步一步:) – Weinz 2013-02-11 22:39:37

2

它看起來像你的$ mysqli變量沒有在你的代碼執行查詢的範圍內正確設置。你能確認$ mysqli確實是一個mysqli對象,而不是設置爲null嗎?

在您調用代碼中的 - >查詢方法之前,您可以通過執行以下操作來檢查:echo print_r($mysqli);

如果未設置得當,向後跟蹤變量在你的代碼,直到你明白爲什麼

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

變量$ mysqli在函數check_login超出範圍(它聲明在函數之外),所以它是空的。

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

然後通過$con在您定義或在任何地方運行的所有功能。

相關問題