在ajax中包含php类时出现问题


Something breaks while including a php class in ajax

我在使用ajax包含php类时遇到问题。基本上,我有用ajax example.php加载的index.php。example.php包括init.php,init.php又包括一堆类。我把它缩小到users.php类,粘贴在下面。我还把init.php放在下面以防万一。

该文件根本无法使用ajax加载。如果我直接去看,效果很好。

<?php 
class Users{
private $db;
public function __construct($database) {
    $this->db = $database;
}   
public function update_user($first_name, $last_name, $gender, $bio, $image_location, $id){
    $query = $this->db->prepare("UPDATE `users` SET
                            `first_name`    = ?,
                            `last_name`     = ?,
                            `gender`        = ?,
                            `bio`           = ?,
                            `image_location`= ?
                            WHERE `id`      = ? 
                            ");
    $query->bindValue(1, $first_name);
    $query->bindValue(2, $last_name);
    $query->bindValue(3, $gender);
    $query->bindValue(4, $bio);
    $query->bindValue(5, $image_location);
    $query->bindValue(6, $id);
    try{
        $query->execute();
    }catch(PDOException $e){
        die($e->getMessage());
    }   
}
public function change_password($user_id, $password) {
    global $bcrypt;
    /* Two create a Hash you do */
    $password_hash = $bcrypt->genHash($password);
    $query = $this->db->prepare("UPDATE `users` SET `password` = ? WHERE `id` = ?");
    $query->bindValue(1, $password_hash);
    $query->bindValue(2, $user_id);             
    try{
        $query->execute();
        return true;
    } catch(PDOException $e){
        die($e->getMessage());
    }
}
public function recover($email, $generated_string) {
    if($generated_string == 0){
        return false;
    }else{
        $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `email` = ? AND `generated_string` = ?");
        $query->bindValue(1, $email);
        $query->bindValue(2, $generated_string);
        try{
            $query->execute();
            $rows = $query->fetchColumn();
            if($rows == 1){
                global $bcrypt;
                $username = $this->fetch_info('username', 'email', $email); // getting username for the use in the email.
                $user_id  = $this->fetch_info('id', 'email', $email);// We want to keep things standard and use the user's id for most of the operations. Therefore, we use id instead of email.
                $charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
                $generated_password = substr(str_shuffle($charset),0, 10);
                $this->change_password($user_id, $generated_password);
                $query = $this->db->prepare("UPDATE `users` SET `generated_string` = 0 WHERE `id` = ?");
                $query->bindValue(1, $user_id);
                $query->execute();
                mail($email, 'Your password', "Hello " . $username . ",'n'nYour your new password is: " . $generated_password . "'n'nPlease change your password once you have logged in using this password.'n'n-Example team");
            }else{
                return false;
            }
        } catch(PDOException $e){
            die($e->getMessage());
        }
    }
}
public function fetch_info($what, $field, $value){
    $allowed = array('id', 'country', 'money', 'flag', 'email'); // I have only added few, but you can add more. However do not add 'password' eventhough the parameters will only be given by you and not the user, in our system.
    if (!in_array($what, $allowed, true) || !in_array($field, $allowed, true)) {
        throw new InvalidArgumentException;
    }else{
        $query = $this->db->prepare("SELECT $what FROM `users` WHERE $field = ?");
        $query->bindValue(1, $value);
        try{
            $query->execute();
        } catch(PDOException $e){
            die($e->getMessage());
        }
        return $query->fetchColumn();
    }
}
public function confirm_recover($email){
    $username = $this->fetch_info('username', 'email', $email);// We want the 'id' WHERE 'email' = user's email ($email)
    $unique = uniqid('',true);
    $random = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ'),0, 10);
    $generated_string = $unique . $random; // a random and unique string
    $query = $this->db->prepare("UPDATE `users` SET `generated_string` = ? WHERE `email` = ?");
    $query->bindValue(1, $generated_string);
    $query->bindValue(2, $email);
    try{
        $query->execute();
        mail($email, 'Recover Password', "Hello " . $username. ",'r'nPlease click the link below:'r'n'r'nhttp://www.example.com/recover.php?email=" . $email . "&generated_string=" . $generated_string . "'r'n'r'n We will generate a new password for you and send it back to your email.'r'n'r'n-- Example team");           
    } catch(PDOException $e){
        die($e->getMessage());
    }
}
public function user_exists($username) {
    $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `username`= ?");
    $query->bindValue(1, $username);
    try{
        $query->execute();
        $rows = $query->fetchColumn();
        if($rows == 1){
            return true;
        }else{
            return false;
        }
    } catch (PDOException $e){
        die($e->getMessage());
    }
}
public function email_exists($email) {
    $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `email`= ?");
    $query->bindValue(1, $email);
    try{
        $query->execute();
        $rows = $query->fetchColumn();
        if($rows == 1){
            return true;
        }else{
            return false;
        }
    } catch (PDOException $e){
        die($e->getMessage());
    }
}
public function register($username, $password, $email, $country, $timezone, $dst){
    global $bcrypt; // making the $bcrypt variable global so we can use here
    $date       = date( 'Y-m-d' );
    $ip         = $_SERVER['REMOTE_ADDR']; // getting the users IP address
    $email_code = $email_code = uniqid('code_',true); // Creating a unique string.
    $password   = $bcrypt->genHash($password);
    $query  = $this->db->prepare("INSERT INTO `users` (`username`, `password`, `email`, `country`, `timezone`, `dst`, `ip`, `regdate`, `email_code`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ");
    $query->bindValue(1, $username);
    $query->bindValue(2, $password);
    $query->bindValue(3, $email);
    $query->bindValue(4, $country);
    $query->bindValue(5, $timezone);
    $query->bindValue(6, $dst);
    $query->bindValue(7, $ip);
    $query->bindValue(8, $date);
    $query->bindValue(9, $email_code);
    try{
        $query->execute();
        mail($email, 'Please activate your account', "Hello " . $username. ",'r'nThank you for registering with us. Please visit the link below so we can activate your account:'r'n'r'nhttp://www.touringlegends.com/register.php?email=" . $email . "&email_code=" . $email_code . "'r'n'r'n-- Example team");
    }catch(PDOException $e){
        die($e->getMessage());
    }   
}
public function activate($email, $email_code) {
    $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `email` = ? AND `email_code` = ? AND `accountlevel` = ?");
    $query->bindValue(1, $email);
    $query->bindValue(2, $email_code);
    $query->bindValue(3, 0);
    try{
        $query->execute();
        $rows = $query->fetchColumn();
        if($rows == 1){
            $query_2 = $this->db->prepare("UPDATE `users` SET `accountlevel` = ? WHERE `email` = ?");
            $query_2->bindValue(1, 1);
            $query_2->bindValue(2, $email);             
            $query_2->execute();
            return true;
        }else{
            return false;
        }
    } catch(PDOException $e){
        die($e->getMessage());
    }
}

public function email_confirmed($email) {
    $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `email`= ? AND `accountlevel` >= ?");
    $query->bindValue(1, $email);
    $query->bindValue(2, 1);
    try{
        $query->execute();
        $rows = $query->fetchColumn();
        if($rows == 1){
            return true;
        }else{
            return false;
        }
    } catch(PDOException $e){
        die($e->getMessage());
    }
}
public function login($email, $password) {
    global $bcrypt;  // Again make get the bcrypt variable, which is defined in init.php, which is included in login.php where this function is called
    $query = $this->db->prepare("SELECT `password`, `id` FROM `users` WHERE `email` = ?");
    $query->bindValue(1, $email);
    try{
        $query->execute();
        $data               = $query->fetch();
        $stored_password    = $data['password']; // stored hashed password
        $id                 = $data['id']; // id of the user to be returned if the password is verified, below.
        if($bcrypt->verify($password, $stored_password) === true){ // using the verify method to compare the password with the stored hashed password.
            return $id; // returning the user's id.
        }else{
            return false;   
        }
    }catch(PDOException $e){
        die($e->getMessage());
    }
}
public function userdata($id) {
    $query = $this->db->prepare("SELECT * FROM `users` WHERE `id`= ?");
    $query->bindValue(1, $id);
    try{
        $query->execute();
        return $query->fetch();
    } catch(PDOException $e){
        die($e->getMessage());
    }
}
public function get_users() {
    $query = $this->db->prepare("SELECT * FROM `users` ORDER BY `time` DESC");
    try{
        $query->execute();
    }catch(PDOException $e){
        die($e->getMessage());
    }
    return $query->fetchAll();
}   
}

init.php:

<?php 
session_start();
require($_SERVER['DOCUMENT_ROOT'].'/core/connect/database.php');
require($_SERVER['DOCUMENT_ROOT'].'/core/classes/users.php');
require($_SERVER['DOCUMENT_ROOT'].'/core/classes/general.php');
require($_SERVER['DOCUMENT_ROOT'].'/core/classes/bcrypt.php');
require($_SERVER['DOCUMENT_ROOT'].'/core/classes/garage.php');
// error_reporting(0);
$users      = new Users($db);
$general    = new General();
$bcrypt     = new Bcrypt(12);
$errors = array();
if ($general->logged_in() === true)  {
$user_id    = $_SESSION['id'];
$user       = $users->userdata($user_id);
}
ob_start();

以下是js加载文件(这有点奇怪,因为它重新加载了jscrollpane,但在html和php中运行良好,不需要外部类):

// Ajax
$(function () {
var api = $("#garagecontent").jScrollPane().data('jsp');
var reinitialiseScrollPane = function()
{
    api.reinitialise();
}
// attaching click handler to links
$(document).on('click', '#garagecontainer a[href]', function (e) {
    // cancel the default behaviour
    e.preventDefault();
    // get the address of the link
    var href = $(this).attr('href');
    // getting the desired element for working with it later
    var $wrap = $('#garagecontent');
    $wrap
    // removing old data
    api.getContentPane()
        // load the remote page
        .load(href, reinitialiseScrollPane , function (){
        }
    );
});
});

我已经把它缩小到users.php,因为当我把它从includes(及其在init.php中的函数)中删除时,它就会工作

有人能发现是什么破坏了我的密码吗?

这个问题的解决方案是使用自动加载器。由于调用了重复的类,页面正在中断。我想是我的错,因为我禁用了错误。