0

対話しようとしているクラス オブジェクトは範囲外です。私はいくつかのことを試しましたが、まだ解決できないようです。

コンソール ログにFatal error : Call to a member function userExists() on a non-object というエラーが引き続き表示されます。

サイトの構造は次のとおりです。

すべてのクラスをインクルードし、オブジェクトをインスタンス化する init.php があります。
これは、すべてのページの上部に含まれています。次に、本文内のすべてのページにも含まれるヘッダー インクルードがあります。ヘッダー内には、ログイン ボックスと、Ajax を呼び出してログインなどを検証する js 関数へのインライン イベント ハンドラーがあります。

オブジェクトが関数の範囲外であることを理解しています。それをパラメーターとして渡そうとしましたが、失敗しました。グローバルにするのと同じです。

誰かが解決策を提案してもらえますか?

コード:

初期化ファイル:

//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>

Ajax / 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);

    }
});
}

編集: ajax が呼び出す php を追加しました。

 <?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);

}
4

2 に答える 2

3

を使用globalしても変数がグローバルになるわけではなく、ローカル変数がグローバル空間で見えるようになるだけなので、ファイルからglobal $users;魔法のようにプルすることはありません$usersinit.php

あなたが誤解しているのは、あなたの ajax リクエストの発信元と宛先です。この場合:

  • あなたはinclude 'init.php'ajaxリクエストのオリジンにあります。
  • ajax リクエストの送信先とは関係ありません。この場合はloginProcessAjax.php. ブラウザからそのファイルを開くと想像できるので、もちろんあなた$usersnull

したがって、解決策はファイルinclude_once 'init.php';の先頭にありloginProcessAjax.phpます。それが役に立てば幸い。

于 2013-07-19T22:55:39.197 に答える
0

チャットで素晴らしいグルによって解決されました。

loginProcessAjax.ph の上部に init.php を追加し、フォームから false を返し、ユーザー名とパスワードの投稿を追加して解決しました。

于 2013-07-20T17:09:28.020 に答える