1

我试图让我的代码能够在打开数据库时记录任何类型的错误。我想要做的是,创建一个 .txt 文件,所有日志都将保存在那里以防出错。

到目前为止我所做的是:

bla bla bla
} catch(PDOException $e) {
        //in case of error , we create a log file with the error
        //$PDOException_file = 'PDOException_file_' . date('Y_m_d-H-i-s') . '.txt' ;
        $PDOException_file =  'PDOException_file' . '.txt' ;
        $fh = fopen($PDOException_file, 'w') or die();
        fwrite($fh, date('Y_m_d-H-i-s') . ' PDOException Error: ' . $e->getMessage() . "\n\n" );
        fclose($fh);
        echo 'Error: ' . $e->getMessage();

        }

我对我编写的代码的期望是创建一个 .txt 文件“PDOException”文件并在其中获取如下日志:

2013_05_02-12-40-02 PDOException Error: bla bla bla


2013_05_02-12-43-02 PDOException Error: bla bla bla 


2013_05_02-13-45-02 PDOException Error: bla bla bla

这意味着每次我遇到错误时,打开文件,写错误使 2 个新行关闭文件。然后下次我遇到错误时,我会在这个文件的末尾写入错误等。

但是发生的事情是我在文件的开头重写了旧数据。我怎样才能避免这种情况?

4

6 回答 6

9

在您拥有的代码中:

$fh = fopen($PDOException_file, 'w') or die()

你应该使用:

$fh = fopen($PDOException_file, 'a') or die()

打开的w文件仅用于写入并将文件指针放在文件的开头并将文件截断为零长度(删除所有内容)。如果文件不存在,它将尝试创建它。将a打开文件以仅写入并将文件指针放在文件末尾。如果文件不存在,它将尝试创建它。

fopen()您可以在此处找到更多信息:http: //php.net/manual/en/function.fopen.php

于 2013-05-02T10:51:31.853 回答
2

您可以使用file_put_contents代替FILE_APPEND标志作为替代方法:

file_put_contents($PDOException_file, date('Y_m_d-H-i-s') . ' PDOException Error: ' . $e->getMessage() . "\n\n", FILE_APPEND);
于 2013-05-02T10:52:51.657 回答
1

http://php.net/manual/en/function.fopen.php 有很多例子,以及如何使用它的信息。

您想要做的是将“w”替换为“a”。这会将指针放在文件的末尾,而不是开头,这样您就不会覆盖文件中的任何现有文本。

于 2013-05-02T10:50:28.637 回答
0

检查您的文件是否已经存在。

您使用的 fopen 参数是“w”,它将创建一个新文件并替换您的旧文件。您可以使用“a”来附加您的文件。

这个 http://php.net/manual/en/function.file-exists.php 和这个 http://php.net/manual/en/function.fopen.php 可能是一个正确的参考

于 2013-05-02T10:52:28.777 回答
0

fopen 在某些模式下打开文件。您使用了“W”模式,即它将以写模式打开文件,并在开始时使用指针,这就是每次删除文件数据并从一开始就粘贴数据的原因。因此,而不是使用“a”以附加模式打开文件,这意味着您现有的数据将保留在那里,之后将附加新数据。

于 2013-05-02T10:55:31.510 回答
0

你可以使用类似的东西:

    $myFile="text.txt";
    $original_data=file_get_contents($myFile);
    $new_data=original_data."\n\n".'PDOException Error: '.$e->getMessage();
    file_put_contents($myFile,$new_data);
于 2013-05-02T10:59:02.107 回答