我在wamp环境下 使用phpcms的代码的基础上
完全使用plain old php 代码写一个方法,向它的数据库插入一个中文数据
是乱码,而且和我在自己之前单独配置的php环境中的乱码是一致的
但是我完全使用phpcms的方法向同样的数据库表中写入中文,就不是乱码
/* * 20151202自己添加的方法用以确认编码问题的原因 */ public function testsql(){ include $this->admin_tpl('testsql'); echo 'hi'; } /** * 数据链接 */ public function dbconnect(){ if(!$this->link = mysql_connect('localhost', 'root','', 1)) { //$this->tempshow(LLS('tempdbnc'),$_SERVER['HTTP_REFERER']); return false; } echo '-----'; $serverset = "character_set_connection='utf-8',character_set_results='utf-8',character_set_client=binary"; mysql_query("SET $serverset", $this->link); if(!mysql_select_db('phpcmsv9', $this->link)) { //$this->tempshow(LLS('tempdbsdbw'),$_SERVER['HTTP_REFERER']); return false; } return $this->link; } // public function testsqlre(){ $this->testdb = pc_base::load_model('testsql'); $str1="北新道"; //$str2="加州"; //$str3="马里布"; //$this->testdb->insert(array('SN'=>3,'STEXT'=>$str1,'SCON'=>$str2,'SHORT'=>$str3)); //$this->testdb->insert(array('SN'=>3,'STEXT'=>'美国','SCON'=>'纽约','SHORT'=>'曼哈顿')); $this->testdb->insert(array('SN'=>3,'STEXT'=>$str1)); //$teststr1 = $this->testdb->get_one(array('SN'=>3)); //echo 'loading '.$teststr1['STEXT']; } public function testsqlre2(){ $link = $this->dbconnect(); $sqlstr = 'insert into v9_testl(SN,STEXT) values(7,\'中国\')'; $this->lastqueryid = mysql_query($sqlstr); //$this->testdb = pc_base::load_model('testsql'); //$str1="本州"; //$this->testdb->insert(array('SN'=>8,'STEXT'=>$str1)); echo 'loading '; }因此初步判断,乱码问题,与数据库的设置关系有限
至少和代码本身的设置有重大关系
下面准备这样测试
在我自身的php环境中,使用phpcms的方法进行写入操作,看结果是否能够正确插入中文
重新确认了自己写的php代码 如下,使用了phpcms写的方法,但是读出自身数据库的内容仍旧是???这种乱码
public function testsqlre(){ $this->db = pub_entry::load_model('roster_model'); $r = $this->db->get_one(array('SN'=>162)); echo $r['OTEXT']; echo '<br>-----------------------<br>';
1.用wamp的phpcms去读取我自己搭建的数据库
2.用我自己php环境中的代码去读取phpcms中的数据库
假如1中能够读出正确的中文,则证明完全是代码的问题。否则,完全是数据库的配置问题。
假如2中能读出正确的中文,则证明代码没有问题(我现在觉得这种可能性比较小)。否则,就是代码的问题
在测试之前,我认为,我自己的代码,有问题,编码的问题。
12月3日测试
使用单独的mysql+apache环境下部署的phpcms中,使用其自身的方法,插入中文,是正常的
与我之前的测试对比
我在同样的环境下自己用eclipse创建的php工程中,使用phpcms的方法插入中文,就是乱码
现在我已经能极大程度的确认,问题在于我之前代码的编码问题,如果我从新写,应该就不会再出现了。
为了能够完全确认,我下面要使用自己的代码在phpcms中插入中文
用自己的php代码插入中文,遇到了同样的乱码问题 比如 中 这个字显示为 ä¸
现在可以确认 1.我之前php代码的文档编码有问题,2我的语法也有问题
至于问题在哪里,需要进一步确认
目前已经找到了我自身代码的问题:
/** * 数据链接 */ public function dbconnect(){ if(!$this->link = mysql_connect('localhost:****', '****','****', 1)) { return false; } $serverset = "character_set_connection='utf8',character_set_results='utf8',character_set_client=binary"; $serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',')." sql_mode='' ") : ''; $serverset && mysql_query("SET $serverset", $this->link); mysql_query("SET $serverset", $this->link); if(!mysql_select_db('phpcmsv99', $this->link)) { return false; } return $this->link; }
之前我将其中设置字符集charset的字符串写错了,如下:
$serverset = "character_set_connection='utf-8',character_set_results='utf-8',character_set_client=binary";
其中有三个变量
character_set_connection
character_set_results
character_set_client
我在另一个网页上获取了如下说明:
在连接数据库之后,读取数据之前,先执行一项查询“SET NAMES UTF8”,即在PHP里为
mysql_query("SET NAMES UTF8");
查阅手册,上面那句等于:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
看看这3个变量的作用:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,破坏性的。
“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。
--------引用结束---------------
目前的结果是:我的代码出错,错在没有在数据库建立链接的过程中,告知mysql自己代码使用的字符集是utf-8
现在我将在自己的php工程上修正这一错误,看看是否能够正确的写入和读取
经过测试,我自己的代码可以正常写入 也可以正常读取 数据库中的中文
我读取的方法如下:
/** * 读数据并显示 */ public function testsqlre(){ /* $this->db = pub_entry::load_model('roster_model'); $r = $this->db->get_one(array('SN'=>160)); echo $r['OTEXT'].'-----'.$r['OTYPE']; echo '<br>-----------------------<br>'; */ $sqltext = (isset($_POST['sqltext'])&& $_POST['sqltext'] ) ? trim($_POST['sqltext']) : $this->tempshow(LLS('no_sql'),$_SERVER['HTTP_REFERER']); $link =$this->dbconnect(); $this->lastqueryid = mysql_query($sqltext) or $this->tempshow(LLS('tempdbsqlmis'),$_SERVER['HTTP_REFERER']); if(!$this->lastqueryid) { echo 'not ok'; }else{ echo 'OK-----'; } $datalist = array(); while(($rs = mysql_fetch_array($this->lastqueryid, MYSQL_ASSOC)) != false) { $datalist[] = $rs; } if(is_resource($this->lastqueryid)) { mysql_free_result($this->lastqueryid); $this->lastqueryid = null; } echo '<br>测试的数据是: '.$datalist[0]['OTEXT']; $str1a = mb_detect_encoding($datalist[0]['OTEXT']); echo '<br>数据的编码是: '.$str1a.'<br>----'; }
我的总结如下:
1.我的错误是 php代码错误,与mysql的设置、代码文档本身的编码无关
2.学习了什么是charset和Encoding
3.最初我认为phpmyadmin的编码是否相关,被证明也是无关的