2

ユーザーがログインできる Web サイトを作成しています。ユーザーには、いくつかの設定を変更できる独自のプロファイル ページがあります。プロフィールを表示するには、ログインする必要があります。

ユーザーが名前、姓、ユーザー名、パスワードを求められる登録ページがあります。私が達成したいのは、ユーザーが自分のプロファイルを登録/ログイン/表示できる1ページのソリューションです.

これまでのところ、私はこれを持っています:

member.php - これはメンバー クラスです。

<?php

require_once("database.php");

class Member extends DatabaseObject {
    protected static $table_name = "tblMembers";
    var $firstName = null; // initiating the $firstName variable
    var $lastName = null; // initiating the $lastName variable
    var $username = null; // initiating the $username variable
    var $password = null; // initiating the $password variable
    var $reviews = null; // initiating the $reviews variable
    var $type = null; // initiating the $type variable

    function __construct($firstName, $lastName, $username, $password) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->username = $username;
        $this->password = $password;
        //$this->insert($firstName, $lastName, $username, $password, $type);
    }

    function set_firstName($firstName) {
        $this->firstName = $firstName;
    }

    function get_firstName() {
        return $this->firstName;
    }

    function set_lastName($lastName) {
        $this->lastName = $lastName;
    }

    function get_lastName() {
        return $this->lastName;
    }

    function get_fullName() {
        if (isset($this->firstName) && isset($this->lastName)) {
            return $this->firstName . " " . $this->lastName;    
        } else {
            return "";
        }
    }

    function set_username($username) {
        $this->username = $username;
    }

    function get_username() {
        return $this->username;
    }

    function set_password($password) {
        $this->password = md5(DB_SALT.$password);
    }

    function get_password() {
        return $this->password;
    }

    public static function authenticate($username="", $password="") { 
        global $database;
        $username = $database->escape_value($username);
        $password = $database->escape_value($password);
        $passwordHash = md5(DB_SALT.$password);

        $sql = "SELECT * FROM tblMembers ";
        $sql .= "WHERE username = '{$username}' ";
        $sql .= "AND passwordHash = '{$passwordHash}' ";
        $sql .= "LIMIT 1";

        $result_array = self::find_by_sql($sql);
        if (!empty($result_array)) {
            //echo "true";
            return array_shift($result_array); // Pulling first element from array
        } else {
            //echo "false";
            return false; // Ability to ask whether we return something
        }

    }

    public function insert($firstName, $lastName, $username, $password) {
        $database = new Database();
        $database->query("INSERT INTO tblMembers VALUES ('','{$firstName}','{$lastName}','{$username}','{$password}','4')");
    }

    // Common Database Methods

    private static function instantiate($record) {
        $object = new self;

        foreach ($record as $attribute=>$value) {
            if ($object->has_attribute($attribute)) {
                $object->$attribute = $value;
            }
        }
        return $object;
    }

    public static function find_all() {
        return self::find_by_sql("SELECT * FROM ".self::$table_name);
    }

    public static function find_by_id($id=0) {
        global $database;
        $result_array = self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE userID={$id} LIMIT 1");
        if (!empty($result_array)) {
            return array_shift($result_array); // Pulling first element from array
        } else {
            return false; // Ability to ask whether we return something
        }
    }   

    public static function find_by_sql($sql="") {
        global $database;
        $result_set = $database->query($sql);
        $object_array = array();
        while ($row = $database->fetch_array($result_set)) {
            $object_array[] = self::instantiate($row);
        }
        return $object_array;
    }

    private function has_attribute($attribute) {
        $object_vars = get_object_vars($this);
        return array_key_exists($attribute, $object_vars);
    }
}

?>

database.php

これはデータベースクラスです

<?php
require_once("config.php");
class Database {

    private $connection;
    public $last_query;
    private $magic_quotes_active;
    private $mysql_real_escape_string_exists;

    function __construct() {
        $this->open_connection();
        $this->magic_quotes_active = get_magic_quotes_gpc();
        $this->mysql_real_escape_string_exists = function_exists("mysql_real_escape_string");
    }

    public function open_connection() {
        // Create Database connection
        $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
        if (!$this->connection) {
            die("Database connection failed: " . mysql_error());
        } else {
            $db_select = mysql_select_db(DB_NAME, $this->connection);
            if (!db_select) {
                die("Database selection failed: " . mysql_error());
            }
        }
    }

    public function close_connection() {
        // Closes the connection to the database
        if(isset($this->connection)) {
            mysql_close($this->connection);
            unset($this->connection);
        }
    }

    public function query($sql) {
        $this->last_query = $sql;
        $result = mysql_query($sql, $this->connection);
        $this->confirm_query($result);
        return $result;
    }

    public function escape_value($value) {

        if ($this->mysql_real_escape_string_exists) {           
            if ($this->magic_quotes_active) {
                $value = stripslashes($value);
            }
            $value = mysql_real_escape_string($value);
        } else {
            if (!$this->magic_quotes_active) {
                $value = addslashes($value);
            }
        }
        return $value;
    }

    public function num_rows($result_set) {
        return mysql_num_rows($result_set);
    }

    public function insert_id($result_set) {
        return mysql_insert_id($this->connection);
    }

    public function affected_rows() {
        return mysql_affected_rows($this->connection);
    }

    public function fetch_array($result_set) {
        return mysql_fetch_array($result_set);
    }

    private function confirm_query($result) {
        if (!$result) {
            $output = "Database query failed: " . mysql_error() . "<br />";
            $output .= "Last SQL query: " . $this->last_query;
            die($output);
        }
    }
}


$database = new Database();

?>

データベースへの接続は正常に機能し、パラメーターconfig.phpDB_SALT.

register.php - これには登録フォームが含まれていますが、ページを強制的に更新する現在の post メソッドではなく、AJAX を使用してフォームを送信したいと考えています。これを達成するための助けをいただければ幸いです。私は慣れていないので、これにJQueryを使用したくありません。また、JavaScriptをまだ学習しているので、先に進みたくありません。

<?php
require_once("includes/config.php");
if(isset($_POST['submit'])) {
    $firstName = $_POST['firstName'];
    $lastName = $_POST['lastName'];
    $username = $_POST['username'];
    $password = $_POST['password'];
    $member = new Member();
    $member->insert($firstName, $lastName, $username, $password);
} else {
?>
<!DOCTYPE html>
<html lang="en-EN">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="css/style.css" media="screen" />
        <link rel="stylesheet" href="css/email_client.css" media="screen" />
        <!--[if !IE 7]>
            <style type="text/css">
                #wrap {display:table;height:100%}
            </style>
        <![endif]-->

        <title>Register</title>
    </head>
    <body>
        <?php include("includes/header.php"); ?>
        <div id="wrap">
            <div id="main">

                <nav>
                    <?php include("includes/nav.php"); ?>
                </nav>

                <div id="stylized" class="myform">
                    <form action="<?php echo $PHP_SELF; ?>" method="post">
                        <span class="label">First Name:</span>&nbsp;<input id="firstName" type="text" name="firstName" class="splash" value="John"><br />
                        <span class="label">Last Name:</span>&nbsp;<input id="lastName" type="text" name="lastName" class="splash" value="Smith"><br />
                        <span class="label">Username:</span>&nbsp;<input id="username" type="text" name="username" class="splash" value="jsmith"><br />
                        <span class="label">Password:</span>&nbsp;<input id="password" type="password" name="password" class="splash" value="pass"><br />
                        <span class="label">Confirm Password:</span>&nbsp;<input id="passwordConfirmation" type="password" name="passwordC" class="splash" value="pass"><br />
                        <input type="submit" value="Register" class="button" name="submit">
                    </form>
                </div>
            </div>
        </div>
        <div id="footer">
            <?php echo COPYRIGHT_STRING; ?>
        </div>  
    </body>
</html>
<?php } ?>

AJAX や SESSIONS などのテクノロジを組み込んで、ユーザーの状態を保存し、ログインが持続するようにしたいと考えています。

私が今苦労しているのは、register.php フォームの送信をどのように処理し、new Memberオブジェクトを作成し、そのすべてのデータをデータベースに直接挿入するかということです。

さまざまなチュートリアルを確認しましたが、ここで必要なものにはすべてが複雑すぎます。また、上記のように、少なくとも当面は jQuery を使用したくありません。

4

1 に答える 1

0

ajaxに関する一般的な考え

すべてを 1 ページにまとめてよろしいですか? 私の経験では、ログイン ページはプロファイル ページとは著しく異なって見えますが、それはあなたの選択です。

Ajax は、ほとんどの場合、JavaScript を介してサイトをロードするだけです。ここからXMLHttpRequestを開始できます。

XMLHttpRequest を使用して完全な Web サイトをロードし、html-body のコンテンツを置き換えることもできますが、ajax の背後にある考え方は、転送する必要があるもののみを転送することです。つまり、ブラウザーで Web サイトで変更する必要があるものを意味します。そのため、多くの場合、JSON データのみが転送されるか、Web サイト上の特定の div コンテナーの html データが転送されます。サーバーは、これらのリクエストに対して、たとえば非常に基本的な方法で準備する必要があります。

<?php
// read request data uses http://www.php.net/manual/en/book.filter.php
$firstName = filter_input(INPUT_POST, 'firstName', FILTER_SANITIZE_STRING);
$lastName  = filter_input(INPUT_POST, 'lastName', FILTER_SANITIZE_STRING);
$username  = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password  = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);

//create Memeber object and save it
require_once('member.php');
$member = new Member ($firstName, $lastName, $username, $password);
$success = $member->insert();

// answer the request
$data = new stdClass();
if( $success === true ) { 
    // return Success
    $data->success = true;
    print json_encode($data);
    exit();
} else {
    // return error
    $data->success = false;
    $data->message = 'Could not register';
    print json_encode($data);
    exit();
}
exit(-1);
?>

通常の方法でフォームを送信していないことを確認してくださいここを参照してください

jQuery を使用すると、これらすべてが非常に簡単になるため、jQuery を使用しないことを再検討する必要があるかもしれません。

PHP プログラミング

var非推奨のphpクラスでの使用をやめ、データベースクラスで行ったように可視性修飾子を使用してください( privatepublicprotected

OOP の使用に苦労しているため、PHP PDOに注意して、データベース層にそれらを使用してみてください。

データベースをシングルトンとして実装する方が簡単かもしれませんが、基本的には次を追加します。

<?php
// in Database class

/** The Sigleton instance
  * @var Database
  */
private static $instance = false;

/** Singleton Getter for this class.
  * @return Database The singleton instance.
  */
public static getInstance() {
    if(self::$instance === false) {
        self::$instance = new self();
    }
    return self::$instance;
}
?>

コンストラクターが保護されていることを確認して、他のインスタンスが作成されないようにします。それを使用するには、次のようにします。

<?php
// in Member class

public function insert($firstName, $lastName, $username, $password) {
    // get singleton instance;
    $db = Database::getInstance();

    return $db->query(sprintf(
        "INSERT INTO tblMembers VALUES ('','%s','%s','%s','%s','4')",
        $db->escape_value($this->firstName),
        $db->escape_value($this->lastName),
        $db->escape_value($this->username),
        $db->escape_value($this->password)
    ));
}
?>

これがあなたが始めるのに役立つことを願っています.

于 2014-01-18T18:54:24.107 に答える