Mysqli更新UTF8

时间:2015-02-12 23:42:07

标签: php mysql mysqli

所以,当我更新我的数据库中的内容时,它会转为:Š这样:u0160如果变成这样:\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"}

2 个答案:

答案 0 :(得分:4)

这与UTF-8完全没有关系,你只处理纯ASCII值。您的问题是,当您将数据库中的反斜杠作为JSON编码的必要部分时,它会消失。原因是您没有正确转发数据。反斜杠在SQL中具有特殊的转义意义,如果要将数字反斜杠插入数据库,则需要转义。使用mysqli,您应该使用预准备语句:

$stmt = $db->prepare('UPDATE schools SET subjectData = ? WHERE id = ?');
$stmt->bind_param('ss', $json, $schoolID);
$stmt->execute();

请参阅How can I prevent SQL injection in PHP?The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

答案 1 :(得分:1)

所以你展示了变量值,但是你没有显示从数据库中提取值的代码。

另一个注意事项:你的价值不是真的是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'");