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

ykpon

Постоялец
Регистрация
8 Дек 2012
Сообщения
250
Реакции
150
На сайте есть формы, откуда запросы 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 оставить функции, касающиеся только, разве что, авторизации, регистрации и подобные. Все остальное либо вывести в другой файл с функциями или вовсе выполнять по факту, где это требуется.
Каюсь, использовал чужие наработки с классами и функциями, лишь перепилил под себя, ввиду своей ленивости. :)
 
Каюсь, использовал чужие наработки с классами и функциями, лишь перепилил под себя, ввиду своей ленивости.
А в чём тут каяться?! =) Нормальный программист прежде чем писать "велосипед" изучает все готовые решения и если есть подходящие, применяет их. Поэтому всё правильно сделал =)
Теперь по сабжу.
Но не буду же я для каждого запроса в базу данных плодить функции в Auth.class.php
Да, именно это и нужно делать. В приведённом примере метод называться будет getAll(); В идеале должен быть интерфейс (Auth), который реализует Ваш класс. (Ведь не обязательно авторизация будет идти через PDO. Допустим авторизация через соц сети и т.д.) Таким образом все классы, реализующие данный интерфейс буду гарантированно отдавать то, что нужно. (То есть Вы скрываете конкретную реализацию авторизации через PDO за абстрактным интерфейсом)
 
А в чём тут каяться?! =) Нормальный программист прежде чем писать "велосипед" изучает все готовые решения и если есть подходящие, применяет их. Поэтому всё правильно сделал =)
Теперь по сабжу.

Да, именно это и нужно делать. В приведённом примере метод называться будет getAll(); В идеале должен быть интерфейс (Auth), который реализует Ваш класс. (Ведь не обязательно авторизация будет идти через PDO. Допустим авторизация через соц сети и т.д.) Таким образом все классы, реализующие данный интерфейс буду гарантированно отдавать то, что нужно. (То есть Вы скрываете конкретную реализацию авторизации через PDO за абстрактным интерфейсом)
То есть, правильнее, все таки, создать все необходимые функции в классе?
Запросы к БД в разных файлах плодить неправильно? Вообще, PDO хорош, но для одного запроса столько махинаций.
getAll() - ты об Для просмотра ссылки Войди или Зарегистрируйся?
 
Создай отделний файл с классом базы скажем 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_PREPARES, FALSE);
            }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;
            }
        }
    }
 
Последнее редактирование:
Создай отделний файл с классом базы скажем 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_PREPARES, FALSE);
            }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;
            }
        }
    }
Отказаться я решил от классов. ООП не мое. Вывел подключение к БД в отдельный файл и использую mysqli в обертке goDB. Все устраивает, в принципе.
 
А дальше как ? Постоянно в отдельных файлах вызывать ссылку на объект ?
С кодом все в порядке. Т.к ничего лишнего или опасного, по эстетике, вывести подключение в отдельный файл, где будет браться уже готовое подключение а не вызывать постоянно.
 
Последнее редактирование:
Назад
Сверху