【问题标题】:What's the correct way to use a new PDO in a class context?在类上下文中使用新 PDO 的正确方法是什么?
【发布时间】:2011-12-01 14:44:07
【问题描述】:

过去,我总是创建一个数据库类,并在该类中通过 __construct 方法中的 mysql_connect 分配一个 $connection 属性。在同一个文件中,我将实例化该类,以便它可以使用。然后,每当我需要该连接时,我只需要该数据库文件并在需要 $connection 的方法中添加一个全局 $connection。使用 php 的 PDO 实现类似或更好的目标的最佳方法是什么?

【问题讨论】:

  • 如果 Savas 的方法解决了您的问题,您应该选择它作为答案...

标签: php pdo


【解决方案1】:

我相信没有“最佳”方法可以实现您的要求,但这是我使用的方法。函数execute是根据我的需要设计的,你可以随意改变它。

** 编辑 **

顺便说一句,我在这个类中使用了一个单例方法,因为我从不同的文件中多次调用了这个类。因此,您也可以更改它。

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 (e.g. 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) // e.g. array('red')
                            $stmt->bindParam($i, $arr[0]);
                        else if ($size == 2) // e.g. array(':color', 'red')
                            $stmt->bindParam($arr[0], $arr[1]);
                        else if ($size == 3) // e.g. array(':color', 'red', PDO::PARAM_STR)
                            $stmt->bindParam($arr[0], $arr[1], $arr[2]);
                        else // e.g. array(':color', 'red', PDO::PARAM_STR, 12)
                            $stmt->bindParam($arr[0], $arr[1], $arr[2], $arr[3]);
                        $i++;
                    }
                }
                else if ($size == 1) // e.g. array(15)
                    $stmt->bindParam(1, $param[0]);
                else if ($size == 2) // e.g. array(':color', 'red')
                    $stmt->bindParam($param[0], $param[1]);
                else if ($size == 3) // e.g. array(':color', 'red', PDO::PARAM_STR)
                    $stmt->bindParam($param[0], $param[1], $param[2]);
                else if ($size == 4) // e.g. array(':color', 'red', PDO::PARAM_STR, 12)
                    $stmt->bindParam($param[0], $param[1], $param[2], $param[3]);
            }
            else // e.g. $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;
    }
}

【讨论】:

  • 感谢您的简洁回复。这非常有帮助。
【解决方案2】:

我相信“最佳”方法取决于具体情况。通常我使用 PDO,因为它的内置功能涵盖了大部分需要。我喜欢创建自己的扩展 PDO 的类。

就个人而言(这并不意味着“最佳方式”),如果应用程序很小,我会使用“fat-database-class”模型,该模型将所有小型函数与 SQL 查询一起保存,它只是通过数据库获取/检查/设置信息。 'fat-database-class' 扩展 PDO 这意味着我不需要像 executeget lastId 这样的编写函数,因为 PDO 已经有了这些方法。 如果应用程序更大,我会使用 Framework & Doctrine,这使得管理变得更容易。如果您仍然没有尝试使用任何 php 框架,我建议您选择一个并尝试它。框架有自己的规则,因此您无需搜索和思考如何为您自己的应用程序创建“完美规则”。

【讨论】:

  • 谢谢,是的,我一直在尝试 yii,它看起来很棒。我很难适应它。我猜是因为我是在其他人的代码之上构建的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多