乱码问题追踪php

我在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";

写错的结果就是,mysql不识别上述代码中的字符串'utf-8'  那么 执行的SET语句也就不会生效,也就是说,我的php代码与mysql对话时,未能预先设置好通信使用的字符集

其中有三个变量

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的编码是否相关,被证明也是无关的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值