Mysqli 更新 UTF8

Mysqli Update UTF8

所以,当我更新我的数据库中的东西时,它会变成这样:Š 变成这样: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'");

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

还有一个注意事项:您的值并不是真正的 utf8, 它是 json 编码的字符串:

{"subject":"A","desc":"A\u017d"}

如您所见,原始字符串不等于数据库中存储的值:

{"subject":"A","desc":"Au017d"}

在数据库中保存原始 json 不是最佳做法。我建议只保存值而不是对象。

但是如果你需要这个,你应该在插入and/or更新记录时使用这个:

mysqli_query($db, "UPDATE schools SET subjectData='".mysqli_escape_string($json)."' WHERE id='$schoolID'");  

这与 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? and The Great Escapism (Or: What You Need To Know To Work With Text Within Text)