【问题标题】:How to build and call a simple PHP class for a PDO DB connection如何为 PDO DB 连接构建和调用简单的 PHP 类
【发布时间】:2015-02-17 18:42:53
【问题描述】:

这是我目前所拥有的:

class DB {
    var $DBUser = 'xxx';
    var $DBPass = 'xxx';
    var $DBServer = 'xxx';
    var $DBName = 'xxx';

    public function connect() {
        try {  
            $strDSN = "mysql:host=$this->DBServer;dbname=$this->DBName;";  
            $username = $this->$DBUser;
            $pass = $this->$DBPass;
            $conn = new PDO($strDSN, $username, $pass);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo 'connected';
         }   
        catch (PDOException $e) {  
            echo 'Error: ' . $e->getMessage();   
        }  
    } //end method
} //end class

然后使用这个调用:

$db = new DB; 
$conn = $db->connect; 
$stmt = $conn->prepare('SELECT * FROM XXX WHERE id = :id'); 
$id = $_GET['id'];
$stmt->execute(array('id'=>$id)); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

但是,我收到以下错误消息:

致命错误:在非对象上调用成员函数prepare()

任何想法我做错了什么?

【问题讨论】:

  • 1.不要再使用var 2. $conn = $db->connect; 是一个函数,所以将其称为一个函数,例如$conn = $db->connect(); 3. 必须像这样访问类属性:$this->DBUser; $ 标志消失了($this->$DBPass; 相同) 4. 你必须返回你的连接,才能分配它像这样:return $connreturn false; 如果连接失败
  • 另外执行你需要:id

标签: php class pdo


【解决方案1】:

当你调用一个方法时,包括括号:

$conn = $db->connect();
//                  ^^ missing

第二个问题是您的连接方法不返回连接句柄。在try 块中添加:

return $conn;

最后,在引用实例和类属性时,不要包含$

$username = $this->DBUser;
//                 ^ $ should not be present

【讨论】:

  • 您仍然错过了几点。见我的评论:stackoverflow.com/questions/28568787/…
  • @Rizier123 虽然不推荐使用var,但这不会影响这里的功能。
  • 如果连接失败,他也应该返回 false 或类似的东西,以便他可以将其放入 if 语句中进行检查
  • 没必要。 NULL 将被退回。无论如何,我宁愿让 PDO 在调用 connect() 时引发未捕获的异常并捕获它,因为他对其他所有事情都使用异常模式,不妨在 connect 调用中使用它。
  • @MrCode:谢谢!当使用以下内容调用时,您将如何扩展它以执行简单查询: $conn = $db->connect('SELECT * FROM XXX WHERE id = :id',$_GET['id']);跨度>
猜你喜欢
  • 2015-08-04
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2012-05-11
  • 2021-04-19
  • 1970-01-01
  • 2021-05-26
  • 2019-07-28
相关资源
最近更新 更多