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していることです(alterition_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 に答える