这是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的内容。
答案 0 :(得分: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()
永远不会发生,并且它会回滚。
答案 1 :(得分:-1)
试试这一行:
$this->DBH = new parent::__construct("mysql:host=$host;dbname=$dbname", $user, $pass);
原因:__construct覆盖主类函数。我认为这就是为什么,真的不确定。
如果无效,请尝试parrent::PDO
。我很确定这是一个覆盖问题。