我正在研究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中获取数据库中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>";
我正在拆分日志文件中的行,它是以制表符分隔的,所以我将它拆分为选项卡将其放入表中,但这是在我意识到所有内容都在同一行之前。
如何从数据库中检索数据时保留换行符。
感谢您提供的任何帮助。
答案 0 :(得分: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看起来有点像这样:
<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时,您需要处理文件中的换行符,并且数据库不会帮助您格式化换行符。 ; - )
答案 1 :(得分:0)
如果要保留非HTML格式(例如换行符和制表符),则需要在<pre></pre>
标记中包含包含这些字符的文本:
答案 2 :(得分:0)
使用File.ReadAllLines保留新行 http://msdn.microsoft.com/en-us/library/bsy4fhsa 为什么将文本文件存储为二进制文件?