PDO连接类

时间:2012-08-13 09:10:38

标签: php mysql pdo

所以我正在尝试构建一个简单的PDO连接类,这样我就可以在需要DB访问时创建一个DB对象,但无论我尝试什么,我都会遇到相同的错误。

这是我的DB类代码

<?php
class DbConnect
{
// Database login vars
private $dbHostname = 'localhost';
private $dbDatabase = 'database';
private $dbUsername = 'username';
private $dbPassword = 'password';
public $db = null;

public function connect()
{
    try
    {
        $db = new PDO("mysql:host=".$this->dbHostname.";dbname=".$this->dbDatabase, $this->dbUsername, $this->dbPassword); // Establish DB connection
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set error handling
        return $db;
    }
    catch(PDOException $e)
    {
        echo "It seems there was an error.  Please refresh your browser and try again. ".$e->getMessage();
    }
}
}
?>

这是我正在尝试使用它的类的代码:

<?php
session_start();
require 'DbConnect.php';

class User
{
    public function bindParams()
    {
        $DbConnect = new DbConnect();
        $sql = $DbConnect->connect();

        $sql->prepare("insert into dbobjectex(firstName, lastName) values (:firstName, :lastName)");
        $sql->bindParam(':firstName', $_SESSION['firstName']);
        $sql->bindParam(':lastName', $_SESSION['lastName']);
        $sql->execute();
    }
}
?>

然后从我创建User类的位置调用bindParams()。我一直遇到的两个错误是“NetworkError:500 Internal Server Error”和“未声明HTML文档的字符编码”。关于我在这里做错了什么的想法?谢谢你的任何建议。

1 个答案:

答案 0 :(得分:1)

What am I doing wrong here? - 很多事情,但最明显的一件事就是:在你的DbConnect类的定义结束时,你正在关闭php标签?>,您必须尽可能避免包含文件with included files。在你的情况下使用它们的结果是标题被过早发送,解释你的第二个错误。

除此之外,每次实例化用户类时,您都要创建一个新的PDO实例:将其分配给connect成员函数本地的变量,至少替换{{1与$db一起使用。但最重要的是,我同意@sabre:为什么PDO需要额外的包装?特别是只需要实例化并返回一个pdo实例,只需创建一个抽象类,在必要时处理连接。

您可能想要检查的另一件事是天气与否,包含路径是否正确,以及read the docs on autoloading classes。一旦你拥有了一个庞大的类库,它将为你节省一个麻烦的世界。这可以解释您的第一个错误,就像$this->db标记一样,但只是为了安全起见:使用?>而不是require_once:包括,然后重新定义一个类a第二次不是你想要做的事情。