Раньше я всегда создавал класс базы данных и в этом классе назначал атрибут $ connection соединение через mysql_connect в методе __construct. В том же файле я бы создавал экземпляр класса, чтобы он был готов к работе. Тогда всякий раз, когда мне было нужно это соединение, я просто требовал бы этот файл базы данных и добавлял глобальное $ соединение в метод, которому требуется $ connection. Каков наилучший способ добиться чего-то подобного или лучше с помощью PDO php?
Я считаю, что нет «лучшего» способа добиться того, что вы просите, но вот что я использую. Выполнение функции было разработано в соответствии с моими потребностями, вы можете изменить его, как хотите.
** РЕДАКТИРОВАТЬ **
Кстати, я использую метод 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, я предлагаю вам выбрать ее и попробовать. У рамок есть свои правила, поэтому вам не нужно искать и думать о том, как создавать «идеальные правила» для вашего собственного приложения.