所以我开始本教程作为PHP PDO的介绍.到目前为止,我只使用基本mysql_*类型查询.
我注意到,在整个教程中,connect -> do action -> disconnect模式重复,只有do action部分发生变化.
在现实环境中,通过创建可以传递查询的函数来消除重复是否是个好主意?
例如:
<?php
function databaseDo($action) {
$db_hostname = 'localhost';
$db_username = 'root';
$db_password = 'root';
try {
// Establish DB connection
$dbh = new PDO("mysql:host=$hostname;dbname=mysql",
$db_username, $db_password);
echo 'Connected to database';
// Do something
$action($dbh); // <- here goes whatever action we wish to perform
// Close connection
$dbh = null;
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
Run Code Online (Sandbox Code Playgroud)
然后,假设我想在PDO教程的第一个示例中执行操作,我会将其设置为:
<?php
// Define action
$insert = function($dbh) {
$query = "INSERT INTO animals(animal_type, animal_name)
VALUES ('kiwi', 'troy')";
$exec = $dbh->exec($query);
echo $exec;
};
// Perform action
databaseDo($insert);
?>
Run Code Online (Sandbox Code Playgroud)
我使用$ dbh作为参数.这是将变量传递给这样的函数而不使其全局化的正确方法吗?
是的,这是一个好主意,建议创建一个使用单例模式的数据库帮助器类..类似
abstract class DB
{
protected static $instance;
protected $db;
protected static $host = 'host';
protected static $user = 'user';
protected static $pass = 'pass';
protected static $database;
public static function getInstance()
{
if (!isset(self::$instance)) self::$instance = new static();
return self::$instance;
}
public static function doStatement($statement, array $parameters)
{
$handler = self::sql()->prepare($statement);
$handler->closeCursor();
$handler->execute($parameters);
return $handler;
}
protected function __construct()
{
$this->db = new PDO(sprintf('mysql:host=%s;dbname=%s', static::$host, static::$database), static::$user, static::$pass);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
}
public static function db()
{
return static::getInstance()->db;
}
}
class Main extends DB
{
protected static $database = 'db';
}
Run Code Online (Sandbox Code Playgroud)
使用它
$db = Main::getInstance();
$results = $db::doStatement('SELECT * FROM table WHERE id = :id', array(':id' => 5));
Run Code Online (Sandbox Code Playgroud)
现在这只是非常基本的,还需要添加更多内容(异常处理、更多/更好的帮助方法等),但我在许多项目中使用了类似的东西。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |