PDO Global Instance Новый PDO, возможно ли это?

Я использую PHP PDO для подключения к моей базе данных и запуска некоторых запросов, чтобы затем использовать возврат запроса в некоторых формах.

То есть, у меня есть выбор, где он заполняется значениями, исходящими из запроса.

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

/** Conecta com as impressas **/ function impressoras() { $PDO2 = new PDO('mysql:host=localhost;dbname=ti','root','xxx'); $PDO2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); global $stmt; $stmt = $PDO2->prepare("SELECT * FROM league"); $stmt->execute(); $result = $stmt->fetchAll(); return $result; echo json_encode($user_arr); } function carrefour() { $PDO3 = new PDO('mysql:host=localhost;dbname=ti','root','xxx'); $PDO3->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); global $stmt; $stmt = $PDO3->prepare("SELECT * FROM lol"); $stmt->execute(); $result = $stmt->fetchAll(); return $result; echo json_encode($user_arr); } 

Вы можете «разделить» один и тот же объект соединения с базой данных (PDO) очень простой в обычном старом процедурном стиле 🙂 Вот простой пример:

 // config.php define('DB_DSN', 'mysql:host=127.0.0.1;dbname=test;charset=utf8'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', ''); // database.php function db() { static $db = null; if ($db === null) { $db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8 COLLATE utf8_unicode_ci" )); } return $db; } 

Применение

 function test1() { $pdo = db(); $stmt = $pdo->prepare("SELECT * FROM league"); $stmt->execute(); $result = $stmt->fetchAll(); return $result; } 

Если вы предпочитаете более профессиональное решение, взгляните на PHP-DI и используйте инъекцию зависимостей.

Попробуйте.

  • Вы должны создать только один экземпляр PDO, например соединение. Он должен быть передан как аргумент для каждой функции, которая его использует.
  • Я написал функцию fetchLeagues() вместо impressoras . Реализовать функцию carrefour() аналогичным образом.
  • Я также написал функцию fetchleagueById() , чтобы показать вам, как привязывать значения к подготовленному оператору sql.
  • Я реализовал три других примерных функции ( insertUser() , updateUser() и deleteUser() ), чтобы вы могли увидеть полный процесс CRUD.

Некоторые рекомендации:

  • Попытайтесь переместиться в ООП.
  • Применение так называемой инъекции зависимостей вместо реализации глобальных и статических данных.
  • Примените обработку исключений.

Ресурсы :

  • (Единственное правильное) учебное пособие PDO
  • Основы отчетности об ошибках
  • Обработка ошибок – лучшие практики PHP
  • Чистые кодовые разговоры – не смотрите на вещи!
  • Инъекция зависимостей и инверсия зависимостей в PHP
  • Обработка исключений

Вот код – четыре страницы PHP.

Удачи!

index.php

 <?php require_once 'connection.php'; require_once 'functions.php'; try { // Fetch leagues. $leagues = fetchLeagues($connection); var_dump($leagues); // For testing. // Fetch league by id // ------------------ // $leagueId = 1; // $league = fetchLeagueById($connection, $leagueId); // var_dump($league); // For testing. // // Insert user // ----------- // $username = 'Sam'; // $lastInsertId = insertUser($connection, $username); // var_dump($lastInsertId); // For testing. // // Update user // ----------- // $userId = 6; // $username = 'Mikaela'; // $userUpdated = updateUser($connection, $userId, $username); // var_dump($userUpdated); // For testing. // // Delete user // ----------- // $userId = 6; // $userDeleted = deleteUser($connection, $userId); // var_dump($userDeleted); // For testing. } catch (PDOException $exc) { // Announce the user about the fact of a raised error, or redirect him to a predefined display-error page. echo 'We are sorry for the inconvenience. An error occurred during your request. Please try again or contact the administrator.'; // Log exception to a file. // ... exit(); } catch (Exception $exc) { // Announce the user about the fact of a raised error, or redirect him to a predefined display-error page. echo 'We are sorry for the inconvenience. An error occurred during your request. Please try again or contact the administrator.'; // Log exception to a file. // ... // Handle the exception correspondingly. // ... } 

connection.php

 <?php require_once 'configs.php'; try { // Create a db connection. $connection = new PDO( sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=%s' , MYSQL_HOST , MYSQL_PORT , MYSQL_DATABASE , MYSQL_CHARSET ) , MYSQL_USERNAME , MYSQL_PASSWORD , array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => FALSE, PDO::ATTR_PERSISTENT => TRUE, ) ); } catch (PDOException $exc) { // Announce the user about the fact of a raised error, or redirect him to a predefined display-error page. echo 'We are sorry for the inconvenience. An error occurred during your request. Please try again or contact the administrator.'; // Log exception to a file. // ... exit(); } 

configs.php

 <?php // Db connection parameters. define('MYSQL_HOST', '...'); define('MYSQL_PORT', '3306'); define('MYSQL_DATABASE', '...'); define('MYSQL_CHARSET', 'utf8'); define('MYSQL_USERNAME', '...'); define('MYSQL_PASSWORD', '...'); 

functions.php

 <?php /** * Fetch leagues. * * SELECT * FROM [table-name] WHERE [col1]=:[val1] [oper] [col2]=:[val2] * * @param PDO $connection Connection instance. * @return array Leagues list. */ function fetchLeagues($connection) { $sql = 'SELECT * FROM league'; $statement = $connection->prepare($sql); $statement->execute(); return $statement->fetchAll(PDO::FETCH_ASSOC); } /** * Fetch league by id. * * SELECT * FROM [table-name] WHERE [col1]=:[val1] [oper] [col2]=:[val2] * * @param PDO $connection Connection instance. * @param string $leagueId League ID. * @return array League details. */ function fetchLeagueById($connection, $leagueId) { $sql = 'SELECT * FROM league WHERE id = :id LIMIT 1'; $statement = $connection->prepare($sql); $statement->bindValue(':id', $leagueId, PDO::PARAM_INT); $statement->execute(); return $statement->fetch(PDO::FETCH_ASSOC); } /** * Insert user. * * INSERT INTO [table-name] ([col1],[col2],[col3]) VALUES (:[col1],:[col2],:[col3]) * * @param PDO $connection Connection instance. * @param string $username User name. * @return integer Last insert id. */ function insertUser($connection, $username) { $sql = 'INSERT INTO users ( username ) VALUES ( :username )'; $statement = $connection->prepare($sql); $statement->bindValue(':username', $username, PDO::PARAM_STR); $statement->execute(); return $connection->lastInsertId(); } /** * Update user. * * UPDATE [table-name] SET [col1]=:[col1],[col2]=:[col2] WHERE [PK-name]=:[PK-name] * * @param PDO $connection Connection instance. * @param integer $userId User ID. * @param string $username User name. * @return bool TRUE if update successful, FALSE otherwise. */ function updateUser($connection, $userId, $username) { $sql = 'UPDATE users SET username = :username WHERE id = :id'; $statement = $connection->prepare($sql); $statement->bindValue(':id', $userId, PDO::PARAM_INT); $statement->bindValue(':username', $username, PDO::PARAM_STR); $statement->execute(); return $statement->rowCount() > 0; } /** * Delete user. * * DELETE FROM [table-name] WHERE [PK-name]=:[PK-name] * * @param PDO $connection Connection instance. * @param integer $userId User ID. * @return bool TRUE if delete successful, FALSE otherwise. */ function deleteUser($connection, $userId) { $sql = 'DELETE FROM users WHERE id = :id'; $statement = $connection->prepare($sql); $statement->bindValue(':id', $userId, PDO::PARAM_INT); $statement->execute(); return $statement->rowCount() > 0; } 

ОБНОВИТЬ:

Как вы можете видеть, мой код содержит части кода, которые повторяются сами. Но у меня была длинная дискуссия с @YourCommonSense, и она кристаллизовалась как лучший способ применения обработки исключений. @YourCommonSense написал собственный учебник, который я представил в качестве первого ресурса / ссылки в приведенном выше списке. Вместо этого вы можете использовать его метод. У этого есть БОЛЬШОЕ преимущество исключения всех повторений кода.