Правильно ли использую PDO?

Тема в разделе "Как сделать...", создана пользователем ykpon, 20 сен 2015.

Метки:
  1. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    249
    Симпатии:
    143
    На сайте есть формы, откуда запросы Ajax'ом уходят, скажем, на ajax.php.
    Пусть это будет, например, регистрация.
    В ajax.php:
    PHP:
    <?php
    require_once 'Auth.class.php';
    require_once 
    'AjaxRequest.class.php';

    class 
    AuthorizationAjaxRequest extends AjaxRequest
    {
        public 
    $actions = array(
            
    "register" => "register"
        
    );

    public function 
    register()
        {
            if (
    $_SERVER["REQUEST_METHOD"] !== "POST") {
                
    // Method Not Allowed
                
    http_response_code(405);
                
    header("Allow: POST");
                
    $this->setFieldError("main""Method Not Allowed");
                return;
            }

            
    // разного рода проверки
           
            
            
    $user = new Auth\User();

            try {
                
    // здесь создаем юзверя
                
    $new_user_id $user->create($username$password1$email1);
            } catch (\
    Exception $e) {
                
    $this->setFieldError("username"$e->getMessage());
                return;
            }
        }

    А вот, собственно, Auth.class.php с функцией create(:(
    PHP:
    <?php

    namespace Auth;

    class 
    User
    {
        private 
    $id;
        private 
    $username;
        public 
    $db;
        private 
    $user_id;
        private 
    $email;

        private 
    $db_host "localhost";
        private 
    $db_name "db";
        private 
    $db_user "dbuser";
        private 
    $db_pass "password";

        public 
    $is_authorized false;

        public function 
    __construct($username null$password null)
        {
            
    $this->username $username;
            
    $this->connectDb($this->db_name$this->db_user$this->db_pass$this->db_host);
        }

        public function 
    __destruct()
        {
            
    $this->db null;
        }

    public function 
    create($username$password, $
            
    $query "insert into users (username, password, email)
                values (:username, :password, :email)"
    ;
            
    $password md5($password);
            
    $sth $this->db->prepare($query);

            try {
                
    $this->db->beginTransaction();
                
    $result $sth->execute(
                    array(
                        
    ':username' => $username,
                        
    ':password' => $password,
                        
    ':email' => $email,
                    )
                );
                
    $this->db->commit();
            } catch (\
    PDOException $e) {
                
    $this->db->rollback();
                echo 
    "Database error: " $e->getMessage();
                die();
            }

            if (!
    $result) {
                
    $info $sth->errorInfo();
                
    printf("Database error %d %s"$info[1], $info[2]);
                die();
            } 

            return 
    $result;
        }

    public function 
    connectdb($db_name$db_user$db_pass$db_host "localhost")
        {
            try {
                
    $this->db = new \pdo("mysql:host=$db_host;dbname=$db_name"$db_user$db_pass);
            } catch (\
    pdoexception $e) {
                echo 
    "database error: " $e->getmessage();
                die();
            }
            
    $this->db->query('set names utf8');

            return 
    $this;
        }

    В ajax.php вызываются функции класса из Auth.class.php. Но не буду же я для каждого запроса в базу данных плодить функции в Auth.class.php. Вот и решил в ajax.php юзать просто:
    PHP:
    $dbh = new Auth\User();
    $query "select * from users";
    $sql $dbh->db->prepare($query);
    $sql->execute();
    $result $sql->fetchAll();

    Правильно ли так делать? Эстетично? Не будет способствовать низкой производительности?
    Хотелось бы в auth.class.php оставить функции, касающиеся только, разве что, авторизации, регистрации и подобные. Все остальное либо вывести в другой файл с функциями или вовсе выполнять по факту, где это требуется.
    Каюсь, использовал чужие наработки с классами и функциями, лишь перепилил под себя, ввиду своей ленивости. :)
     
  2. nejtr0n

    nejtr0n Постоялец

    Регистр.:
    24 янв 2014
    Сообщения:
    124
    Симпатии:
    67
    А в чём тут каяться?! =) Нормальный программист прежде чем писать "велосипед" изучает все готовые решения и если есть подходящие, применяет их. Поэтому всё правильно сделал =)
    Теперь по сабжу.
    Да, именно это и нужно делать. В приведённом примере метод называться будет getAll(); В идеале должен быть интерфейс (Auth), который реализует Ваш класс. (Ведь не обязательно авторизация будет идти через PDO. Допустим авторизация через соц сети и т.д.) Таким образом все классы, реализующие данный интерфейс буду гарантированно отдавать то, что нужно. (То есть Вы скрываете конкретную реализацию авторизации через PDO за абстрактным интерфейсом)
     
  3. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    249
    Симпатии:
    143
    То есть, правильнее, все таки, создать все необходимые функции в классе?
    Запросы к БД в разных файлах плодить неправильно? Вообще, PDO хорош, но для одного запроса столько махинаций.
    getAll() - ты об этом?
     
  4. artxaker

    artxaker Создатель

    Регистр.:
    25 авг 2009
    Сообщения:
    39
    Симпатии:
    36
    Создай отделний файл с классом базы скажем database.class.php в нем пропиши класс пдо или мускули ну у меня ест старый код имплементации класса пдо можеш подправить и пользоватся и потом зделай екстенд в auth.class.php
    PHP:
    class getwayConnect{
            public static 
    $db null;
            public static function 
    getwayConnect($connectData = array("driver"=>"mysql","host"=>"localhost","port"=>3306,"database"=>"","user"=>"","pass"=>""))
            {
                try {
                    
    self::$db = new PDO($connectData["driver"].
                    
    ':host='.$connectData["host"].
                    
    ';port='.$connectData["port"].
                    
    ';dbname='.$connectData["database"],
                    
    $connectData["user"], $connectData["pass"]);
                    
    self::$db->setAttribute(PDO::ATTR_EMULATE_PREPARESFALSE);
                }catch (
    PDOException $e) {
                    
    self::$db $e;
                }
            }
            public static function 
    get($query,$type false)
            {
                
    self::getwayConnect();
                try {
                    
    $prepare self::$db->prepare($query);
                    if(
    $prepare)
                    {
                        
    $execute $prepare->execute();
                        if(
    $execute)
                        {
                            if(
    $type != false)
                            {
                                return 
    $prepare->fetchAll($type);
                            }else{
                                return 
    $prepare->fetchAll();
                            }
                        }else{
                            
    self::$db "error";
                        }
                    }else{
                        return 
    false;
                    }
                }catch (
    PDOException $e) {
                    
    self::$db $e;
                }
            }
            public static function 
    send($query)
            {
                
    self::getwayConnect();
                try {
                    
    $prepare self::$db->prepare($query);
                    if(
    $prepare)
                    {
                        
    $execute $prepare->execute();
                        if(
    $execute)
                        {
                            return 
    true;
                        }else{
                            return 
    false;
                        }
                    }else{
                        return 
    false;
                    }
                }catch (
    PDOException $e) {
                    
    self::$db $e;
                }
            }
            public static function 
    count($query)
            {
                
    self::getwayConnect();
                try {
                    
    $prepare self::$db->prepare($query);
                    if(
    $prepare)
                    {
                        
    $execute $prepare->execute();
                        if(
    $execute)
                        {
                            return 
    $prepare->rowCount();
                        }else{
                            return 
    false;
                        }
                    }else{
                        return 
    false;
                    }
                }catch (
    PDOException $e) {
                    
    self::$db $e;
                }
            }
        }
     
    Последнее редактирование: 23 сен 2015
  5. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    249
    Симпатии:
    143
    Отказаться я решил от классов. ООП не мое. Вывел подключение к БД в отдельный файл и использую mysqli в обертке goDB. Все устраивает, в принципе.
     
  6. Gameer

    Gameer Постоялец

    Регистр.:
    25 апр 2014
    Сообщения:
    129
    Симпатии:
    82
    А дальше как ? Постоянно в отдельных файлах вызывать ссылку на объект ?
    С кодом все в порядке. Т.к ничего лишнего или опасного, по эстетике, вывести подключение в отдельный файл, где будет браться уже готовое подключение а не вызывать постоянно.
     
    Последнее редактирование: 25 сен 2015