所以,当我更新数据库中的内容时,它会将例如this:Š
变成this:u0160
,如果它变成this:'u0160
,它会正确显示,但不会。
这是我的连接文件:
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'pwd');
define('DB_DATABASE', 'database');
$db = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
mysqli_set_charset($db,"utf8");
mysqli_query("set names utf8");
?>
这就是查询:
mysqli_query($db, "UPDATE schools SET subjectData='$json' WHERE id='$schoolID'");
$json
的值:{"subject":"A","desc":"A'u017d"}
- 数据库条目的值:
{"subject":"A","desc":"Au017d"}
这与UTF-8完全无关,您只处理纯ASCII值。您的问题是,当您将反斜杠输入数据库时,反斜杠(JSON编码的必要部分)正在消失。原因可能是您没有正确地转义数据。反斜杠在SQL中有一个特殊的转义含义,如果您想在数据库中插入一个字面反斜杠,它需要转义。对于mysqli,您应该使用准备好的语句:
$stmt = $db->prepare('UPDATE schools SET subjectData = ? WHERE id = ?');
$stmt->bind_param('ss', $json, $schoolID);
$stmt->execute();
请参阅如何防止PHP中的SQL注入?和伟大的逃避主义(或者:在文本中处理文本需要知道什么)。
所以您显示了变量值,但没有显示从数据库中提取值的代码。
另一个注意事项是:你的值并不是真正的utf8,它是json编码的字符串:
{"subject":"A","desc":"A'u017d"}
正如您所看到的,原始字符串不等于存储在数据库中的值:
{"subject":"A","desc":"Au017d"}
在数据库中保存原始json并不是最好的做法。我建议只保存值而不保存对象。
但如果你需要这个,你应该在插入和/或更新记录时使用这个:
mysqli_query($db, "UPDATE schools SET subjectData='".mysqli_escape_string($json)."' WHERE id='$schoolID'");