1

这是 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 的内容。

4

2 回答 2

2

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

例子

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()永远不会发生,并且会回滚。

于 2012-07-06T18:30:12.667 回答
-1

试试这条线:

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

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

如果它不起作用,请尝试parrent::PDO. 我很确定这是一个覆盖问题。

于 2012-07-06T18:21:38.157 回答