2

通过阅读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
}
}

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

调试信息存储在 $debug 中。

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

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

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_query 运行良好。

谢谢!

4

1 回答 1

0

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

要可靠地记录您的信息,您需要显式调用以运行查询。如果您依赖__destruct()于此,您可能总是会遇到一些与您遇到的问题类似的问题。

于 2013-01-25T13:38:19.530 回答