2013-07-19 53 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并添加解决用户名和密码的帖子。