0

現在、ユーザーを登録する以下のコードがあります。

ユーザー名が現在存在するかどうかなどはチェックしません。これは私が実装したいものです。

PHP オブジェクトとフォームを一緒に使用する方法を知りませんでした。どんな助けでも大歓迎です。

register.php

ページは、ユーザーがすでにログインしているかどうかを確認します。どちらの方法でも、フォームは引き続き表示され、それ自体に送信されます。データベース アクセスの詳細はconfig.php定数として格納されます。

<?php
session_start();

include("includes/config.php");

if(isset($_SESSION['username'])) {
    echo "You are currently logged in as: " . $_SESSION['username'];
    echo "<br />";
    include("nav.php");
    echo "<hr />";
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
<?php

$odb = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USER, DB_PASS);





if (isset($_POST['firstName'])) {
    $firstName = $_POST['firstName'];
    $lastName = $_POST['lastName'];
    $username = $_POST['username'];
    $password = $_POST['password'];
    $password = md5(DB_SALT.$password);
    $type = $_POST['type'];
    $date=date("Y-m-d");                
    $time=date("H:i:s");

    $sql = "INSERT INTO tblMembers (firstName, lastName, username, passwordHash, type, joinedDate, joinedTime, lastActiveDate, lastActiveTime) VALUES (:firstName, :lastName, :username, :passwordHash, :type, :joinedDate, :joinedTime, :lastActiveDate, :lastActiveTime);";
    $query = $odb->prepare($sql);
    $results = $query->execute(array(
        ":firstName" => $firstName,
        ":lastName" => $lastName,
        ":username" => $username,
        ":passwordHash" => $password,
        ":type" => $type,
        ":joinedDate" => $date,
        ":joinedTime" => $time,
        ":lastActiveDate" => $date,
        ":lastActiveTime" =>$time
        ));
}
?>
<form method="post" action="">
    Name: <input type="text" id="firstName" name="firstName" value="Michael" /><br />
    Last Name: <input type="text" id="lastName" name="lastName" value="Norris" /><br />
    Username: <input type="text" id="username" name="username" value="mstnorris" /><br />
    Password: <input type="password" id="password" name="password" value="password" /><br />
    Type: <input type="text" id="type" name="type" value="4" /><br />
    <input type="submit" value="Add" />
</form>
</body>
</html>

クラスを使用してphpオブジェクトを作成する方法を知っています。私が使用した方法は時代遅れであると言われましたが、これは私が以前に持っていたものです. 誰かがそれを更新する方法に光を当てることができれば、それは確かに役立ちます.

<?php

require_once("database.php");

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

    function __construct($firstName, $lastName, $username, $password, $reviews, $type) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->username = $username;
        $this->password = $password;
        $this->reviews = $reviews;
        $this->type = $type;
        //$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);
    }
}

?>

MVC アプローチは AJAX で使用できますか? また、それを念頭に置いて、私が以前に他のプロジェクトで使用した AJAX コードは $_GET を使用していますが、データがアドレス バーに送信されることはないため、これに問題はありますか? もしそうなら、AJAX で $_POST を使用するにはどうすればよいですか?

4

2 に答える 2

1

マイク:

あなたのセットはこのようなゲッターとセッターです:

class Spam
{
    public $attr;
    public $var;
    public $arg;

    /* __construct, __set, and __get 
      these are all special functions
      we know this from the double underscore */

    function __construct () 
    {
           // construction code
    }

    function __set ( $arg0, $arg1 )
    {    
           $this->$arg0 = $arg1;
    }

    function __get ( $arg )
    {
           return $this->$arg;
    }
}

次のようにコードから呼び出します。

// this calls the __constructor function
$barney = new Spam();

// this calls the __set function
$barney->attr = "garnished with spam & eggs";

// this calls the __get function
$attrValue = $barney->attr;

これにより、変数の値を設定/取得するために別のメソッドを呼び出す必要が少なくなります。クラスの外部からプライベート変数と保護変数にアクセスできないため、これはパブリック変数でのみ機能します。

また、ビュー、モデル、およびコントローラーを個別に用意することをお勧めします。コントローラはフォームが送信するスクリプトであり、モデルはインスタンス化されるクラスであり、ビューはユーザーが情報を送信する場所です。これにより、コントローラーとビューを一緒にするのではなく、コードを理解しやすくなります。

なんらかの理由でPHP4に制限されていますか?または、本当に古いコードをダウンロードして、それを機能させようとしていますか?

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< [UPDATE 2.27.2013] >>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>

JavaScriptAJAXテクノロジーと組み合わせたOOPPHPプログラミング

Model-View-Controller:

MVCはPHPに固有のものではありません。MVCは、コードの保守性の問題を解決することを目的としたソフトウェアデザインパターンであり、コードの個別のコンポーネントを組み合わせて、コードを読みにくくし、保守を困難にします。これは、最終的にはセキュリティリスクにもなります。Model-View-Controllerは通常、フレームワークを介して実装されます。PHPに関しては、Zend、CodeIgniter、CakePHPなどのフレームワークが利用可能です。独自のPHPフレームワークを作成することはできますが、フレームワークはドキュメントツリーを介してモデルビューコントローラーを実装します(これは、言語)、すでに存在しているものを使用する方がおそらく良いでしょう。これらのフレームワークは、独自の標準を適用して、コードを改善することもできます。

Model-View-Controller

保守可能なMVCフレームワークを理解するには、Webサイトを完全にPHPでコーディングすることに精通している必要があります。つまり、PHPクラス[モジュール|モデル]を使用して、ユーザーが行ったこと[ コントローラーファイルがモデルを制御する]に応じてHTMLページ[ビュー]を動的に生成する必要があります。

あなたの質問は非常に曖昧で、あなたの質問が何であるかを伝えるのは難しいですが、MVCとは何か、そしてそれをどのように使用するかを理解できないという印象を受けます。開発するWebサイトのレイアウトを作成したとします。ユーザーの画面のサイズを予測することはできないため、レイアウトはブラウザで設計されています。レイアウト[または必要に応じてテンプレート]は、標準に準拠したHTML5またはXHTMLである必要があります。画像で構成しないでください。一部の人々はこれについて私に同意しないかもしれませんが、あなたのロゴ/ヘッダーを除いて(これにもテキストを使用する人もいますが)、テンプレートの一部にタグを含めるべきではありません(これはコンテンツが書き込まれる前です、明らかにあなたおそらくあなたのコンテンツでたくさんの画像を使いたいでしょう)。この時点でのビューはHTMLとCSSである必要があります。レイアウトの一部である画像(つまり、パターン、背景、レイアウト固有のもの)はすべて、WebサイトのCSSに含まれている必要があります。これは、MVCパターンを使用するのと同じ理由です。これにより、分離する必要があるものが分離されます。

レイアウトをHTMLとして受け取り、関数を含むPHPクラス[モジュール]を記述します。たとえば、$ view-> showLeadboard();、 $ view-> showAds();を使用します。$ view-> showFooter(); $ view-> setTitle( "Title");、 $ view-> setDescription( "Description"); ...これは、クラスをインスタンス化したことを前提としています。おそらく、クラスをインスタンス化するのではなく、静的メソッドを使用したい場合は、選択はあなた次第ですが、それを実行する正当な理由があるのに十分なほどうまく実行していることを理解する必要があります。

ビューがPHPモジュール内に保持されるようになったので、コンテンツについて心配することができます。Webサイトが動的である場合、データベースからの動的コンテンツを含む複数のページとそれらのページ上の場所、またはコントローラーにデータを送信するフォーム(まだビュー内にあります)が存在する可能性があります。

誰かがあなたのウェブサイトに登録しているとしましょう。ドメインに移動すると、 www.site.comへのリクエストに基づいてビューが生成され、生成される ビューがインデックスページになります。あなたのページに来たこの人はあなたのサービスにアカウントを登録することにしました。「登録」ハイパーリンクをクリックすると、ログイン資格情報を作成するためのフォームを表示する別のビューが生成されます。フォームに記入して[送信]をクリックします。フォームで提供された情報はコントローラーに送信されます(現在、ajaxについて話したり、javascriptコードのMVCデザインパターンを実装したりすることはありません) 。viewsite.com /registerがコントローラーサイトに送信すると言います。 .com / engine/process.phpProcess.phpフォームからユーザーデータをフィルター/サニタイズし、正しいクラス(モデル、これを新しい Userと呼びます)をインスタンス化します。このクラスは、メソッドの1つを介して、またはコンストラクターを介してデータベース呼び出しを行います(注意が必要です)。 PHPで使用できる魔法のメソッドの例)そしてこのクエリの結果は、コントローラーがモデルに伝えた内容とモデルがビューに伝えた内容に応じて、ビューをわずかに異なるものに変更します。

AJAXに関するあなたの質問について私が何を言うことができるかさえわかりません-PHPでのあなたの立場を考えると、あなたはajax呼び出しにJQueryを使用していると推測します。この場合、jqueryファイルからmodel-view-controllerを実装する必要がない場合は、jqueryスクリプトを作成し、そのスクリプトを呼び出して実装するメソッドをビューに追加するだけです。

全体として、MVCのような一般的なパターンとその使用方法を理解するのに苦労している場合は、基本に戻る必要があります。作者が使用したソリューションを使用した理由がわからない場合、オンラインチュートリアルが役に立たないことを強調することはできません。また、簡単なこともあるので、説明していない可能性があります。 php言語、その構文、およびphp言語の問題を解決する方法の基本を理解していれば、自分自身を理解することができます。これはすべて、言語を使って時間を過ごし、言語がどのように機能するかを学び、言語がうまくいかないこととうまくいくことを学ぶことから生まれます。

于 2013-02-26T01:43:27.953 に答える
0

いくつかの質問が 1 つの大きな質問にまとめられていますが、できる限りお答えします。重要な順にお答えします。

  1. クラスをどのように更新しますか。
  2. フォームをより適切に構築する方法。
  3. ログイン状態を確認する方法。
  1. 現在、ほとんどのアプリケーションは何らかの形式の MVC アーキテクチャを使用しています。モデル、ビュー、およびコントローラーは、責任をクラスに分離する方法です。これは、PHP の MVC アーキテクチャに関する簡単なチュートリアルです。そうは言っても、 ZendCakePHPなど、使用できるオープン ソース フレームワークは多数あります。

    MVC の戦略の 1 つを使用するか、フレームワークを試してください。

  2. フォームを自分自身に送信しないようにしてください。代わりに、別のページにルーティングし、そこでロジックを処理します。[]また、表記法を使用して、入力を配列にラップすることもできます。例えば:<input type="text" name="user[firstname]" />

    ただし、ログイン フォームを使用するだけの場合は、一意の ID と資格情報 (ユーザー名とパスワードなど) だけが必要です。

  3. ユーザーのログイン状態を保持する方法はいくつかありますが、主に使用されるのはセッションと Cookie です。モデル全体をセッションまたは Cookie に保存することは、通常、嫌われます。代わりに、データベースで比較できるユーザー名と一意のキーを保存してみてください。Cookie を使用すると、セッションの持続時間をより細かく制御できます。

于 2013-02-26T01:51:18.953 に答える