我遇到了以下问题:我已经导入了一个包含Cyrillic记录的csv文件,使用HeidiSQL数据库浏览器完成了该操作。我用记事本打开.csv并将编码更改为utf-8,然后使用phpmyadmin创建数据库,并将collation设置为UTF-8_general_ci。
导入我选择的UTF-8编码后,在导入后HeidiSQL和phpmyadmin中的一切看起来都很好,我的意思是一切都是可读的,但在我的index.php文件中也不可读,其中编码设置为utf -8通过
header('Content-Type: text/html; charset=utf-8');
Browser output
我不知道我的错误在哪里。
这是我的index.php代码:
<?php header('Content-Type: text/html; charset=utf-8');?>
<?php include 'config.php'; ?>
<?php include 'header.php';?>
<?php
$db=new mysqli("$dbhost","$dbuser","$dbpass");
$db->select_db("$dbname") or die ("Critical error: Could not connect to database!");
$query="select * from books";
$result=$db->query($query);
//find number of rows
$num_rows=$result->num_rows;
mysql_query('SET NAMES utf8');
?>
<div id="box">
<center>
<form id="search" action="index.php" method="post">
<input type="text" name="search" placeholder"Search your book..."/>
<input type="submit" value="Search"/>
</form>
<br>
<h3>Our Books</h3>
<table border="1">
<tr id="table_header">
<td>Author</td>
<td>Title</td>
<td>Publisher</td>
<td>Year</td>
<td>Edition</td>
<td>Location</td>
<td>Holder</td>
<td>ISBN</td>
</tr>
<?php
$total=0;
$tstoke=0;
$tout=0;
for($i=0;$i<$num_rows;$i++)
{
//fetch row
$row=$result->fetch_row();
$total=$total+$row[2];
echo "<tr>";
echo "<td width=\"150\">$row[1]</td>" ;
echo "<td width=\"250\">$row[2]</td>" ;
echo "<td width=\"100\">$row[3]</td>" ;
echo "<td width=\"30\">$row[4]</td>" ;
echo "<td width=\"30\">$row[5]</td>" ;
echo "<td width=\"30\">$row[6]</td>" ;
echo "<td width=\"100\">$row[7]</td>" ;
echo "<td width=\"30\">$row[8]</td>" ;
$stoke=$row[2]-$row[3];
$tstoke=$tstoke+$stoke;
$tout=$total-$tstoke;
echo "<td width=\"30\">$stoke</td>" ;
echo "</tr>";
}
echo "</table>";
?>
</center><br>
<center>Now We Have : <?php echo $num_rows; ?> Defreent Books >> Total Books : <?php echo $total; ?> >> Total Stoke : <?php echo $tstoke; ?> >> Total Out : <?php echo $tout; ?></center>
<br>
</div>
<?php include 'footer.php'; ?>
</center>
答案 0 :(得分:0)
我之前遇到过这个问题并找到了一个解决方案:
mysqli_set_charset($db,'utf8');
并且每当打印数据库值时都必须使用htmlentities
。
即。你的更新for循环是
echo "<table>";
for($i=0;$i<$num_rows;$i++)
{
//fetch row
$row=$result->fetch_row();
$total=$total+$row[2];
echo "<tr>";
echo "<td width=\"150\">htmlentities($row[1]);</td>" ;
echo "<td width=\"250\">htmlentities($row[2]);</td>" ;
echo "<td width=\"100\">htmlentities($row[3]);</td>" ;
echo "<td width=\"30\">htmlentities($row[4]);</td>" ;
echo "<td width=\"30\">htmlentities($row[5]);</td>" ;
echo "<td width=\"30\">htmlentities($row[6]);</td>" ;
echo "<td width=\"100\">htmlentities($row[7]);</td>" ;
echo "<td width=\"30\">htmlentities($row[8]);</td>" ;
$stoke=$row[2]-$row[3];
$tstoke=$tstoke+$stoke;
$tout=$total-$tstoke;
echo "<td width=\"30\">$stoke</td>" ;
echo "</tr>";
}
echo "</table>";
让我告诉你一件事,你必须通过这个函数设置你的字符集,以便它将用于你当前的数据库连接。
标题适用于您的网页,不适用于您的数据库。
希望这能解决您的问题。
答案 1 :(得分:0)
请勿使用mix mysql_*
和mysqli_*
接口!
需要在大约4个地方建立utf8。
SHOW CREATE TABLE
验证它们是显式设置为utf8还是默认为表定义。 (仅更改数据库默认是不够的。)SET NAMES utf8
。<meta>
标记。可能发生的事情:
SET NAMES latin1
生效(默认,但错误)CHARACTER SET latin1
(默认,但错误)注意:mysql_query('SET NAMES utf8');
无效,因为您的连接是通过mysqli_*
界面进行的。