Intereting Posts
Посмотрите, прослушивает ли сервер порт на PHP? Вызов mysql ПРОЦЕДУРЫ внутри цикла while работает только в первый раз Узнайте HTTP-метод в PHP Запуск Java-файла из PHP Предупреждение: session_start () не удалось: нет такого файла или каталога Флажок PHP form и неопределенный индекс Получение серийного номера жесткого диска, предоставляемого производителем через PHP добавление маршрута к маршрутизатору в Zend Framework PHP Startup: невозможно загрузить динамическую библиотеку 'C: \ Program Files (x86) \ PHP \ v5.6 \ ext \ php_sqlsrv_55_ts.dll определить, использует ли пользователь прокси-сервер Ошибка Codeigniter «Не удается подключиться к серверу базы данных с помощью предоставленных настроек» Предупреждение: require_once (): http: // оболочка отключена в конфигурации сервера allow_url_include = 0 Сократить текстовую строку в PHP Создайте HTTP-прокси в php для загрузки изображений с помощью iframe, Преобразование целого числа в строку в PHP

Каков правильный способ использования нового PDO в контексте класса?

Раньше я всегда создавал класс базы данных и в этом классе назначал атрибут $ connection соединение через mysql_connect в методе __construct. В том же файле я бы создавал экземпляр класса, чтобы он был готов к работе. Тогда всякий раз, когда мне было нужно это соединение, я просто требовал бы этот файл базы данных и добавлял глобальное $ соединение в метод, которому требуется $ connection. Каков наилучший способ добиться чего-то подобного или лучше с помощью PDO php?

Solutions Collecting From Web of "Каков правильный способ использования нового PDO в контексте класса?"

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

** РЕДАКТИРОВАТЬ **

Кстати, я использую метод singleton в этом классе, так как я вызываю класс несколько раз из разных файлов. Поэтому вы можете это изменить.

class DB { /* Connection settings */ private static $host = 'localhost'; private static $user = 'root'; private static $pass = 'your_pass'; private static $base = 'your_db'; private static $ins; // pdo instance private static $class; // class object for singleton public static $counter; // counts how many times execute is called public function __construct() { } public static function connect($errMode = PDO::ERRMODE_SILENT) { if (!isset(self::$ins)) { try { self::$ins = new PDO("mysql:host=" . self::$host . ";" ."dbname=" . self::$base . ";", self::$user, self::$pass); self::$ins->setAttribute(PDO::ATTR_ERRMODE, $errMode); // PDO::ERRMODE_EXCEPTION } catch (Excpetion $ex) { self::raiseError($ex); } $className = __CLASS__; self::$class = new $className; } return self::$class; } /** * Function to execute a given query * @param string $query : query string * @param string | array $param : parameter (either array of parameters or string) * @param bool $useBind : if true bindParam method will be used, else execute method will be called * @return PDOStatement */ public function execute($query, $param, $useBind=true) { self::$counter++; $stmt = self::$ins->prepare($query); if (!$useBind) $stmt->execute($param); else { if (is_array($param)) { $size = sizeof($param); // if items within param param are array (eg array(array(value, name, type, length), // array(value, name, type, length)) if ($size >= 1 && is_array($param[0])) { $i = 1; // ? placeholder counter foreach ($param as $arr) { $size = sizeof($arr); if ($size == 1) // eg array('red') $stmt->bindParam($i, $arr[0]); else if ($size == 2) // eg array(':color', 'red') $stmt->bindParam($arr[0], $arr[1]); else if ($size == 3) // eg array(':color', 'red', PDO::PARAM_STR) $stmt->bindParam($arr[0], $arr[1], $arr[2]); else // eg array(':color', 'red', PDO::PARAM_STR, 12) $stmt->bindParam($arr[0], $arr[1], $arr[2], $arr[3]); $i++; } } else if ($size == 1) // eg array(15) $stmt->bindParam(1, $param[0]); else if ($size == 2) // eg array(':color', 'red') $stmt->bindParam($param[0], $param[1]); else if ($size == 3) // eg array(':color', 'red', PDO::PARAM_STR) $stmt->bindParam($param[0], $param[1], $param[2]); else if ($size == 4) // eg array(':color', 'red', PDO::PARAM_STR, 12) $stmt->bindParam($param[0], $param[1], $param[2], $param[3]); } else // eg $db::execute($query, 15) $stmt->bindParam(1, $param); $stmt->execute(); } return $stmt; } public function query($query) { self::$counter++; $result = self::$ins->query($query); return $result; } public function close() { self::$ins = null; } public function lastId() { $id = self::$ins->lastInsertId(); return $id; } public function trans() { self::$ins->beginTransaction(); } public function commit() { self::$ins->commit(); } public function rollBack() { self::$ins->rollBack(); } private function raiseError($er) { throw new Exception($er); } public function counter() { return self::$counter; } } 

Я считаю, что «лучший» подход зависит от ситуации. Обычно я использую PDO, поскольку в основном это требует встроенной функции. Мне нравится создавать свой собственный класс, который расширяет PDO.

Лично (это не означает «лучший способ»), если приложение мало. Я использую модель «fat-database-class», которая хранит все крошечные функции с SQL-запросами, где она просто получает / проверяет / устанавливает информацию с базой данных. «fat-database-class» расширяет PDO, что означает, что мне не нужны функции записи, такие как execute или get lastId, поскольку у PDO уже есть эти методы. Если приложение больше, я использую Framework & Doctrine, который упрощает управление битами. Если вы все еще не пробовали использовать какую-либо инфраструктуру php, я предлагаю вам выбрать ее и попробовать. У рамок есть свои правила, поэтому вам не нужно искать и думать о том, как создавать «идеальные правила» для вашего собственного приложения.