PHP Исходник Гайд PDO не страшно, а полезно

Ded Perded

Участник
Автор темы
61
46
Размусоленное начало для всех кто не понимает зачем это.

PDO(PHP Data Objects) - это прослойка, которая предлагает универсальный способ работы с несколькими базами данных. Кратко и понятно - PDO заботится о ваших запросах, если вы правильно их напишите.

и бла-бла-бла...

Так сказать к ДЕЛУ
Создаем любой файл в моем случае "config.php", можно и использовать массив прямо в классе разницы зеро.


Содержимое файла:
PHP:
return array(
'host' => "localhost",
'user' => "username", // имя пользователя базы
'name' => "basename", // имя базы
'passowrd' => "userpassowd", // пароль от пользователя базы
);

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

Назову файл "base.php", файл прикреплю, может кому-то нужен.

PHP:
class Db {

    protected $db;

    public function __construct() {
        $config = require 'config.php'; // подключаем наш файл с конфигом
        $this->db = new PDO('mysql:host='.$config['host'].';dbname='.$config['name'].'', $config['user'], $config['password']); // производим подключение к базе
        $this->db->exec("set names utf8"); // кодируем в utf8, если вы не используете U
    }

    public function query($sql, $params = []) {
        $stmt = $this->db->prepare($sql);
        if (!empty($params)) {
            foreach ($params as $key => $val) {
                if (is_int($val)) {
                    $type = PDO::PARAM_INT;
                } else {
                    $type = PDO::PARAM_STR;
                }
                $stmt->bindValue(':'.$key, $val, $type);
            }
        }
        $stmt->execute();
        return $stmt;
    } // в данном паблике можно не разбираться, он производит общение с базой.
    public function row($sql, $params = []) {
        $result = $this->query($sql, $params);
        return $result->fetchAll(PDO::FETCH_ASSOC);
    } // собственно получает все строки следуя вашему запросу.
    public function column($sql, $params = []) {
        $result = $this->query($sql, $params);
        return $result->fetchColumn();
    } // одна строка один столбец
    public function lastInsertId() {
        return $this->db->lastInsertId();
    } // посдледний занесенный ID в таблицу
    public function numrows($sql, $params=[]){
        $result = $this->query($sql, $params);
        return $result->rowCount();
    } // кол-во записей в таблице

}

Примеры запросов и подключение файла(кто-то не умеет? ЛОЛ)
Допустим у нас есть таблица example в ней 3 записи: 1 test | 2 vitya | 3 oleg
Колонки 2: id и name
PHP:
require_once("base.php"); // единоразово подключаем файл base.php(файл с классом)
$bd = new Db; // вызываем класс, теперь мы можем с ним работать, все функции вызываются через ->.

$row = $bd->column("SELECT `id` FROM `example`");
var_dump($row);
/*
Получим string(1) "1". т.к. отдает одну строку и один столбец, т.е. строку.
*/

$row = $bd->row("SELECT `id` FROM `example`");
/*
Ответ от базы:
array(3) {
    [0]=> array(1) {
           ["id"]=> string(1) "1"
    }
    [1]=> array(1) {
           ["id"]=> string(1) "2"
    }
    [2]=> array(1) {
           ["id"]=> string(1) "3"
    }
}
Получаем три строки со столбцом id. Т.к. у нас 3 записи.


Впринципе и так далее. Для работы с базой в более расширенном режиме чем просто получение данных поспользуемся "query"
*/
$array = [
    'name' => "vitek";
];
$bd->row("ISERT INTO `example` (`name`) VALUES (:name)", $array); // добавит запись с id 4 и name vitek
echo $bd->lastInsertId(); // вернет 4[/SIZE]

// логично, что numrows вернет тоже число 4.

Если кто-то не понял array(); == [];

Что обычно в конце не знаю, но мне кажется что это должны использовать все, задавайте вопросы, отвечу.
 

Вложения

  • base.php.zip
    634 байт · Просмотры: 9
Последнее редактирование:
У

Удалённый пользователь 147808

Гость
Хорошая статья, но хочется отметить несколько вещей. Первая - это совершенно непонятный класс base.php, который к тому же, почти нихуя не делает, и лишь представляет обертку над стандартными методами(с lastInsertId вообще до слез, спасибо - Вы сделали мой день).
Вторая: хочу еще раз отметить что ООП - не лучшая парадигма для маленьких проектов. Ранее на Хабре уже была статья на эту тему, рекомендую к прочтению. Имхо - с автором статьи на хабре, по поводу ООП, я не совсем согласен, для больших проектов - ООП незаменимая парадигма
 

Ded Perded

Участник
Автор темы
61
46
Хорошая статья, но хочется отметить несколько вещей. Первая - это совершенно непонятный класс base.php, который к тому же, почти нихуя не делает, и лишь представляет обертку над стандартными методами(с lastInsertId вообще до слез, спасибо - Вы сделали мой день).
Вторая: хочу еще раз отметить что ООП - не лучшая парадигма для маленьких проектов. Ранее на Хабре уже была статья на эту тему, рекомендую к прочтению. Имхо - с автором статьи на хабре, по поводу ООП, я не совсем согласен, для больших проектов - ООП незаменимая парадигма
При малом количестве мозгов ты можешь переписать сам, на привычный фп. Не буду говорить кто фпшеры, ну вы сами поняли да


(с lastInsertId вообще до слез, спасибо - Вы сделали мой день).

сверху написано, что переменная приватная. Что не так?


Первая - это совершенно непонятный класс base.php, который к тому же, почти нихуя не делает, и лишь представляет обертку над стандартными методами
Сам же писал в другой статье, что это "сложно" вот я сделал тебе "просто"


Не осилил ООП - обосрал, логично.
 
Последнее редактирование:
У

Удалённый пользователь 147808

Гость
что бы его подключать только в тех местах где нужно
Ты серьезно собрался каждый раз новый коннект создавать? Если да то с тобой разговор лучше поскорее закончить
сверху написано, что переменная приватная. Что не так?
Не так то, что ты создал точно такой же класс, с идентичным АПИ для работы с БД. Так ты его еще и говоришь подключать везде. Я просто О ХУ ЕЛ
Сам же писал в другой статье, что это "сложно" вот я сделал тебе "просто"
Я писал, что это сложно, да и просто не нужно для маленьких проектов, а для больших - твоя поделка, которую можно нагуглить(не прям твою, но бесполезный функционал будет схож) по запросу "рисунки детей инвалидов" или "наскальная живопись неандертальцев" - нахуй не нужна.
 
Последнее редактирование модератором:

Ded Perded

Участник
Автор темы
61
46
Так ты его еще и говоришь подключать везде. Я просто О ХУ ЕЛ
upload_2019-6-12_23-55-53.png


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

Сам же скинул ссылку на пост, где пишут, что в крупных проектах все равно ФП либо ООП. Одно и тоже.
 
  • Нравится
Реакции: Mirrorka
У

Удалённый пользователь 147808

Гость
Посмотреть вложение 31824

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

Ded Perded

Участник
Автор темы
61
46
Процедурка ван лав
Каждому свое, я показал ПДО с "элементами ООП", фулл ООП это не назвать. Как же вы будите использовать ПДО вам решать.

Начнем с того что в большом проекте вообще зашкварно юзать PHP без каких нибудь компиляторов или мощной системы кеширования, потому что в PHP по сути даже GC то и нет, о чем там разговаривать. Уж молчу что асинхронность добавили только недавно. Экземпляр коннекта должен создаваться один раз, а при каждом конструкте - просто запрашиваться. А у тебя создается новый коннект к базе при каждом конструкте
Если брать нагруженные проекты такие как - ВК. То писать нужно исключительно на web c++. Для менее загруженных питон, еще менее PHP - он себя более естественно проявляет. Дальше можно посмотреть на JS, лол. (не гори я рофлю но два первых пункта не рофл.)