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" を実行できませんでした)。このための DB クエリは、デストラクタで呼び出されます (情報: クエリは単なるダミーです。したがって、クエリ構文に問題がないことを回避できます)。

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);

問題: デストラクタ内に db 接続がないようです。これは、常にこのエラーが発生するためです。

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 は完全に機能しています。

ありがとうございました!

4

1 に答える 1

0

関数を明示的に呼び出す__destruct()か、オブジェクトへの参照を非常に綿密に処理し、いつ設定が解除されるかを正確に把握していない限り__destruct()、言語によっていつ呼び出されるかは保証されません。それが呼び出されるまでに、言語はデータベースへの接続用のリソースをすでに解放しています。mysql_query()は、デフォルトのサーバー パラメータを使用して新しい接続を作成しようとしますが、空のユーザーが存在しないため失敗します。

情報を確実にログに記録するには、クエリを実行するための呼び出しを明示的に行う必要があります。これに頼ると__destruct()、あなたが抱えている問題に似た問題が常に発生する可能性があります。

于 2013-01-25T13:38:19.530 に答える