PHP类析构函数中的mysql_query(无法建立指向服务器的链接)

时间:2013-01-25 13:30:19

标签: mysql oop class destructor

通过阅读stackoverflow,我解决了几乎所有的问题。但现在我有一个非常“特殊”的,我无法解释。谷歌搜索和研究的时间,但没有解决方案。

类:

class Beitrag_Loeschen {
private $debug;
private $do_debug;

function __construct() {
    $this->do_debug = TRUE;
}

function __destruct() {
    if ($this->do_debug == TRUE) {
        mysql_query("INSERT INTO `seite_log` (`id`, `timestamp`, `benutzer_ip`, `benutzer_id`, `datei`, `referrer`, `fehler`, `kommentar`) VALUES (NULL, UNIX_TIMESTAMP(), '', 1, '', '', '', '')");
    }
}

private function _deleteDir($dir) { 
    // more code
}

// SQL-Query
private function _queryDelete($tabelle, $spalte, $id) {
    $query = "DELETE FROM `".sql($tabelle)."` WHERE `".sql($spalte)."`='".sql($id)."';";
    mysql_query($query);
    $this->debug .= $query."<br/>";
}
private function _queryDeleteKat($tabelle, $kat, $kat_id) {
    $query = "DELETE FROM `".sql($tabelle)."` WHERE `kat`='".sql($kat)."' AND `kat_id`='".sql($kat_id)."'";
    mysql_query($query);
    $this->debug .= $query."<br/>";
}
private function _seiteSuchbegriffe($ergebnis_typ, $ergebnis_id) {
    $query = "DELETE FROM `seite_suchbegriffe` WHERE `ergebnis_id`='".sql($ergebnis_id)."' AND `ergebnis_typ`='".sql($ergebnis_typ)."'";
    mysql_query($query);
    $this->debug .= $query."<br/>";
}

// Kommentare
function bewertungKommentar($id) {
    $this->_queryDelete('bewertungen_kommentare',   'id',               $id); // bewertungen_kommentare
}
function fotoKommentar($id) {
    $this->_queryDelete('fotos_kommentare',         'id',               $id); // fotos_kommentare
}
function rezeptKommentar($id) {
    $this->_queryDelete('rezepte_kommentare',           'id',               $id); // rezepte_kommentare
}

// Bewertung
function bewertung($id) {
    $this->_queryDelete('bewertungen_burger',           'id',               $id); // bewertungen_burger
    $this->_queryDelete('bewertungen_kommentare',   'bewertung_id',     $id); // bewertungen_kommentare
    // more code
}

// Foto
function foto($id) {
    $this->_queryDelete('fotos_kommentare',             'foto_id',          $id); // fotos_kommentare
    // more code
}

// Burger
function burger($id) {
    $this->_queryDelete('burger',                       'id',               $id); // burger
    $this->_queryDeleteKat('benutzer_aktionen',         'favorit_burger', $id); // benutzer_aktionen
    // more code
}

// Lokalität
function lokalitaet($id) {
    $this->_queryDeleteKat('seite_korrekturen',         'lokalitaet',       $id); // seite_korrekturen
    $this->_queryDeleteKat('seite_hits',                'lokalitaeten',     $id); // seite_hits
    // more code
}
}

我的理念:如果你愿意,e。例如,删除您必须从多个表中删除行的位置。为此,我写了这个小PHP类。删除这些东西时,在许多表中执行了许多mysql查询,因此我需要一种调试方法。

调试信息存储在$ debug中。

$this->debug .= $query."<br/>";

最后,$ debug应该存储在数据库中(在调用类之后有一个“header(”Location:...“)”,所以我无法执行“echo”)。在析构函数中调用对此的DB查询(INFO:查询只是一个虚拟的。所以我可以避免查询语法没有问题):

function __destruct() {
    if ($this->do_debug == TRUE) {
        mysql_query("INSERT INTO `seite_log` (`id`, `timestamp`, `benutzer_ip`, `benutzer_id`, `datei`, `referrer`, `fehler`, `kommentar`) VALUES (NULL, UNIX_TIMESTAMP(), '', 1, '', '', '', '')");
    }
}

这个类叫做:

$del = new Beitrag_Loeschen();
$del->bewertungKommentar($id);
//header("Location: ".$referer);

问题: 析构函数中似乎没有数据库连接,因为我一直得到这个错误:

Warning: mysql_query() [function.mysql-query]: Access denied for user ''@'localhost' (using password: NO) in /[...]/classes/beitrag_loeschen.inc.php on line 12
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /[...]/classes/beitrag_loeschen.inc.php on line 12

(第12行是析构函数中的mysql_query)

我做错了什么?该课程中的其他mysql_querys工作正常。

谢谢!

1 个答案:

答案 0 :(得分:0)

除非您明确调用__destruct()函数或非常密切地处理对象的引用并确切知道何时取消设置,否则无法保证语言将调用__destruct()。在调用它时,语言已经释放了与数据库连接的资源。 mysql_query()尝试使用默认服务器参数创建新连接,但由于没有空白用户,因此无法执行此操作。

要可靠地记录您的信息,您需要明确地进行调用以运行查询。如果您依赖__destruct(),可能会遇到类似于您所遇到的问题。