0

私は、データベース内のファイルを中程度の blob フィールドに保存する ac# プロジェクトに取り組んでいます。データは正常に保存されており、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 行を使用する 1 つの文字列です。PHP の爆発メソッドを呼び出すときに行っていることは、タブ上の文字列を分割することです。したがって、次のようになります。

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 はこれらの改行を空白以外のものとして認識しません。また、テーブルの書式設定が台無しになっています。

とにかく、これを解決するために必要な方法は、データベースから文字列を取得した後、それを複数の行に分割する必要があるということです。ここでの混乱の原因は、データベースの行がテキスト ファイルの行に対応していると考えているように見えることだと思います。そうではありません。複数行のテキスト ファイルがあり、ログに 1 行として保存されます。そのため、データベースの結果の行を反復処理する必要はありません (つまり、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 に答える