没有错误:没有调用PDO构造函数

时间:2013-11-29 11:11:34

标签: php pdo

下午好。我昨天开始使用PDO,我有一些问题。我正在创建extendet类,它不起作用,我找不到错误。

这是我的助手类的代码,对于工作女巫PDO:

    class EPDO extends PDO {
  /** Some identificator of connection*/
  public $db;

  /**
   * Creating new PDO connections
   */     
  public function __construct($dbhost, $dbname, $dbuser = 'root', $dbpass = '', $dbtype = 'mysql') {
    $db = new PDO($dbtype . ':host=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
  } 

  /**
   * Insert into database with using transaction (if operation failed the changes go before)
   */     
  public function insert($statement) {
    $db->beginTransaction();

    $status = $db->exec($statement);
    if ($status) {
      $db->commit();  
    } else {
      $db->rollback();
    }
  } 
}

这是无法使用的代码:

$stm = $db->prepare('SELECT id FROM `startups` WHERE id = :id');
$params = array(':id' => $child->id);
$ok = $stm->execute($params);
$row = $stm->fetch(PDO::FETCH_ASSOC);

在此代码之前,我当然按以下方式调用连接:

  require_once 'EPDO.php';

  try {
    $db = new EPDO('--server--', '--database--', '--user--', '--pass--');
  }
  catch (PDOException $err) {
    echo "Chyba spojeni: " . $err->getMessage();
  }

非常感谢,对不起我的英语。

3 个答案:

答案 0 :(得分:5)

问题是你正在扩展PDO类并重写构造函数,所有这些都不需要调用构造函数。

此外,每次创建新对象时,实质上都是创建两个数据库连接。

这应该有助于解决您的问题,并减少创建的连接:

class EPDO extends PDO {
    /** Some identificator of connection*/
    public $db;

    /**
     * Creating new PDO connections
     */     
    public function __construct($dbhost, $dbname, $dbuser = 'root', $dbpass = '', $dbtype = 'mysql') {
        parent::__construct($dbtype . ':host=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
    } 

    /**
     * Insert into database with using transaction (if operation failed the changes go before)
     */     
    public function insert($statement) {
        $this->beginTransaction();
        $status = $this->exec($statement);
        if ($status) {
            $this->commit();  
        } else {
            $this->rollback();
        }
    }
}

答案 1 :(得分:2)

两个问题:你的设计是错误的。您扩展了PDO,但是您在里面创建了一个PDO类型的新成员对象$db。这不会像你想要的那样起作用。你必须调用它的超级构造函数。

public function __construct($dbhost, $dbname, $dbuser = 'root', $dbpass = '', $dbtype = 'mysql') {
      parent::__construct($dbtype . ':host=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
} 

实际上,根本不需要这个构造函数,你只是改变参数,造成混乱。因此,您可以轻松地将其与$db属性一起删除。

其次,要引用类成员和方法,请使用$this in PHP

public function insert($statement) {
    $this->beginTransaction();

    $status = $this->exec($statement);
    if ($status) {
      $this->commit();  
    } else {
      $this->rollback();
    }
} 

答案 2 :(得分:0)

所有这些长期答案,当解决方案如此简单时:

你必须使用

$this->db = new PDO(...

而不是

$db = new PDO(...

因为当你点击

$db->commit();  

$db为空=未调用构造函数。

错误消息应该类似于undefined method commit() on non-object。 你还必须使用

$this->db->commit();  

对从班级内部访问的每个成员和方法使用$this

依旧......