PDO 全局实例新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过程。

一些建议:

  • 尝试移动到 OOP。
  • 应用所谓的依赖注入,而不是实现全局变量和静态。
  • 应用异常处理。

参考资料

  • (唯一正确的(PDO教程
  • 错误报告基础知识
  • 错误处理 - PHP 最佳实践
  • 干净的代码说话 - 不要寻找东西!
  • PHP 中的依赖注入和依赖反转
  • 异常处理

这是代码 - 四个PHP页面。

祝你好运!

索引.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.
// ...
}

连接.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();
}

配置.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', '...');

函数.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编写了自己的教程 - 我将其作为上述列表中的第一个资源/链接提供。你可以改用他的方法。它具有消除所有代码重复的巨大优势。

最新更新