2013-07-19 77 views
0

我試圖與之交互的類對象超出範圍。我已經嘗試了一些東西,但仍似乎無法解決它。PDO對象超出範圍,嘗試使用Javascript函數調用

我仍然收到錯誤致命錯誤:調用控制檯日誌中非對象的成員函數userExists()。

該網站的結構是:

我有了包括所有的類和實例化對象的的init.php。
這是包含在每頁的頂部。 然後我有一個標題include,它也包含在body的每個頁面中。 標題內是一個登錄框,以及一個內聯事件處理程序到一個js函數,它調用Ajax來驗證登錄等。

我知道該對象超出了函數的作用域,我嘗試通過它作爲一個參數並且失敗,並且使它成爲全球性的。

有人可以請建議一個解決方案嗎?

代碼:

init文件:

//start session data 

session_start(); 

require 'core/connect/dbConnect.php'; 
require 'core/classes/users.php'; 
require 'core/classes/general.php'; 
require 'core/classes/helper.php'; 
require 'include/facebook.php'; 

//instantiating the classes 
$users = new Users($db); 
$general = new General(); 
$helper = new Helper(); 

error_reporting(E_ALL); ini_set('display_errors', 'On'); 

調用該函數的HTML:

<form method="post" action="" id="ourLoginFormID_JS"> 
        <div class="ourContactFormElement2"> 
         <label for="username">Username:</label> 
         <input type="text" id="username" name="username" autocomplete="off" class="required" value="<?php if(isset($_POST['username'])) echo htmlentities($_POST['username']); ?>" /> 
        </div> 

        <div class="ourContactFormElement2"> 
         <label for="password">Password:</label> 
         <input type="password" id="password" name="password" autocomplete="off" class="required"/> 
        </div> 

        <div class="ourContactFormElement2"> 
         <label> &nbsp; </label> 
         <input type="submit" name="loginButton" id="loginButton" value="Login!" onclick="validLogin(); return false;"/> 
        </div> 

        <div id="statusLogin"></div> 
       </form> 

阿賈克斯/ js函數:

function validLogin(){ 

alert("adsad"); 
$('.error').hide(); 
var username = $('#username').val(); 
if(username == ""){ 
    $('label#usernameError').show(); 
    $('input#username').focus(); 
    return false; 
} 
$('.error').hide(); 
var password = $('#password').val(); 
if(password == ""){ 
    $('label#passwordError').show(); 
    $('input#password').focus(); 
    return false; 
} 
alert("12344242"); 
var params = {username: username, password: password}; 
var url = "../js/loginProcessAjax.php"; 

$("#statusLogin").show(); 
$("#statusLogin").fadeIn(400).html('<img src="images/loading.gif" />'); 

$.ajax({ 
    type: 'POST', 
    url: url, 
    data: params, 
    dataType: 'json', 
    beforeSend: function() { 
     document.getElementById("statusLogin").innerHTML= 'checking...' ; 
    }, 

    success: function(data) { 
     alert("success Area ofAjax"); 

     $("#statusLogin").hide(); 

     if(data.success == true){ 
      alert("if data.success Area of Ajax"); 
      alert(data.message); 

     }else{ 
      alert("data.message... " + data.message);//undefined 
      $("#errorConsole").html(data.message); 
     } 

    }, 
    error: function(error) { 
     console.log(error); 

    } 
}); 
} 

編輯:添加PHP的Ajax調用。

<?php 

global $users; 

if($_POST){ 

if($users->userExists($username) === false){ 
    $data['message'] = "User doesn't exist"; 
    $data['success'] = false; 

....etc etc.... 
}else{ 

    $login = $users->login($username, $password); 

    if($login === false){ 

     $data['message'] = 'Incorrect Password or username'; 
     $data['success'] = false; 
    }else{ 
     $data['success'] = true; 
     //destroy old session and create new - prevents session fixation attacks 
     session_regenerate_id(true); 
     //all details are correct - the method returns the id to be sotred as a session 
     $_SESSION['id'] = $login; 
    } 


} 

echo json_encode($data); 

} 
+0

如果添加var_dump($ users),會得到什麼結果;出口; ($ users-> userExists($ username)=== false){ – Maximus2012

+0

爲什麼'init。php'不包含在你處理Ajax的文件中? –

+0

你也可以發佈'core/classes/users.php'類的代碼嗎? – Maximus2012

回答

3

使用global不會使全局空間的變量全球性的,它只是讓你的局部變量可見的,所以global $users;不會奇蹟般地拉你$users從你init.php文件

事情你誤解是您的ajax請求和目的地的來源。在這種情況下:

  • 您有在ajax請求的來源include 'init.php'
  • 它與ajax請求的目的地無關,在本例中爲loginProcessAjax.php。你可以把它想象成開放瀏覽器文件,所以當然你$usersnull

所以解決方案就是在include_once 'init.php';文件loginProcessAjax.php的開始。希望能幫助到你。

0

解決了一個美妙的導師聊天。

在我的loginProcessAjax.ph的頂部添加init.php,從表單返回false並添加解決用戶名和密碼的帖子。