ajax表单传值中文,存入mysql数据库老是乱码

时间:2021-02-20 06:39:29
我的页面、数据库全部是utf编码的,为什么ajax表单传值,存入mysql数据库老是乱码呢?

  var n=$.trim($("#n").val()); // 中文
  var p=$.trim($("#p").val()); 
  var a=$.trim($("#a").val()); // 中文

          $.ajax({
  type: "POST",
  url: 'a1.php',   
  data: {val:x,n:encodeURL(encodeURL(n)),p:p,a:encodeURL(encodeURL(a))},  
  success: function(result) {
  $("#UserResult").html(result); 
  }
  });


a1.php:

<?php
header("Content-Type:text/html;charset=utf-8");
...
 $data1=array("i"=>$x,"n"=> iconv("gb2312","utf-8",urldecode($_POST['n']),"p"=>$_POST['p'], iconv("gb2312","utf-8",urldecode("a"=>$_POST['a'])); 
  $b = $user_record->insert($data1);   


试了以下方法都不行,
https://segmentfault.com/a/1190000003020776
http://www.shangxueba.com/jingyan/1918886.html
https://segmentfault.com/a/1190000004013109
http://blog.163.com/yangyan6032@126/blog/static/1218798372011010644180/
http://blog.163.com/yangyan6032@126/blog/static/1218798372011010644180/
https://zhidao.baidu.com/question/307106340656196244.html?qbl=relate_question_3&word=php%20decodeURI
到底该怎么办呢?请不吝赐教!

25 个解决方案

#1


本帖最后由 xuzuning 于 2016-11-09 18:56:57 编辑
ajax 不可能提交 gbk 编码的数据
不出意外的话,ajax 提交的数据一定是 utf-8 的
你至多在连接数据库后执行一下  set names utf8 指令,通知 MySQL 将用 utf-8 字符集交换数据

#2


入库之前增加一句
mysql_query("set names utf8");

#3


引用 2 楼 fdipzone 的回复:
入库之前增加一句
mysql_query("set names utf8");


谢谢!现在已经加入这句代码了,但是存入数据库的中文还是变成 ?? (不加编码、解码函数) 或 %E9%99%88 (加编码函数encodeURI(encodeURI()) 和解码函数 urldecode() )

#4


看下插入前的编码和数据库的编码一致吗?

#5


引用 4 楼 u012462876 的回复:
看下插入前的编码和数据库的编码一致吗?


所有页面、数据库表 全部都是UTF-8编码的,检查了N遍了,所以才觉得奇怪!

#6


入库之前增加了一句 mysql_query("set names utf8");
那么出库前也要加 mysql_query("set names utf8");

#7


引用 6 楼 xuzuning 的回复:
入库之前增加了一句 mysql_query("set names utf8");
那么出库前也要加 mysql_query("set names utf8");


谢谢!现在select update insert 函数里,前面都加上这句了,

$e = mb_detect_encoding($arr[0]['name'], array('UTF-8', 'GBK'));
echo $arr[0]['name'] . $e;

还是打印出 ?UTF-8

#8


你的 $arr[0]['name'] 在哪里赋值的?
你怎么就知道是 gbk 编码的?

如果真是 gbk 编码的,那么怎么可能在 mysql_query("set names utf8") 之后产生呢?

#9


引用 8 楼 xuzuning 的回复:
你的 $arr[0]['name'] 在哪里赋值的?
你怎么就知道是 gbk 编码的?

如果真是 gbk 编码的,那么怎么可能在 mysql_query("set names utf8") 之后产生呢?


我始终觉得应该都是utf-8编码才对,不知道为什么存入数据库会变成乱码,所以我才用尽各种办法瞎折腾一气!
从数据库取出来的中文再回填到数据库,那就不会乱码。

#10


你主贴中的 $data1=array("i"=>$x,"n"=> iconv("gb2312","utf-8",urldecode($_POST['n']),"p"=>$_POST['p'], iconv("gb2312","utf-8",urldecode("a"=>$_POST['a'])); 
 是什么意思?
ajax 总是以 utf-8 编码传送数据,你为何有 iconv("gb2312","utf-8" ... 将传入的数据当成 gbk 的?

#11


引用 8 楼 xuzuning 的回复:
你的 $arr[0]['name'] 在哪里赋值的?



$data1=array("o"=>$o,"p"=>$x,"name"=>$_POST['nm'],"p"=>$_POST['p'],"a"=>$_POST['a']); 
$b = $user_record->insert($data1);
$arr = $user_record->select("o='".$o."' order by id desc","name");
$e = mb_detect_encoding($arr[0]['name'], array('UTF-8', 'GBK'));

#12


你直接 print_r($arr); 打印出 $arr 看看

#13


引用 12 楼 xuzuning 的回复:
你直接 print_r($arr); 打印出 $arr 看看


谢谢回复!这个函数是ajax调用的,没法这么打印的吧? 我打印到日志文件,只有显示 arr 这三个字符!

#14


好可怜哦,调试都不会
php:
file_put_contents('test.txt', print_r($arr, 1));
js:
alert(result)

#15


引用 14 楼 xuzuning 的回复:
好可怜哦,调试都不会
php:
file_put_contents('test.txt', print_r($arr, 1));
js:
alert(result)


打印的 test.txt 内容:
Array
(
    [0] => Array
        (
            [name] => ?
        )

    [1] => Array
        (
            [name] => 
        )

    [2] => Array
        (
            [name] => 
        )

    [3] => Array
        (
            [name] => 
        )
)

#16


那么好了,你从数据库里读出的就是一个问号
那以后再怎么处理也都还是一个问号

你到数据库里去看看对应的是什么

#17


因为这个表的这个name字段是我新加的,所以之前的记录 name 的值是空串!

#18


引用 16 楼 xuzuning 的回复:
那么好了,你从数据库里读出的就是一个问号
那以后再怎么处理也都还是一个问号

你到数据库里去看看对应的是什么


谢谢!数据库里看就是两个问号啊!还要看什么呢?

#19


数据库里看到的就是问号?
那就是你插入的时候就不对了

先贴出表结构看看

#20


这难题真把我难住了,搞了两天了还没结果,救救我吧!再支支招呗!

#21


引用 19 楼 xuzuning 的回复:
数据库里看到的就是问号?
那就是你插入的时候就不对了

先贴出表结构看看


ajax表单传值中文,存入mysql数据库老是乱码

ajax表单传值中文,存入mysql数据库老是乱码

#22


我要看到细节(包括建表指令)
你的字符集选的不对!

#23


引用 22 楼 xuzuning 的回复:
我要看到细节(包括建表指令)
你的字符集选的不对!


谢谢!但我不知道建表指令在哪里看,这个数据表之前就已经建好了的,我接手别人的工作。是从一个SQL文件导入数据库的。
。。。晕啊,它原来的编码是latin1 后来我建了个新的UTF-8表,把它导进来。然后新建了name字段。


CREATE TABLE `r` (
...
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

#24


这样的话,代码该怎么写才能使存入数据库的中文不乱码呢?
数据表原来latin1,现在utf-8 。。。 我都被转晕了!

#25


把ENGINE=InnoDB DEFAULT CHARSET=latin1;改为ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
重新导入数据库,O了,谢谢大家,谢谢斑竹!

#1


本帖最后由 xuzuning 于 2016-11-09 18:56:57 编辑
ajax 不可能提交 gbk 编码的数据
不出意外的话,ajax 提交的数据一定是 utf-8 的
你至多在连接数据库后执行一下  set names utf8 指令,通知 MySQL 将用 utf-8 字符集交换数据

#2


入库之前增加一句
mysql_query("set names utf8");

#3


引用 2 楼 fdipzone 的回复:
入库之前增加一句
mysql_query("set names utf8");


谢谢!现在已经加入这句代码了,但是存入数据库的中文还是变成 ?? (不加编码、解码函数) 或 %E9%99%88 (加编码函数encodeURI(encodeURI()) 和解码函数 urldecode() )

#4


看下插入前的编码和数据库的编码一致吗?

#5


引用 4 楼 u012462876 的回复:
看下插入前的编码和数据库的编码一致吗?


所有页面、数据库表 全部都是UTF-8编码的,检查了N遍了,所以才觉得奇怪!

#6


入库之前增加了一句 mysql_query("set names utf8");
那么出库前也要加 mysql_query("set names utf8");

#7


引用 6 楼 xuzuning 的回复:
入库之前增加了一句 mysql_query("set names utf8");
那么出库前也要加 mysql_query("set names utf8");


谢谢!现在select update insert 函数里,前面都加上这句了,

$e = mb_detect_encoding($arr[0]['name'], array('UTF-8', 'GBK'));
echo $arr[0]['name'] . $e;

还是打印出 ?UTF-8

#8


你的 $arr[0]['name'] 在哪里赋值的?
你怎么就知道是 gbk 编码的?

如果真是 gbk 编码的,那么怎么可能在 mysql_query("set names utf8") 之后产生呢?

#9


引用 8 楼 xuzuning 的回复:
你的 $arr[0]['name'] 在哪里赋值的?
你怎么就知道是 gbk 编码的?

如果真是 gbk 编码的,那么怎么可能在 mysql_query("set names utf8") 之后产生呢?


我始终觉得应该都是utf-8编码才对,不知道为什么存入数据库会变成乱码,所以我才用尽各种办法瞎折腾一气!
从数据库取出来的中文再回填到数据库,那就不会乱码。

#10


你主贴中的 $data1=array("i"=>$x,"n"=> iconv("gb2312","utf-8",urldecode($_POST['n']),"p"=>$_POST['p'], iconv("gb2312","utf-8",urldecode("a"=>$_POST['a'])); 
 是什么意思?
ajax 总是以 utf-8 编码传送数据,你为何有 iconv("gb2312","utf-8" ... 将传入的数据当成 gbk 的?

#11


引用 8 楼 xuzuning 的回复:
你的 $arr[0]['name'] 在哪里赋值的?



$data1=array("o"=>$o,"p"=>$x,"name"=>$_POST['nm'],"p"=>$_POST['p'],"a"=>$_POST['a']); 
$b = $user_record->insert($data1);
$arr = $user_record->select("o='".$o."' order by id desc","name");
$e = mb_detect_encoding($arr[0]['name'], array('UTF-8', 'GBK'));

#12


你直接 print_r($arr); 打印出 $arr 看看

#13


引用 12 楼 xuzuning 的回复:
你直接 print_r($arr); 打印出 $arr 看看


谢谢回复!这个函数是ajax调用的,没法这么打印的吧? 我打印到日志文件,只有显示 arr 这三个字符!

#14


好可怜哦,调试都不会
php:
file_put_contents('test.txt', print_r($arr, 1));
js:
alert(result)

#15


引用 14 楼 xuzuning 的回复:
好可怜哦,调试都不会
php:
file_put_contents('test.txt', print_r($arr, 1));
js:
alert(result)


打印的 test.txt 内容:
Array
(
    [0] => Array
        (
            [name] => ?
        )

    [1] => Array
        (
            [name] => 
        )

    [2] => Array
        (
            [name] => 
        )

    [3] => Array
        (
            [name] => 
        )
)

#16


那么好了,你从数据库里读出的就是一个问号
那以后再怎么处理也都还是一个问号

你到数据库里去看看对应的是什么

#17


因为这个表的这个name字段是我新加的,所以之前的记录 name 的值是空串!

#18


引用 16 楼 xuzuning 的回复:
那么好了,你从数据库里读出的就是一个问号
那以后再怎么处理也都还是一个问号

你到数据库里去看看对应的是什么


谢谢!数据库里看就是两个问号啊!还要看什么呢?

#19


数据库里看到的就是问号?
那就是你插入的时候就不对了

先贴出表结构看看

#20


这难题真把我难住了,搞了两天了还没结果,救救我吧!再支支招呗!

#21


引用 19 楼 xuzuning 的回复:
数据库里看到的就是问号?
那就是你插入的时候就不对了

先贴出表结构看看


ajax表单传值中文,存入mysql数据库老是乱码

ajax表单传值中文,存入mysql数据库老是乱码

#22


我要看到细节(包括建表指令)
你的字符集选的不对!

#23


引用 22 楼 xuzuning 的回复:
我要看到细节(包括建表指令)
你的字符集选的不对!


谢谢!但我不知道建表指令在哪里看,这个数据表之前就已经建好了的,我接手别人的工作。是从一个SQL文件导入数据库的。
。。。晕啊,它原来的编码是latin1 后来我建了个新的UTF-8表,把它导进来。然后新建了name字段。


CREATE TABLE `r` (
...
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

#24


这样的话,代码该怎么写才能使存入数据库的中文不乱码呢?
数据表原来latin1,现在utf-8 。。。 我都被转晕了!

#25


把ENGINE=InnoDB DEFAULT CHARSET=latin1;改为ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
重新导入数据库,O了,谢谢大家,谢谢斑竹!