Как мне сделать это объектно-ориентированным?

В настоящее время у меня есть код ниже, который регистрирует пользователя.

Он не проверяет, существует ли имя пользователя в данный момент или что-то подобное, это то, что я хочу реализовать.

Я никогда не знал, как использовать объекты и формы 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?

2 ответа

Майк:

ваш набор геттер и сеттер, как это:

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] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ООП PHP программирование в сочетании с технологией JavaScript AJAX

Model-View-Controller:

MVC не является специфичным для PHP. MVC - это шаблон проектирования программного обеспечения, целью которого является решение проблемы удобства сопровождения в коде, которая объединяет отдельные компоненты кода таким образом, что делает код менее читаемым и сложным в обслуживании, что в конечном итоге также является угрозой безопасности. Model-View-Controller обычно реализуется через фреймворки. Что касается PHP, существуют доступные фреймворки, такие как Zend, CodeIgniter, CakePHP и т. Д. В фреймворках реализован контроллер представления модели через дерево документов, хотя вы можете создать свою собственную фреймворк PHP (что не очень хорошая идея, если вы новичок в язык), вероятно, лучше использовать тот, который уже был вокруг. Эти структуры могут также применять свои собственные стандарты, которые приводят к улучшению кода.

Model-View-Controller

Чтобы понять поддерживаемую инфраструктуру MVC, вы должны быть знакомы с написанием кода сайта>> полностью на PHP. Это означает, что вы должны использовать PHP-классы [модули | модели] для динамической генерации HTML-страниц [представление] в зависимости от того, что сделал пользователь [файл контроллера управляет моделью].

Ваш вопрос очень расплывчатый, и трудно сказать, что вы спрашиваете, однако у меня складывается впечатление, что вы не можете понять, что такое MVC и как его использовать. Предположим, вы только что создали макет для сайта, который вы будете разрабатывать. Поскольку невозможно предсказать размер экрана вашего пользователя, вы создали макет в браузере. Ваш макет [или шаблон, если хотите] должен соответствовать стандарту HTML5 или XHTML. Это не должно быть построено с изображениями. Некоторые люди могут не согласиться со мной по этому вопросу, но за исключением вашего логотипа / заголовка (хотя некоторые используют и текст для этого тоже), вы не должны иметь никаких тегов, являющихся частью вашего шаблона (это до того, как какой-либо контент был написан, очевидно Возможно, вы захотите использовать много изображений в вашем контенте). На данный момент ваш взгляд должен быть HTML и CSS - любые изображения, которые являются частью вашего макета (то есть шаблоны, фоны, все, что связано с макетом) должны быть в CSS вашего сайта. Это одна из причин, по которой мы используем шаблон MVC - он разделяет то, что должно быть отдельным.

Вы берете свой макет как HTML и пишете класс PHP [module], который содержит функции, например, мы будем использовать $view->showLeadboard();, $view->showAds(); $ View->showFooter(); $view->setTitle("Title");, $view->setDescription("Description");... Предполагается, что вы создали экземпляр своего класса. Возможно, вы не хотите создавать экземпляр класса и предпочитаете использовать статические методы, выбор за вами, но вы должны понимать, что вы делаете достаточно хорошо, чтобы иметь веские причины для этого.

Теперь, когда ваше представление находится внутри модуля PHP, вы можете беспокоиться о своем контенте. Скорее всего, если ваш веб-сайт динамический, на этих страницах будет несколько страниц и местоположений, которые содержат динамическое содержимое из базы данных, или формы (мы все еще находимся внутри представления), которые передают данные в контроллер.

Предположим, кто-то регистрируется на вашем сайте. Переход к вашему домену и представление генерируется на основе запроса к www.site.com, и генерируемое представление является страницей индекса. Этот человек, который зашел на вашу страницу, решил зарегистрировать учетную запись в вашем сервисе. Они нажимают на гиперссылку "регистрация", и создается другое представление, в котором отображается форма для создания учетных данных для входа. Они заполняют форму, нажимая кнопку отправить. Информация, предоставленная в форме, передается контроллеру (мы сейчас не говорим о ajax или реализации шаблона проектирования MVC для нашего кода javascript), мы скажем, что представление site.com/register отправляется на сайт контроллера .com / engine / process.php. Process.php фильтрует / очищает пользовательские данные из формы и создает правильный класс (модель, мы назовем этого нового пользователя), который затем сделает вызов базы данных через один из своих методов или, возможно, даже через его конструктор (вы должен знать о магических методах, доступных вам в PHP), и в результате этого запроса вид будет немного отличаться в зависимости от того, что контроллер сказал модели и что модель сказала представлению.

Я даже не знаю, что могу сказать по поводу вашего вопроса об AJAX - учитывая вашу позицию по PHP, я собираюсь догадаться, что вы используете JQuery для вызовов ajax. Если это так, вам не нужно реализовывать модель-представление-контроллер из ваших файлов jquery, вы можете просто создать сценарий jquery, а затем добавить в представление метод, который вызывает этот сценарий и реализует его.

В общем, если вы изо всех сил пытаетесь понять, что такое общий шаблон, такой как MVC, и как его использовать, вам действительно следует вернуться к основам. Я не могу не подчеркнуть, что онлайн-учебники не помогут вам, если вы не понимаете, почему автор использовал решение, которое они использовали, и есть вероятность, что они не объясняют это вам, потому что иногда это просто, что вы должны уметь понимать себя, если у вас есть базовые знания о языке php, его синтаксисе и способах решения проблем с ним. Все это происходит просто из-за того, что вы проводите время с языком, изучаете, как он работает, и узнаете, что он делает плохо и что он делает хорошо.

Хорошо, у вас есть пара вопросов, заключенных в один большой вопрос, но я постараюсь ответить на них как можно лучше. Я отвечу на них в порядке важности.

  1. Как вы обновляете свой класс (ы).
  2. Как лучше структурировать формы.
  3. Как проверить статус входа.
  1. Большинство приложений сейчас используют ту или иную форму архитектуры MVC. Модели, Представления и Контроллеры - это способ разделения обязанностей между классами. Вот краткое руководство по архитектуре MVC для PHP. С учетом вышесказанного, существует ряд платформ с открытым исходным кодом, которые вы можете использовать как, Zend, CakePHP и другие.

    Попробуйте использовать одну из стратегий для MVC или попробуйте фреймворк.

  2. Старайтесь не заставлять себя подчиняться. Вместо этого направьте его на отдельную страницу и обработайте логику там. Также вы можете обернуть ваши входные данные и массив с помощью [] нотации. Например: <input type="text" name="user[firstname]" />

    Однако, если вы просто делаете форму входа в систему, то все, что вам нужно, это какая-то уникальная форма идентификации и учетные данные (например, имя пользователя и пароль).

  3. Существует несколько способов сохранить статус входа пользователя, в основном это сеансы и файлы cookie. Хранение всей модели в сеансе или куки обычно не одобряется. Вместо этого попробуйте сохранить имя пользователя и уникальный ключ, с которым вы можете сравнить в базе данных. Использование файлов cookie дает вам больший контроль над продолжительностью сеанса.

Другие вопросы по тегам