创建一个用于挂钩PDO查询的databaseDo()函数

o_o*_*o-- 5 php pdo function

所以我开始本教程作为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的范围

我使用$ dbh作为参数.这是将变量传递给这样的函数而不使其全局化的正确方法吗?

Kri*_*ris 4

是的,这是一个好主意,建议创建一个使用单例模式的数据库帮助器类..类似

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)

现在这只是非常基本的,还需要添加更多内容(异常处理、更多/更好的帮助方法等),但我在许多项目中使用了类似的东西。