我的PHP PDO类不起作用

时间:2012-07-06 18:19:54

标签: php database pdo

这是Database.php

<?php
/*Data Base Class
* MySQL - InnoDB 
* PHP - PDO (PHP Data Object -So we could change databases if needed)
*/
class Database extends PDO{
    private $DBH;

    function __construct($host, $dbname, $user, $pass){
        try {
            $this->DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        } catch (PDOException $e) {  
            return $e->getMessage();  
        }
    }

    public function alteration_query($sql){
        /* Begin a transaction, turning off autocommit */
        $this->DBH->beginTransaction();
        try{
            $count = $this->DBH->exec($sql);
            $this->DBH->commit();
            return $count;
        }catch (PDOException $e) {
          $this->DBH->rollback();
          return  $e;
        }
    }
}
?>

这是test.php

<?php
require('Database.php');
$dbo = new Database('***.***.com','***','***','***');
echo $dbo->alteration_query('DELETE * from T_Table');
?>

出于某种原因,它不会给我一个错误或删除T_table的内容。

2 个答案:

答案 0 :(得分:2)

编辑:您的案例中的问题是该参数被称为$sql,但您正在使用$query来执行它(在alteration_query方法中)。下次,请启用错误报告,和/或使用可以向您显示这些错误的体面IDE。像这样:

Example

EDIT2:将PDO的错误模式设置为异常,这样任何错误都会引发异常。查看更新的代码。

不要在函数内捕获异常,在外面执行:

<?php
/*Data Base Class
* MySQL - InnoDB 
* PHP - PDO (PHP Data Object -So we could change databases if needed)
*/
class Database
{
    private $DBH;

    function __construct($host, $dbname, $user, $pass)
    {
        $this->DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        //Set PDO to throw exceptions on errors!
        $this->DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public function alteration_query($sql)
    {
        /* Begin a transaction, turning off autocommit */
        $this->DBH->beginTransaction();
        $count = $this->DBH->exec($query);
        $this->DBH->commit();
        return $count;
    }
}

try {
    $pdo = new Database("localhost", "dbname", "user", "pass");
    $pdo->alteration_query("SELECT * FROM wrong_table");
}
catch (PDOException $e) {
    die("An error has occured! " . $e->getMessage());
}

通过这种方式,您可以准确地将错误捕获到您需要的位置,而不是强制它在函数内部(这有点超过了异常点)。

另外,从手册:

  

当脚本结束或即将关闭连接时,如果   您有一个未完成的交易, PDO会自动滚动它   回即可。这是一种安全措施,有助于避免不一致   脚本意外终止的情况 - 如果没有   显式提交事务,然后假设某事   出错了,所以为了数据的安全性而进行了回滚

异常停止执行该函数,意味着commit()永远不会发生,并且它会回滚。

答案 1 :(得分:-1)

试试这一行:

$this->DBH = new parent::__construct("mysql:host=$host;dbname=$dbname", $user, $pass);

原因:__construct覆盖主类函数。我认为这就是为什么,真的不确定。

如果无效,请尝试parrent::PDO。我很确定这是一个覆盖问题。