2015-09-24 21 views
1

我有一个PHP表单,我用来输入数据到数据库(phpmyadmin),我用SELECT查询来显示数据库中的所有值,以在php窗体中查看。从PHP创建的JSON提供错误的数据?

另外我还有另一个PHP文件,我用它从相同的数据库表创建JSON。

这里的时候,我进入国外的语言,如“Experienţapersonală:”使用保存在DB值是“ExperienÈ>一personală:‘但是当我使用select查询,显示这同一的PHP表单,它的到来正确’Experienţapersonală: ”。因此,DB是正确的,现在使用下面的PHP代码来创建JSON

<?php 
$servername = "localhost"; 
$username = "root"; 
$password = "root"; 
$dbname = "aaps"; 

// Create connection 
$con=mysqli_connect($servername,$username,$password,$dbname); 
// Check connection 
mysqli_set_charset($con, 'utf8'); 
//echo "connected"; 
$rslt=mysqli_query($con,"SELECT * FROM offers"); 
while($row=mysqli_fetch_assoc($rslt)) 
{ 

$taxi[] = array('code'=> $row["code"], 'name'=> $row["name"],'contact'=> $row["contact"], 'url'=> $row["url"], 'details'=> $row["details"]); 
} 
header("Content-type: application/json; charset=utf-8"); 

echo json_encode($taxi); 
?> 

和JSON看起来像

[{"code":"CT1","name":"Experien\u00c8\u203aa personal\u00c4\u0192: ","contact":"4535623643","url":"images\/offers\/event-logo-8.jpg","details":"Experien\u00c8\u203aa personal\u00c4\u0192: jerhbehwgrh 234234 hjfhjerg#$%$#%#4"},{"code":"ewrw","name":"Experien\u00c8\u203aa personal\u00c4\u0192: ","contact":"ewfew","url":"","details":"eExperien\u00c8\u203aa personal\u00c4\u0192: Experien\u00c8\u203aa personal\u00c4\u0192: Experien\u00c8\u203aa personal\u00c4\u0192: "},{"code":"Experien\u00c8\u203aa personal\u00c4\u0192: ","name":"Experien\u00c8\u203aa personal\u00c4\u0192: ","contact":"","url":"","details":"Experien\u00c8\u203aa personal\u00c4\u0192: "}] 

在这个“\ u00c8 \ u203aa”这是错了,它应该是“\ u021b“(t)。

因此,用于创建JSON使这个问题。

但我无法准确找到它为什么会这样。请帮助

+0

确定数据库中的数据正确吗?在编码之前尝试对'$ taxi'数组执行'var_dump'。 – Jerodev

+0

是的数据库是正确becoz当我试图做相同的PHP文件选择查询是越来越正确的date.ok我会做,让你知道 – Bangalore

+0

array(4){[0] => array(5){[“code” ] =>字符串(3)“CT1”[“name”] =>字符串(29)“ExperienâðpersonalÔÆ':“[”contact“] =>字符串(10)”4535623643“[”url“] => string(30)“images/offers/event-logo-8.jpg”[“details”] => string(66)“ExperienúºpersonalÔÆ':jerhbehwgrh 234234 hjfhjerg#$%$#%#4 “} [1] =>数组(5){[”code“] =>字符串(4)”ewrw“ – Bangalore

回答

0

根据数据库的MySQL版本,它可能没有使用全UTF8设置,如documentation说:

的UCS2和UTF-8字符集不支持增补字符位于BMP之外。 BMP之外的字符作为REPLACEMENT CHARACTER比较并转换为'?'当转换为Unicode字符集时。

但是,这不太可能与您的问题有关。我会尝试几个不同的事情,看看它是否能解决你的问题。

  1. 使用SET NAMES utf-8 您可以将数据添加到数据库时,阅读更多有关here
  2. 使用utf8_encode(),提取时utf8_decode()。这样,您不必担心MySql操作Unicode字符。 Documentation
+0

伙计我说已经当我查询选择从PHP直接得到相同的正确数据,只有问题来了,当我生成json – Bangalore

+0

我试过SET NAME已经 – Bangalore

+0

尝试编码像我建议 – ygesher

1

使用Unicode - 注意额外的参数:

json_encode($s, JSON_UNESCAPED_UNICODE) 

不要使用函数utf8_encode /解码。

ă变成ă是Mojibake。它可能意味着

  • 在客户端你拥有的字节UTF8(好)的正确编码。
  • 您与SET NAMES latin1(或set_charset('latin1')或...)连接,可能是默认情况下。 (它应该是utf8。)
  • 表中的列可能已经或可能不是CHARACTER SET utf8,但应该是这样的。

如果需要修复的数据需要 “2步ALTER”,像

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; 
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; 

进行任何更改之前,请

SELECT col, HEX(col) FROM tbl WHERE ... 

随着该,ă应该显示C483的十六进制。如果你看到C384C692,你有“双重编码”,这是更难解决。