Разделение кода, я правильно делаю?


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

Моя структура файла выглядит так:

File structure

В conf там сидит файл с названием database.conf.php со следующим содержанием:

<?php
$this->host = "localhost";
$this->user = "snowclouds_LoL";
$this->password = "****";
$this->database = "snowclouds_LoL";
?>

В функции у меня есть функции включен, как это в functions.php

<?php
//Constructor class for calling all function scripts.
require("database.php");
require("security.php");
require("show.php");
require("user.php");
require("misc.php");
?>

Это мой класс в базе:

<?php
class Database {
private $host;
private $user;
private $password;
private $database;
private $link;

public function connect(){
    $this->link = mysqli_connect ($this->host, $this->user, $this->password) or die("Connection problem: " . mysqli_error());
    mysqli_select_db($this->link, $this->database);
}

public function resultquery($query){
    $result = mysqli_query($this->link, $query) or die(mysqli_error($this->link));
    return $result;
}

public function insertquery($query){
    if(mysqli_query($this->link, $query)){
        return true;
    }else{
        return mysqli_error($this->link);
    }
}

public function __construct(){
    if(!file_exists("conf/database.conf.php")){
        die("conf/database.conf.php file does not exist!");
    }else{
        include('conf/database.conf.php');
    }
    }
}
?>

Отступ немного сломался, потому что вставить 4 пробела перед каждой строкой-это просто отнимает много времени :/

Это мой index.php

$show->header();
$show->menu();
require("act.php");
$show->footer();
?>

Это мой init.php

<?php
session_start();
ob_start();

require ("functions/functions.php");

//Check security for hackers.
$security = new Security();
$security->checkuri();

$user = new User();
$misc = new Misc();
$show = new Show();
?>

И в моем act.php я пишу такой код:

if(isset($_GET['act']) & $_GET['act'] == "lostpass"){
    if(isset($_SESSION['username'])){
        $show->error("U bent al ingelogd met een bestaand account en u kunt uw wachtoowrd dus gewoon aanpassen op de aanpas pagina.");
    }else{
        include("view/lostpass.php");
    }
}

Файлы в основном содержат HTML код в то же время, в то время как для таблицы.

Так как это структура?

Это хорошо или невероятно плохо? (Я хочу, чтобы держаться подальше от вещи, например Smarty, потому что я хочу свою собственную модель для такого рода вещи, и я все еще учусь).

Дополнительный материал:

Это мой класс разное:

<?php
class Misc{
    function check_email($email) {
      // First, we check that there's one @ symbol, 
      // and that the lengths are right.
      if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
        // Email invalid because wrong number of characters 
        // in one section or wrong number of @ symbols.
        return false;
      }
      // Split it into sections to make life easier
      $email_array = explode("@", $email);
      $local_array = explode(".", $email_array[0]);
      for ($i = 0; $i < sizeof($local_array); $i++) {
        if
    (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&
    ?'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$",
    $local_array[$i])) {
          return false;
        }
      }
      // Check if domain is IP. If not, 
      // it should be valid domain name
      if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) {
        $domain_array = explode(".", $email_array[1]);
        if (sizeof($domain_array) < 2) {
            return false; // Not enough parts to domain
        }
        for ($i = 0; $i < sizeof($domain_array); $i++) {
          if
    (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|
    ?([A-Za-z0-9]+))$",
    $domain_array[$i])) {
            return false;
          }
        }
      }
      return true;
    }
}
?>

Это просто для То, что очень раздражает в полной мере, что бы каждый раз, когда мне это нужно.

Безопасность:

<?php

/**
 * @author Jeffro
 * @copyright 2011
 */


    class Security{

        var $privatekey = "thisshouldgoinaconfigfileaswell";

        function mcryptexists()
        {
            if (function_exists("mcrypt_encrypt")){
                return true;
            }else{
                return false;
            }
        }

        function sslactive()
        {
            if ($_SERVER['HTTPS']) { 
                return true;    
            }else{
                return false;
            }
        }

        function safe_b64encode($string) {
            $data = base64_encode($string);
            $data = str_replace(array('+','/','='),array('-','_',''),$data);
            return $data;
        }

        function safe_b64decode($string) {
            $data = str_replace(array('-','_'),array('+','/'),$string);
            $mod4 = strlen($data) % 4;
            if ($mod4) {
                $data .= substr('====', $mod4);
            }
            return base64_decode($data);
        }

        function encode($value){ 
            if(!$value){return false;}
            $text = $value;
            $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
            $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
            $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->privatekey, $text, MCRYPT_MODE_ECB, $iv);
            return trim($this->safe_b64encode($crypttext)); 
        }

        function decode($value){
            if(!$value){return false;}
            $crypttext = $this->safe_b64decode($value); 
            $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
            $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
            $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->privatekey, $crypttext, MCRYPT_MODE_ECB, $iv);
            return trim($decrypttext);
        }

    }

    ?>

Это из моего нового проекта, кстати. (Система API плеск)

И вот мой шоу-класса:

    <?php
    class show{
        function header(){
            include("view/header.php");
        }

        function menu(){
            include("view/menu.php");
        }

        function footer(){
            include("view/footer.php");
        }

        function error($message){
            echo $message;
            $this->footer();
            die();
        }
    }
    ?>


User Class: 

<?php
class User{
    private $database;
    function exists($user){
        $this->database->connect();
        if($result = $this->database->resultquery("SELECT * FROM users WHERE got_username='" . $user . "'")) {
            $count = mysqli_num_rows($result);
            if($count > 0){
                return true;
            }else{
                return false;
            }
        }
    }

    function isfriend($user, $friend){
        $this->database->connect();
        if($result = $this->database->resultquery("SELECT * FROM friends INNER JOIN users ON friends.user_id = users.user_id WHERE users.got_username='" . $user . "' AND friends.friend_id='" . $friend . "'")) {
            $count = mysqli_num_rows($result);
            if($count > 0){
                return true;
            }else{
                return false;
            }
        }
    }

    function addfriend($username, $friend){
        $this->database->connect();
        $user = $this->getuser($username);
        $result = $this->database->insertquery("INSERT INTO friends (user_id, friend_id) VALUES ('" . $user['user_id'] . "', '" . $friend . "')");
        return $result;
    }

    function delfriend($username, $friend){
        $this->database->connect();
        $user = $this->getuser($username);
        $result = $this->database->insertquery("DELETE FROM friends WHERE user_id = '" . $user['user_id'] . "' AND friend_id = '" . $friend . "'");
        return $result;
    }

    function updateuser($got_username, $eu_username, $us_username, $user_client, $play_ranked, $user_email, $user_password, $user_password_check, $comment, $ip, $date){
        $this->database->connect();
        $result = $this->database->insertquery("
        UPDATE users SET EU_username='$eu_username', US_username='$us_username', user_client='$user_client', plays_ranked='$play_ranked', comment='$comment', user_email='$user_email', user_password='" . sha1($user_password) . "', last_login='$date', last_ip='$ip'
        WHERE GoT_username='$got_username'");
        return $result; 
    }

    function updateusernopass($got_username, $eu_username, $us_username, $user_client, $play_ranked, $user_email, $comment, $ip, $date){
        $this->database->connect();
        $result = $this->database->insertquery("
        UPDATE users SET EU_username='$eu_username', US_username='$us_username', user_client='$user_client', plays_ranked='$play_ranked', comment='$comment', user_email='$user_email', last_login='$date', last_ip='$ip'
        WHERE GoT_username='$got_username'");
        return $result; 
    }

    function register($got_username, $eu_username, $us_username, $user_client, $play_ranked, $user_email, $user_password, $user_password_check, $comment, $ip, $date){
        $result = $this->database->insertquery("
        INSERT INTO users (GoT_username, EU_username, US_username, user_client, plays_ranked, comment, user_email, user_password, reg_date, last_login, last_ip)
        VALUES ('$got_username', '$eu_username', '$us_username', '$user_client', '$play_ranked', '$comment', '$user_email', '". sha1($user_password) ."', '$date', '$date', '$ip')");
        return $result; 
    }

    function getusers(){
        $this->database->connect();
        $query = "SELECT * FROM users ORDER BY user_id DESC";
        $result = $this->database->resultquery($query);
        $array = array();
        while($value = mysqli_fetch_array($result))
        {
            $array[] = $value;
        }
        return $array;
    }

    function inserthash($email, $hash){
        $this->database->connect();
        $query = "UPDATE users SET user_hash='$hash' WHERE user_email='$email'";
        $result = $this->database->insertquery($query);
        return $result;
    }

    function updatepassword($hash, $password){
        $this->database->connect();
        $password =  sha1($password);
        $query = "UPDATE users SET user_password='$password' WHERE user_hash='$hash'";
        $this->database->insertquery("UPDATE users SET user_hash='' WHERE user_hash='$hash'");
        $result = $this->database->insertquery($query);
        return $result;
    }

    function existsbyemail($email){
        $this->database->connect();
        $query = "SELECT * FROM users WHERE user_email = '$email'";
        $result = $this->database->resultquery($query);
        $count = mysqli_num_rows($result);
            if($count > 0){
                return true;
            }else{
                return false;
            }
    }

    function getuserbyemail($email){
        $this->database->connect();
        $query = "SELECT * FROM users WHERE user_email = '$email'";
        $result = $this->database->resultquery($query);
        $array = mysqli_fetch_array($result);
        return $array;
    }

    function getuser($username){
        $this->database->connect();
        $query = "SELECT * FROM users WHERE GoT_username = '$username'";
        $result = $this->database->resultquery($query);
        $array = mysqli_fetch_array($result);
        return $array;
    }

    function login($username, $password){
        $this->database->connect();
        $query = "SELECT * FROM users WHERE GoT_username = '$username' AND user_password = '". sha1($password) . "'";
        $result = $this->database->resultquery($query);
        $count = mysqli_num_rows($result);
        if($count > 0){
            return true;
        }else{
            return false;
        }
    }

    function logout(){
        unset($_SESSION['GoT_username']);
        unset($_SESSION['users_password']);
    }

    public function __construct(){
        $this->database = new Database();
    }
}
?>


614
5
задан 11 марта 2011 в 12:03 Источник Поделиться
Комментарии
2 ответа

Единственное, что я вижу, это то, что у вас высокое соединение между базой данных класса и местоположения файл config. Что вы должны сделать, это либо:


  • Создать класс config, который обрабатывает конфигурации извлечение и установка

  • Или, как минимум, загрузить конфигурационный файл где-то еще

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

Тут я мало что могу предложить, кроме вопросов. Например, что охрана делает? Есть только одна функция? Что еще в нем объявлены? То же самое касается и смешанная. Оба этих занятия казаться, что они не принадлежат и классы ради классов.

Редактировать


... класс config, который звучит интересно. У вас есть хорошие места, где я должен начать искать достойный путь?

В то zend_config документации, части Зенд фреймворк, вероятно, будет хорошее место, чтобы увидеть, как люди используют что-то вроде этого.


Это мой класс разное:

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

Пример:

<?php
namespace Utilities
{
function validateEmail( $email )
{
// Code
}
}

Тем не менее, вы должны действительно рассмотреть возможность освежиться на документацию по PHP, а конкретно новый материал, который был добавлен начиная с 4.0. Прекрасным примером этого является использование фильтра расширения. В вашем случае, FILTER_VALIDATE_EMAIL будет творить чудеса.


Безопасность:

Этот класс, я не комментирую, потому что я не уверен, что в случае использования или необходимость. Я предполагаю, что надо как есть.

Похожие на База данных у вас высокое сцепление , поставив закрытого ключа непосредственно в классе. В зависимости от потребностей ключом, он мог существовать в файл config и рассматриваться как базы данных конфигурации атрибутами. При инициализации, вы как бы проходите переменной для пасскей в безопасности::__конструктор.

Это означает, что вы могли иметь различный пароль для каждого пользователя вместо одного пароля. Расширяя это на публичный+приватный ключ система в будущем будет также легко (просто добавить еще один параметр).


Пользователь:

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

Я также хотел бы сохранить от именования функций в нижнем регистре. Она является общей для людей, чтобы имя функции либо в верблюжьего или подчеркиванием _ между словами. Не делать так может повлиять на читабельность.

Кроме того, этот класс является первым, я видел, как вы обеспечиваете, что выступает в качестве модели (мышление в терминах проектирования MVC). Это хорошо, значит хорошая работа. Я хотел бы расширить ваше понимание в MVC, если это путь вы идете так что вы не упасть на многих распространенных ошибок.

5
ответ дан 15 марта 2011 в 06:03 Источник Поделиться

Это хорошее разделение, чтобы начать с, хотя я настоятельно рекомендую вам разместить вашу базу данных conf файл вне зоны общественного HTML-код на ваш сервер.

3
ответ дан 11 марта 2011 в 02:03 Источник Поделиться