【问题标题】:How do I make this object-oriented?如何使这个面向对象?
【发布时间】:2013-02-26 00:54:29
【问题描述】:

目前我有下面的注册用户的代码。

它不检查用户名当前是否存在或类似的东西,这是我想要实现的东西。

我从来不知道如何一起使用 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 一起使用?

【问题讨论】:

  • 为什么需要这么多 getter 和 setter?为什么 __get 或 __set 不够用?
  • 只需将 $database 方法更改为类似于第一个代码片段中的 PDO 方法。
  • __get 或 __set 将允许您在代码中设置属性值,如下所示:|1。实例化| $var = 新对象(); |2。 __集| $var-> 属性 = $value |3。 __get| $value = $var->attribute |.. 我假设你实际上是这样调用你的函数的:|1.| $var->set_lastName($lastName); |并获取如下值:|2.| $value = $var->get_lastName(); |
  • 另外,你不需要 var 关键字。
  • @Rafael,我如何从表单中添加成员?你能以答案的形式提供一个例子吗?

标签: php mysql ajax pdo object-oriented-database


【解决方案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?或者您是否下载了一些非常旧的代码,而您现在正试图让它工作?

>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>

结合 JavaScript AJAX 技术的 OOP PHP 编程

模型-视图-控制器:

MVC 并不特定于 PHP。 MVC 是一种软件设计模式,旨在解决代码中的可维护性问题,它结合了单独的 以降低代码可读性和 难以维护,这最终也是一个安全风险。 模型-视图-控制器通常通过框架实现。在 关于 PHP 有可用的框架,例如 Zend, CodeIgniter、CakePHP 等。有框架实现模型视图 控制器通过文档树,虽然你可以创建自己的 PHP 框架(考虑到您刚接触 语言),最好使用已经使用过的语言 大约。这些框架也可以强制执行他们自己的标准,从而导致 更好的代码。

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

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

您将您的布局作为 HTML,然后编写一个 PHP 类[模块] 包含函数,例如我们将使用 $view->showLeadboard();, $view->showAds(); $view->showFooter(); $view->setTitle("标题");, $view->setDescription("描述");... 这假设您已经实例化了您的类。也许你不 想要实例化一个类,并且您更喜欢使用静态方法, 选择是你的,但你应该明白你做得很好 足以有充分的理由这样做。

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

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

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

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

【讨论】:

  • 我认为是现代做事方式 (PDO) 的顶级代码,底部来自大约 5 年前的教程,我很欣赏它使用过时的方法,但当时他们正在写,我认为这将是一个很好的起点。那么如何访问私有或受保护的变量呢?另外,当数据来自表单时如何处理?这是我最麻烦的事情,我相信它是最简单的。
  • 什么意思?我认为您对什么是面向对象编程感到非常困惑。访问表单数据的方式与使用过程语法编程的方式完全相同。您只需将数据分配给您的 Class 属性而不是变量。
  • 我建议你去当地的 barnes & noble,拿起一本 PHP 书,阅读面向对象编程的部分。从最新的阅读材料中学习 PHP 比从旧的教程中学习 PHP 更容易
  • 我在网上找到了很多资源,但没有一个足够简单易懂。一旦我完成这项工作,我就会自己组装一个!
  • 自己编写教程?无意冒犯,但从您的代码的外观来看,您根本不了解 PHP。自 8 月以来,我只使用 PHP 进行编程,但我已经阅读了很多关于 PHP 的内容,并且已经自己构建了我的网站的后端。除了特定的问题,只有教程从来没有真正帮助过我。但不是为了理解 php
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 2016-06-23
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多