2012-08-15 65 views
0

我正在處理一個將數據庫中的文件存儲到中等blob字段的ac#項目,數據存儲正常,並且在MySQL Workbench每行中查看它時在文件中顯示在數據庫中的它自己的行,即相同的格式。使用C#在數據庫中存儲文件並從PHP中檢索

但是,當我從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數據庫從介質的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>"; 

我分割線在日誌文件是製表符分隔,所以我用的標籤拆分它把它放在一個表,但是這是我才意識到一切都在同一條線上。

從數據庫中檢索數據時,如何保持換行。

感謝您提供的任何幫助。

回答

1

好吧,我想象你有一個看起來像這樣的日誌文件:

 
Timestamp1 Method1 Message1 
Timestamp2 Method2 Message2 
Timestamp3 Method3 Message3 

...其中4位在上面是一個標籤。

這是多行,但是一個字符串,它在數據庫中使用1行。當你調用PHP的explode方法時你正在做的是在選項卡上分割字符串。所以它看起來像:

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

(如果語法有壞的,那是因爲我真的不知道PHP)

換行符將被保留,但要注意的信息和時間戳如何獲得壓扁一起放在同一個列表元素中。

你已經結束了這個包裝在一些HTML標籤。我想象,你的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不能識別那些換行符作爲除空白,什麼,顯然。而你的表格的格式是混亂的。

無論如何,你需要解決這個問題的方式是,當你從數據庫中檢索字符串後,你需要將它分成多行。我認爲這裏一些混亂的根源是,你似乎認爲數據庫中的一行對應於文本文件中的一行。它沒有。您有一個包含多行的文本文件,它在日誌中存儲爲一行。因此,您不需要遍歷數據庫結果中的行(也就是說,如果您的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,數據庫不會幫你格式換行符。 ;-)

+0

感謝您的幫助,使用\ n新行和HTML不承認它,因爲它需要
完全忘記了文件 – Boardy 2012-08-16 19:30:21

相關問題