我正在处理一个页面,该页面使用JavaScipt通过AJAX POST向PHP脚本发送数据。问题是,如果输入的语言不是拉丁语系,我最终会在MySQL表中存储无意义的字符。拉丁字母表运作正常。
页面本身能够呈现UTF-8字符,如果它们是在页面加载时提供的数据,那么就没有问题,但是对于提交我遇到了困难。
اختبار
并保存。查看浏览器开发工具中的网络POST请求。
该POST是通过以下JS函数进行的。
function createEmptyStack(stackTitle) {
return $.ajax({
type:'POST',
url:'ajax.php',
data: {
"do": 'createEmptyStack',
newTitle: stackTitle
},
dataType: "json"
});
}
这是我的PHP代码。
header('Content-Type: text/html; charset=utf-8');
$newTitle = trim($_POST['newTitle']);
$db->query("
INSERT INTO t1(project_id, label)
VALUES (".$_SESSION['project_id'].", '".$newTitle."')");
当我像这样检查页面的编码时:
mb_detect_encoding($_POST['newTitle'], "auto");
我得到的结果是:UTF-8
我还尝试了以下头部:
header("Content-type: application/json; charset=utf-8");
MySQL数据表的排序规则被设置为utf8_general_ci,以确保数据存储在正确的位置。
我有另一个页面,其中包含一个表单,用户可以使用任何语言填写相同的表格,并且可以完美地工作。当我查看其他页面时,发现它能够成功地将类似的数据插入数据库,在插入查询之前会添加以下内容:
mysql_query("SET NAMES utf8");
我尝试在查询上方放置相同的行,但数据仍然看起来像无意义的字符。我还尝试了以下几个替代方法:
mysql_query("SET CHARACTER SET utf8 ");
和
mysql_set_charset('utf8', $db);
...但是没有成功。我被难住了,需要帮助找出问题所在。
环境:
PHP 5.6.40 (cgi-fcgi)
MySQL 5.6.45
更新:
我进行了更多测试。
我用阿拉伯语短语“这是一个测试”- هذا اختبار。
看起来ajax.php代码正常工作。在插入数据库后,它返回UTF-8编码的值,看起来像:“\u0647\u0630\u0627 \u0627\u062e\u062a\u0628\u0627\u0631”,并且编码设置为:“UTF-8”,但是在我的数据库表中插入的数据显示为:هذا اختبار。
那么为什么我不立即将我的数据库表转换为不同的排序方式?有几个原因:它有近50万条记录,并且当我转到执行非常类似的INSERT的另一页时,它实际上可以正常工作。
结果发现,我在其他页面上插入数据时使用ASCII编码。因此,我尝试在ajax.php中转换为ASCII是很自然的选择。然而,我最终得到了空白数据的问题。我现在非常困惑...
谢谢
已解决:根据一些线索,我最终重写了此页面的所有函数为PDO,它奏效了!
mysql_*
接口。请转换为PDO或mysqli_*。 - Rick James