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,这是否有任何问题,因为数据永远不会发送到地址栏?如果是这样,我如何将 $_POST 与 AJAX 一起使用?

4

2 回答 2

1

麦克风:

你设置了一个 getter 和一个像这样的 setter:

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?或者您是否下载了一些非常旧的代码并且您现在正试图让它工作?

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[ 2.27.2013 更新 ]>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>

结合 JavaScript AJAX 技术的 OOP PHP 编程

模型-视图-控制器:

MVC 并不特定于 PHP。MVC 是一种软件设计模式,旨在解决代码中的可维护性问题,它将代码的独立组件组合在一起,使代码的可读性降低且难以维护,这最终也是一种安全风险。模型-视图-控制器通常通过框架实现。关于 PHP,有一些可用的框架,例如 Zend、CodeIgniter、CakePHP 等。这些框架通过文档树实现模型视图控制器,尽管您可以创建自己的 PHP 框架(考虑到您的新手,这不是一个好主意语言),最好使用已经存在的语言。这些框架也可以强制执行他们自己的标准,从而产生更好的代码。

模型-视图-控制器

要了解可维护的 MVC 框架,您应该熟悉完全用 PHP 编写网站 > >。这意味着您应该使用 PHP 类 [modules|models] 来动态生成 HTML 页面 [视图],具体取决于用户所做的 [ 控制器文件控制模型]。

您的问题非常模糊,很难说出您的要求,但是,我的印象是您无法弄清楚 MVC 是什么以及如何使用它。假设您刚刚为将要开发的网站创建了布局。由于无法预测用户屏幕的大小,因此您的布局是在浏览器中设计的。您的布局 [或模板,如果您愿意的话] 应该是符合标准的 HTML5 或 XHTML。它不应该用图像构建。有些人可能不同意我的观点,但除了您的徽标/标题(尽管有些人也为此使用文本),您不应该将任何标签作为模板的一部分(这是在编写任何内容之前,显然您'可能希望在您的内容中使用大量图像)。此时您的视图应该是 HTML 和 CSS - 属于您的布局一部分的任何图像(即图案、背景、任何特定布局)都应该在您网站的 CSS 中。这与我们使用 MVC 模式的原因是一样的——它分离了应该分离的内容。

你把你的布局当作 HTML,你写一个 PHP 类[模块] 包含函数,例如我们将使用 $view->showLeadboard();, $view->showAds(); $view->showFooter(); $view->setTitle("Title");, $view->setDescription("Description");... 这假设你已经实例化了你的类。也许您不想实例化一个类并且您更喜欢使用静态方法,选择权在您手中,但您应该了解自己做得足够好,以便有充分的理由这样做。

现在您的视图保存在 PHP 模块中,您可以担心您的内容。很有可能,如果您的网站是动态的,那么这些页面上会有多个页面和位置,其中包含来自数据库的动态内容,或者向控制器提交数据的表单(我们仍在视图中)。

假设有人在您的网站上注册。转到您的域并根据对 www.site.com的请求生成视图,生成的视图是索引页面。来到您页面的此人已决定使用您的服务注册一个帐户。他们单击“注册”超链接并生成另一个视图,显示一个表单供他们创建登录凭据。他们填写表格点击提交。表单中提供的信息被提交给控制器(我们现在不是在谈论 ajax 或为我们的 javascript 代码实现 MVC 设计模式),我们会说视图 site.com/register提交给控制器站点.com/engine/process.php进程.php过滤/清理表单中的用户数据并实例化正确的类(模型,我们将称之为一个新的 User)然后将通过其方法之一或什至通过其构造函数进行数据库调用(您应该知道PHP 中可用的魔法方法),并且此查询的结果会根据控制器告诉模型的内容和模型告诉视图的内容而使视图略有不同。

我什至不知道我能对你关于 AJAX 的问题说些什么——鉴于你在 PHP 方面的立场,我猜你正在使用 JQuery 进行 ajax 调用。如果是这种情况,您不需要从您的 jquery 文件实现模型视图控制器,您只需创建一个 jquery 脚本,然后向视图添加一个调用该脚本并实现它的方法。

总而言之,如果你很难理解像 MVC 这样的常见模式是什么以及如何使用它,你应该真正回到基础。如果您不理解作者为什么使用他们使用的解决方案并且很可能他们没有向您解释这一点,因为有时您应该这样做,所以我不能强调在线教程对您没有帮助只要您对 php 语言、其语法以及如何解决问题有基本的了解,就能够了解自己。这一切都来自于花时间学习这门语言,了解它的工作原理,了解它做得不好和做得好的地方。

于 2013-02-26T01:43:27.953 回答
0

好的,您有几个问题包含在一个大问题中,但我会尽力回答它们。我将按重要性顺序回答它们。

  1. 你如何更新你的课程。
  2. 如何更好地构建表格。
  3. 如何检查登录状态。
  1. 大多数应用程序现在使用某种形式的 MVC 架构。模型、视图和控制器是一种将职责分离到类的方法。这是一个关于 PHP 的 MVC 架构的简短教程。话虽如此,您可以使用许多开源框架,例如ZendCakePHP等等。

    尝试使用 MVC 的策略之一或尝试框架。

  2. 尽量不要让表单自己提交给自己。而是将其路由到单独的页面并在那里处理逻辑。您还可以使用[]符号将输入包装到数组中。例如:<input type="text" name="user[firstname]" />

    但是,如果您只是在做一个登录表单,那么您所需要的只是一些独特的身份证明和凭证(例如用户名和密码)。

  3. 持久化用户登录状态有多种方式,主要使用的是会话和cookies。通常不赞成将整个模型存储在会话或 cookie 中。而是尝试将用户名和唯一键存储在数据库中,以便进行比较。使用 cookie 可以让您更好地控制您希望会话持续多长时间。

于 2013-02-26T01:51:18.953 回答