0

我正在处理 ac# 项目,我将数据库中的文件存储到一个中等 blob 字段中,数据存储得很好,当我在 MySQL Workbench 中查看它时,文件中的每一行都显示在数据库中它自己的行上,即相同的格式。

但是,当我从 PHP 中检索信息时,它似乎删除了新行,并且所有内容都在同一行上。

下面是我用来将文件存储在数据库中的代码。

using (ConnectDb db = new ConnectDb(appSettings))
                {
                    FileStream fileStream = new FileStream(logFile, FileMode.Open, FileAccess.Read);
                    long fileLength = fileStream.Length;
                    byte[] myData = new byte[fileLength];
                    fileStream.Read(myData, 0, System.Convert.ToInt32(fileLength));
                    fileStream.Close();

                    string fileSize = Common.convertBytesToMb(fileLength);
                    string query = "INSERT INTO logfile_history (LogFile, FileSize) VALUES (@file, @size)";
                    using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
                    {
                        cmd.Parameters.AddWithValue("@file", myData);
                        cmd.Parameters.AddWithValue("@size", fileSize);
                        cmd.ExecuteNonQuery();
                    }
                }

当我从 PHP 获取文件时,新行被删除,下面是我用来从 PHP 数据库中的 Medium Blob 获取数据的代码。

$query = "SELECT * FROM logfile_history WHERE id='$id'";

    $result = mysql_query($query);
    if ($result)
    {
        echo "<table class=\"overview\">";
        echo "<tr>";
        echo "<th>Date</th>";
        echo "<th>Class/Method</th>";
        echo "<th>Message</th>";
        echo "</tr>";
        while ($myrow = mysql_fetch_array($result))
        {
            $logContent = $myrow['LogFile'];
            $splitContent = explode("\t", $logContent);
            $i = 0;
            $colCount = 0;
            while ($i < count($splitContent))
            {
                if ($colCount == 0)
                {
                    echo "<tr>";
                }
                echo "<td>" . $splitContent[$i] . "</td>";
                if ($colCount == 2)
                {
                    echo "</tr>";
                    $colCount = 0;
                }
                $i++;
                $colCount++;
            }
        }
        echo "</table>";

我正在拆分日志文件中的行,因为它是制表符分隔的,所以我按制表符拆分它以将其放入表中,但这是在我意识到所有内容都在同一行之前。

从数据库中检索数据时如何保留换行符。

感谢您的任何帮助,您可以提供。

4

3 回答 3

1

好的,我想象您有一个如下所示的日志文件:

时间戳 1 方法 1 消息 1
时间戳 2 方法 2 消息 2
时间戳 3 方法 3 消息 3

...上面的 4 个空格是一个制表符。

这是多行,但一个字符串,它使用数据库中的 1 行。当您调用 PHP 的 explode 方法时,您正在做的是拆分选项卡上的字符串。所以它看起来像:

echo $splitcontent
#prints a list like ["Timestamp1", "Method1", "Message1\nTimestamp2", "Method2", "Message2\nTimestamp3","Method3", "Message3"]

(如果那里的语法不好,那是因为我实际上并不了解 PHP。)

换行符被保留,但请注意消息和时间戳是如何在同一个列表元素中压缩在一起的。

您最终将其包装在一些 HTML 标记中。我想象你的 HTML 看起来有点像这样:

<table class="overview">
<tr>
    <th>Date</th>
    <th>Class/Method</th>
    <th>Message</th>
</tr>
<tr>
    <td>Timestamp1</td>
    <td>Method1</td>
    <td>Message1\nTimestamp2</td>
</tr>
<tr>
    <td>Method2</td>
    <td>Message2\nTimestamp3</td>
    <td>Method3</td>
</tr>
<tr>
    <td>Message3</td>
</table>

(显然,这是 HTML 的格式化版本。)

显然,HTML 不会将这些换行符识别为空格以外的任何内容。并且您的表格的格式混乱了。

无论如何,您需要解决的方法是从数据库中检索字符串后,您需要将其拆分为多行。我认为您的一些困惑的根源在于您似乎认为数据库中的一行对应于文本文件中的一行。它没有。您有一个包含多行的文本文件,该文件在日志中存储为一行。因此,您不需要遍历数据库结果中的行(也就是说,如果您的 ID 列是主键,它可能是)。相反,您应该编写如下内容:

if ($logtext = mysql_fetch_array($result))
{
    $loglines = explode("\n", $logtext)
    foreach($loglines as $line)
    {
        echo "<tr>"
        #explode on the tab characters and format each entry inside <td> tags
        echo "</tr>"
    }
}

再说一次,我不懂 PHP,所以如果有语法错误,我深表歉意。

底线:当您尝试将文件格式化为 HTML 时,您需要处理文件中的换行符,并且数据库不会帮助您格式化换行符。;-)

于 2012-08-16T00:30:42.590 回答
0

如果要保留非 HTML 格式,例如换行符和制表符,则需要将包含这些字符的文本包装在<pre></pre>标签中:

http://www.w3.org/TR/html401/struct/text.html#h-9.3.4

于 2012-08-15T22:36:49.207 回答
0

使用 File.ReadAllLines 保留新行 http://msdn.microsoft.com/en-us/library/bsy4fhsa 为什么将文本文件存储为二进制文件?

于 2012-08-15T22:40:22.560 回答