PHP+MYSQL 出现乱码问号的解决方法

 更新时间:2016年11月25日 16:35  点击:1424
php与mysql密码多半与php是没有任何关系了,这个我们只要把页面与mysql编码进行处理即可解决乱码问题,乱码也只是中文会乱码了。

使用PHP+MYSQL时遇到过字符乱问题,解决方法:

在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码,对于GBK的数据库则使用SET NAMES GBK,代码如下:

 代码如下 复制代码

1 $mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
2 mysql_query("SET NAMES 'GBK'");

数据库字符集为utf-8

连接语句用这个
 

 代码如下 复制代码
1 mysql_query("SET NAMES 'UTF8'");
2 mysql_query("SET CHARACTER SET UTF8");
3 mysql_query("SET CHARACTER_SET_RESULTS=UTF8'");


下面是一些常见的错误情况与解决:

1、数据库采用UTF8编码,而页面申明编码是GB2312,这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是乱码,需要在查询前先使用: mysql_query("SET NAMES GBK"); 来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。如果页面是UTF-8编码的话,可以用: mysql_query("SET NAMES UTF8");
注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。

注:事实上MYSQL的数据输入输出比上面讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默认编码,分别是[client]里的default -character-set和[mysqld]里的default-character-set来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么编码的,而不是采用默认编码。

2、页面申明编码与文件本身编码不一致,这种情况很少发生,因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一些小BUG,以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件,比如CuteFTP,由于软件编码配置错误而导致转换错了编码。

3、一些租用虚拟主机的朋友,明明上述3项编码都设置正确了还是有乱码。比方说网页是GB2312编码的,IE等浏览器打开却总是识别成UTF-8,网页HEAD里面已经申明是GB2312了,手动修改浏览器编码为GB2312 后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码,在httpd.conf里面加了AddDefaultCharset UTF-8。这时候服务器会首先发送HTTP头给浏览器,其优先级比页面里申明编码高,自然浏览器就识别错了。解决办法有2个,请管理员在配置文件自己的虚机里加上一条AddDefaultCharset GB2312来覆盖全局配置,或者在自己目录的.htaccess里配置。

excel导入mysql数据库我整理了两种办法,一种就是使用PHP-ExcelReader来导入,另一种是把excel转换成csv文件直接使用php相关函数导入即可。

昨晚一个客户联系我做网站,提出的要求是需要把客户提供的excel文件里面的数据导入到mysql数据库,最常用的方法就是先把xls文件导出为csv格式的文件,然后在解析csv格式的文件导入到mysql数据库。方法比较冗余,而且分好几步进行,很不方便,断桥残雪今天介绍一种方法是直接跳过csv的中间环节,直接把excel文件导入mysql数据库。

首先我们需要下载PHP-ExcelReader这是一个开源的项目,主要是来解析excel的文件,下载地址:http://sourceforge.net/projects/phpexcelreader,下载之后解压,主要用到excel文件夹里面的两个文件reader.php和oleread.php(这个文件默认的是oleread.inc,不清楚为啥,一堆e文,没看,直接改名即可)。

在reader.php文件中找到以下类似代码(第一行既是),改成正确的oleread.php路径即可:require_once 'oleread.php';

然后新建一个php文件引入reader.php,代码如下:

 代码如下 复制代码

<?php
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('gbk');//此处设置编码,一般都是gbk模式

$data->read('Book1.xls');//文件路径111cn.net

error_reporting(E_ALL ^ E_NOTICE);
//这里我就只循环输出excel文件的内容了,要入库,只要把输出的地方,写一段mysql语句即可~
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
 for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
  echo """.$data->sheets[0]['cells'][$i][$j]."",";
 }
 echo "n";
}
?>

注意:请不要使用PHP-ExcelReader压缩包里面的xls进行测试,断桥残雪发现,那个文件既是使用excel也打不开,所以是错误的。

断桥残雪使用上面的方法解析了一个1.4M的数据,都显示正常,所以大家可以放心使用

phpexcel比较费资源,不过并不是所有的excel都能读取 我们可以转换成csv来操作

首先确认你的数据库是什么编码的,以utf-8为例,
你首先打开excel 文件,然后保存,选择为另存为.csv文件。
然后用文本编辑器打开.csv文件,另存为utf-8的csv
然后你写php 可以使用php 的getcsv  打开(这样确保你有的字段中含有,而导致解析错误),然后把解析的结果导入到数据库中。


如果是csv格式的我就不必要这么麻烦了

 代码如下 复制代码


<?
//连接数据库文件 www.111cn.net
$connect=mysql_connect("localhost","admin","admin") or die("链接数据库失败!");
//连接数据库(test)
mysql_select_db("testcg",$connect) or die (mysql_error());

$temp=file("test.csv");//连接EXCEL文件,格式为了.csv
for ($i=0;$i <count($temp);$i++)
{
$string=explode(",",$temp[$i]);//通过循环得到EXCEL文件中每行记录的值
//将EXCEL文件中每行记录的值插入到数据库中
$q="insert into ceshi (name,num,dom) values('$string[0]','$string[1]','$string[2]');";
mysql_query($q) or die (mysql_error());

if (!mysql_error());
{
echo " 成功导入数据!";
}
echo $string[4]."n";
unset($string);
}
?>

在php中向mysql数据库保存数据方法最常用的两种是insert与update方法,下面我来给初学者介绍mysql数据保存方法。

PHP向MySQL数据库中写入数据有三个步骤:

1,PHP和MySQL建立连接关系
2,打开MySQL数据库
3,接受页面数据,PHP录入到指定的表中
1、2两步可直接使用一个数据库链接文件即可:conn.php

 代码如下 复制代码

<?php
mysql_connect("localhost","root","");//连接MySQL
mysql_select_db("mythroad");//选择数据库
?>

当然,前提是已经安装WEB服务器、PHP和MySQL,并且建立MySQL表“mythroad”
mysql_connect()中三个参数分别为MySQL地址、MySQL用户名和MySQL密码
然后就是通过WEB页面传递数据,让PHP通过SQL语句将数据写入MySQL数据库指定的表中,比如新建文件
post.php

 代码如下 复制代码

<?php
require_once("conn.php");//引用数据库链接文件
$uname = $_GET['n'];//GET方法为URL参数传递
$pwd = $_GET['p'];
$pwd =md5($pwd );//直接使用MD5加密
$sql = "insert into mythroad(username,password) values ('$uname','$pwd')";
mysql_query($sql);//借SQL语句插入数据
mysql_close();//关闭MySQL连接
echo "成功录入数据";
?>

测试页面: http://127.0.0.1/post.php?n=mythroad&p=mythroad
即可向MySQL数据库hello的members表中插入新的数据“mythroad”到username字段、“mythroad”到password字段

如果使用表单post 我们可以利用post接受,下面看update更新数据

例子:

 代码如下 复制代码

<?php
$conn = @mysql_connect("localhost","root","root123");
if (!$conn){
    die("连接数据库失败:" . mysql_error());
}

mysql_select_db("test", $conn);
mysql_query("set names 'gbk'");

$sql = "UPDATE user SET email = 'xiaoming@163.com' WHERE username = '小明'";
if(mysql_query($sql,$conn)){
    echo "更新数据成功!";
} else {
    echo "更新数据失败:".mysql_error();
}
?>

把mysql数据库中的内容导出到excel我们只要利用header输出csv格式文档就可以简单实现mysql导出excel文件了,下面我们一起来看个实例。

核心代码就是这里了

 代码如下 复制代码

header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=".$title .".xls ");
header("Content-Transfer-Encoding: binary ");

以下是用php将数据库导出成excel,测试完全成功

 代码如下 复制代码

<?php   
$DB_Server = "localhost";     
$DB_Username = "root";     
$DB_Password = www.111cn.net;     
$DB_DBName = "ishop";     
$DB_TBLName = "oi_mall_payment";     
    
$savename = date("YmjHis");  
$Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password) or die("Couldn't connect.");     
mysql_query("Set Names 'gbk'"); 
$file_type = "vnd.ms-excel";     
$file_ending = "xls"; 
header("Content-Type: application/$file_type;charset=big5");  
header("Content-Disposition: attachment; filename=".$savename.".$file_ending");     
//header("Pragma: no-cache");        
    
$now_date = date("Y-m-j H:i:s");      
$title = "数据库名:$DB_DBName,数据表:$DB_TBLName,备份日期:$now_date";      
    
$sql = "Select * from $DB_TBLName";      
$ALT_Db = @mysql_select_db($DB_DBName, $Connect) or die("Couldn't select database");     
$result = @mysql_query($sql,$Connect) or die(mysql_error());   
    
echo("$titlen");      
$sep = "t";      
for ($i = 0; $i < mysql_num_fields($result); $i++) { 
    echo mysql_field_name($result,$i) . "t";      
}      
print("n");      
$i = 0;      
while($row = mysql_fetch_row($result)) {      
    $schema_insert = ""; 
    for($j=0; $j<mysql_num_fields($result);$j++) {      
        if(!isset($row[$j]))      
            $schema_insert .= "NULL".$sep;      
        elseif ($row[$j] != "")      
            $schema_insert .= "$row[$j]".$sep; 
        else      
            $schema_insert .= "".$sep;      
    }      
    $schema_insert = str_replace($sep."$", "", $schema_insert);      
    $schema_insert .= "t";      
    print(trim($schema_insert));      
    print "n";      
    $i++;      
}      
return (true);   
?>

一个不错的利用php把mysql数据库备份导出成sql示例,希望对大家会有所帮助。

用php代码实现数据库备份可以使网站的管理变得非常便捷,我们可以直接进后台操作就能完成数据库的备份。
关键技术:

1. 首先要得到该数据库中有哪些表,所用函数 mysql_list_tables(),然后可以将获取的所有表名存到一个数组。

2. show create table 表名 可以获取表结构。

3. select * from 表名 取出所有记录,用循环拼接成 insert into... 语句。

功能截图:

 

php导出sql


导出成的sql语句效果

 

具体代码:

 代码如下 复制代码

<?php

 

 header("Content-type:text/html;charset=utf-8");

 

 //配置信息

 $cfg_dbhost = 'localhost';

 $cfg_dbname = 'ftdm';

 $cfg_dbuser = 'root';

 $cfg_dbpwd = 'root';

 $cfg_db_language = 'utf8';

 $to_file_name = "ftdm.sql";

 // END 配置

 


 //链接数据库

 $link = mysql_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd);

 mysql_select_db($cfg_dbname);

 //选择编码

 mysql_query("set names ".$cfg_db_language);

 //数据库中有哪些表

 $tables = mysql_list_tables($cfg_dbname);

 //将这些表记录到一个数组

 $tabList = array();

 while($row = mysql_fetch_row($tables)){

  $tabList[] = $row[0];

 }

 

 echo "运行中,请耐心等待...<br/>";

 $info = "-- ----------------------------rn";

 $info .= "-- 日期:".date("Y-m-d H:i:s",time())."rn";

 $info .= "-- Power by 代潇瑞博客(http://www.daixiaorui.com/read/34.html)rn";

 $info .= "-- 仅用于测试和学习,本程序不适合处理超大量数据rn";

 $info .= "-- ----------------------------rnrn";

 file_put_contents($to_file_name,$info,FILE_APPEND);

 


 //将每个表的表结构导出到文件

 foreach($tabList as $val){

  $sql = "show create table ".$val;

  $res = mysql_query($sql,$link);

  $row = mysql_fetch_array($res);

  $info = "-- ----------------------------rn";

  $info .= "-- Table structure for `".$val."`rn";

  $info .= "-- ----------------------------rn";

  $info .= "DROP TABLE IF EXISTS `".$val."`;rn";

  $sqlStr = $info.$row[1].";rnrn";

  //追加到文件

  file_put_contents($to_file_name,$sqlStr,FILE_APPEND);

  //释放资源

  mysql_free_result($res);

 }

 


 //将每个表的数据导出到文件

 foreach($tabList as $val){

  $sql = "select * from ".$val;

  $res = mysql_query($sql,$link);

  //如果表中没有数据,则继续下一张表

  if(mysql_num_rows($res)<1) continue;

  //

  $info = "-- ----------------------------rn";

  $info .= "-- Records for `".$val."`rn";

  $info .= "-- ----------------------------rn";

  file_put_contents($to_file_name,$info,FILE_APPEND);

  //读取数据

  while($row = mysql_fetch_row($res)){

   $sqlStr = "INSERT INTO `".$val."` VALUES (";

   foreach($row as $zd){

    $sqlStr .= "'".$zd."', ";

   }

   //去掉最后一个逗号和空格

   $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);

   $sqlStr .= ");rn";

   file_put_contents($to_file_name,$sqlStr,FILE_APPEND);

  }

  //释放资源

  mysql_free_result($res);

  file_put_contents($to_file_name,"rn",FILE_APPEND);

 }

 

 echo "OK!";

 

?>

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • IE6-IE9中tbody的innerHTML不能赋值的解决方法

    IE6-IE9中tbody的innerHTML不能赋值,重现代码如下 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>IE6-IE9中tbody的innerHTML不能复制bug</title> </head> <body style="height:3...2014-06-07
  • MySQL ERROR 2013 (HY000)错误解决方法

    当通过 TCP/IP 连接 MySQL 远程主机时,出现 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104 。如果是在linux shell命令行中直接打 mysql 命令,...2015-03-15
  • Mysql修改datadir导致无法启动问题解决方法

    centos6.2,停止mysqld然后修改/etc/my.cnf datadir的位置,启动mysqld提示FAILED,查看日志 复制代码 代码如下: 120609 11:31:31 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 120609 11:35:12 my...2015-03-15
  • Photoshop提示“此产品的许可证已过期"及“无法开始您的Adobe Photoshop CS5.1 订阅”解决方法

    首先不要鄙视我用Photoshop盗版,实在是贵。现在我们来看看如果你的Photoshop提示“此产品的许可证已过期",还有“无法开始您的Adobe Photoshop CS5.1 订阅”如何解决吧...2016-09-14
  • 小米解锁验证失败怎么办 小米解锁工具登录失败解决方法

    小米手机如果想要刷机就必须要先解锁验证才可以,那么,如果遇到小米解锁验证失败以及小米解锁工具登录失败的现象怎么办呢?对此,本文就为大家进行解答,有需要的朋友来看看。...2016-12-21
  • photoshop字体显示乱码解决方法

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来详细的说一下软件的字体出现了乱码这一问题的解决方法,那么各位有出现这个问题的,下面就来跟着小编一起看...2016-09-14
  • 51安卓模拟器启动失败解决方法

    有部分小伙伴表示自己遇到了51模拟器程序不能打开的情况,那么51模拟器打不开怎么回事?下面我就来为大家分享一下解决的方法,有需要的小伙伴就来看一看吧。 &#8195;&...2017-07-06
  • CentOS下php使用127.0.0.1不能连接mysql的解决方法

    php代码很简单:复制代码 代码如下: $server="127.0.0.1"; println("Begin"); $link = mysql_connect($server,"mysql","mysql"); if (!$link) { die('Could not connect: ' . mysql_error().mysql_errno()); } lin...2015-03-15
  • mysql too many open connections问题解决方法

    曾经以为在my.cnf写入max_connections = 2000就可以改变mysql的最大并发量,今天查到一个命令,发现服务器的mysql最大连接数为151.控制台,连接上mysql复制代码 代码如下:show variables;这条命令可以看到所有基础配置如果...2014-05-31
  • PHP is_subclass_of函数的一个BUG和解决方法

    is_subclass_of的作用:复制代码 代码如下:bool is_subclass_of ( object object, string class_name )如果对象 object 所属类是类 class_name 的子类,则返回 TRUE,否则返回 FALSE。注: 自 PHP 5.0.3 起也可以用一个字符...2014-06-07
  • mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法

    这篇文章主要介绍了mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法,涉及MySQL语句的使用技巧,需要的朋友可以参考下...2016-01-15
  • Can't connect to MySQL server on 'localhost' (10048)问题解决方法

    解决Can't connect to MySQL server on 'localhost' (10048), 一般见于使用mysql的windows 2003服务器. 错误的出现的原因: 应用程序需要快速释放和创建新连接, 但是由于 TIME_WAIT 中存在的连接超过默认值,导致较...2013-10-04
  • PHPMailer在SAE上无法发送邮件的解决方法

    PHPMailer在SAE上无法发送邮件怎么回事呢,我们以前在php5.2.7版本中使用了PHPMailer是可以发,但移到sae中发现无法发邮件了,那么此问题如何解决 在SAE上直接用5.2.7...2016-11-25
  • 帝国CMS登录后台提示"您的Cookie没有开启,不能登陆成功"的解决方法

    如果没有动过文件特别是/e/config/config.php文件的话!请按照如下操作肯定就OK了! 到你的主机或者服务器环境里找到php.ini文件(如果不知道在哪联系你的空间商就行了) 找到如下...2016-05-19