0

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

这是我的 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”和“The character encoding of the HTML document was not declared”。关于我在这里做错了什么的任何想法?感谢您的任何建议。

4

1 回答 1

1

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

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

您可能要检查的另一件事是天气或包含路径是否正确,并阅读有关 autoloading classes 的文档。一旦你拥有了一个庞大的类库,它将为你省去一个麻烦的世界。这可能会解释您的第一个错误,就像?>标签一样,但只是为了安全起见:使用require_once, 而不是require: 包括并因此重新定义一个类,这根本不是您想要做的。

于 2012-08-13T09:54:11.637 回答