快速解决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'"); |
这些方法都在php 连接mysql之前进行设置操作了,如例子
代码如下 | 复制代码 |
set_time_limit(0); |
这样就是设置我的页面与数据库统一编码了,是不是简单呀,那么如果是导入数据乱码解决办法不一样
linux系统中
linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题。
解决mysql导入导出数据乱码问题
首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8,
例如下面的代码:
mysqldump -uroot -p --default-character-set=utf8 dbname tablename > bak.sql
那么导入数据的时候也要使用--default-character-set=utf8:
mysql -uroot -p --default-character-set=utf8 dbname < bak.sql
这样统一编码就解决了mysql数据迁移中的乱码问题了
我使用windows作为导出数据源,并导入 freebsd环境下的mysql库
解决方法:
导出数据
一、首先在windows平台下mysql用作导出数据库源。查看字符编码的系统变量:
mysql> show variables like ‘%char%';
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | D:mysqlsharecharsets |
+————————–+—————————-+
查看character_set_database,这里是latin1,latin1是装不了多字节字符集的
二、在windows下设置系统变量为utf8
mysql>set character_set_database=utf8; ##设置默认的字符集为utf8
三、导出数据
mysql> select * from table into outfile ‘c:table.txt' where +条件
这时导出了我想要的部分数据,并以txt文件存在 table.txt中。
导入数据
在freebsd平台下
一、同样设置字符编码的系统变量
mysql> show variables like ‘%char%';
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
+————————–+—————————-+
mysql>set character_set_database=utf8; ##设置默认的字符集为utf8
二、转载数据
mysql>load data local infile ‘/home/table.txt' into table `table`;
至此、条件数据完整导入导出,并处理了乱码的情况。
总之,两台mysql服务器导入导出时,一定要确保两台服务器的character_set_database参数相同,这样才能防止一些 乱码的情况。当然我们还可以使用其他字符集,如gbk来进行调整。视情况操作了
附后,通用解决办法
方法一: 通过增加参数 –default-character-set = utf8 解决乱码问题
mysql -u root -p password < path_to_import_file –default-character-set = utf8
方法二: 在命令行导入乱码解决
1. use database_name;
2. set names utf8; (或其他需要的编码)
3. source example.sql (sql文件存放路径)
一般来说,如果并发量不大的情况,使不使用缓存技术并没有什么影响,但如果高并发的情况,使用缓存技术就显得很重要了,可以很好的减轻数据库和服务器的压力,当然解决高并发的技术有很多,这里只是以缓存的角度来说明使用memcache的便捷性和方便性,缓存技术中,与memcache类似的还有redis,这里不做介绍!
使用memcache的前提是需要在服务端先配置好memcahche的环境!确认memcahce可以正常连接之后就可以在程序使用了!
具体代码如下:
代码如下 | 复制代码 |
<?php |
看一下配置文件
代码如下 | 复制代码 |
<?php ), ), ), |
可以通过配置,非常方便修改,并一改全改,增删改。
2,html的jqgrid代码
代码如下 | 复制代码 |
jQuery("#goodsList").jqGrid({ url:'__APP__?m=Home&a=getList', datatype: "json", mtype: 'POST', colNames:['ID',<{$feildname}>,'修改时间','操作'], colModel:[ {name:'id',width:25,index:'id',setGridHeight:"auto"}, <{$feildmap}> {name:'lastdotime',sortable:true}, {name:'edit',search:false,sortable:false}, ], rowNum:10, rowList:[10,20,30], multiselect:true, //复选框 pager: '#goodsPager', sortname: 'lastdotime', viewrecords: true, sortorder: "desc", editurl:'__APP__?m=Home&a=oper',//添加修改操作url autowidth:true, height:'100%' }); |
3,三个比较重要的函数
代码如下 | 复制代码 |
<?php //获取字段名称 function feild_name($feild){ $fields = C($feild); $feild = ''; foreach($fields as $val){ $feild .="'".$val['name']."',"; } $feild = rtrim($feild,','); return $feild; } //获取字段字典 function feild_map($feild){ $fields = C($feild); $feildmap =''; foreach($fields as $key=>$val){ $feildmap .= '{name:\''.$key.'\',sortable:false,editable:true'; if(1==$val['hidden']){ $feildmap .=',hidedlg:true,hidden:true,editrules:{edithidden:true,'; }else{ $feildmap .= ',editrules:{'; } if(1==$val['required']){ $feildmap .='required:true}'; }else{ $feildmap .='required:false}'; } $feildmap .= '},'."\n"; } return $feildmap; } //获取字段列表 function feild_list($feild,$array=array(),$row=array()){ $row = json_decode($row['value'],true); $fields = C($feild); foreach($fields as $key=>$val){ switch($val['type']){ case 'url':$array[]='<a href="'.$row[$key].'" style="color:#0018D1" target="_blank">'.$row[$key].'</a>';break; case 'img':$array[]='<img src="'.$row[$key].'" width="60" />';break; default:$array[] = $row[$key]; } } return $array; } |
代码没有什么,就是通过json对象动态配置。
因为一直在使用 windows 下的 PHP 开发,用的是 mysql 数据库,偶尔也会遇到查询记录的乱码,那是因为 php 编码不支持中文进行导致的,直接将其进行编码解码即可解决,所以在 windows 平台下还是比较容易解决的。
今天在帮一个客户进行 liunx 下维护 mssql 数据库的操作,因站点被攻击的原因,一直无法进行打开站点,折腾了很久,终于连接上mssql了,今天来了尝试下查询,么问题!
可是出来的记录 中文 显示是?号或者就是一堆黑框框,这是典型的编码不对,于是查看了下php.ini关于mssql的这一块配置,发现有一项配置”mssql.charset”这一项,我配置成 “utf8”,成功解决乱码。
因为我的程序页面用的是utf8所以配置成这样,如果是GBK/GB2312 就配置长相应的编码就应该能解决,当然遇到这样的问题还是要看相应情况的,这里还是建议如果能修改配置文件尽可能的去修改配置文件,因为这样才能一劳永逸的解决掉问题。
例子
代码如下 | 复制代码 |
$serverName = "127.0.0.1,1433"; |
注意事项:
编码常用的是utf8-general-ci
不只是表要统一,要统一的总共有四处
一是:数据库类型,其中包括,数据库,表,字段三处都要统一,可以检查一下
二是:文件的编码类型,你若用dw或editplus可以查看页面编码,不同需修改
三是:访问数据库时的设置既set NAMES utf8;
四是:浏览器显示方式,添加meta属性<meta charset=utf-8>
不管用GBK,GB2312,这四处必须统一,看你缺少了哪一步
用PHP操作MSSQL比在ASP连接MYSQL要简单,所以,当需要MSSQL与MYSQL并存时,用PHP连接MSSQL来操作MYSQL与MSSQL并存比较简单好用.如果是ASP连接MYSQL,需要安装一个MYSQL驱动,默认windows的ODBC没有安装,很遗憾...
1.在web服务器上至少安装了mssql的客户端
2.打开php.ini把;extension=php_mssql.dll前面的分号去掉
有必要话:需要制定extension_dir
3.推荐使用php<=4.0.9<=5.0.3目前我还没有连接成功过4.010和5.0.3
4.数据库的连接分页可以到phpe.net上获取到相应的class
首先,两个函数都是用来处理数据库操作的。
mysqli 连接是永久连接,而mysql是非永久连接。
mysql连接每当第二次使用时,都会重新打开一个新的进程,而mysqli则只使用同一个进程,可以很大程度的减轻服务器端压力。
其次,mysqli封装了诸如事务等一些高级操作,同时封装了数据库操作过程中的很多可用的方法。
具体查看 http://cn.php.net/mysqli
在实际使用中,较多使用到mysqli的事务。
例子:
代码示例:
$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
$mysqli->commit();
echo 'ok';
}else{
echo 'err';
$mysqli->rollback();
}
第二部分,php中关于mysqli和mysql区别
php-mysql 是 php 操作 mysql 资料库最原始的 extension ,php-mysqli 的 i 代表 improvement ,提更了相对进阶的功能,就 extension 而言,本身也增加了安全性。而 pdo (php data object) 则是提供了一个 abstraction layer 来操作资料库。
例子:
代码示例:
<?php
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($dn_name);
$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'");
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo $row['name'];
}
mysql_free_result($result);
?>
这种方式不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string() 来解决这个问题,不过这麽一搞,整个叙述会变得?杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…
例子:
代码示例:
<?php
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
mysql_query($query);
?>
在 php-mysqli 中有了不少进步,除了透过 bind column 来解决上述问题,而且也多援 transaction, multi query ,并且同时提供了 object oriented style (下面这段 php-mysqli 范例的写法) 和 procedural style (上面 php-mysql 范例的写法)两种写法…等等。
例子:
代码示例:
<?php
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location);
$stmt->execute();
$stmt->bind_result($id, $name, $gender, $location);
while ($stmt->fetch())
{
echo $id . $name . $gender . $location;
}
$stmt->close();
$mysqli->close();
?>
但看到这边又发现了一些缺点,例如得 bind result,这个就有点多馀,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(abstraction)的方法,所以当后端更换资料库的时候,就是痛苦的开始…
于是 pdo 就出现了(备注:目前 ubuntu 和 debian 来说,pdo 并没有直接的套件可以安装,而是必须透过 pecl 安装)。
代码示例:
roga@carlisten-lx:~$ pecl search pdo
=======================================
Package Stable/(Latest) Local
PDO 1.0.3 (stable) PHP Data Objects Interface.
PDO_4D 0.3 (beta) PDO driver for 4D-SQL database
PDO_DBLIB 1.0 (stable) FreeTDS/Sybase/MSSQL driver for PDO
PDO_FIREBIRD 0.2 (beta) Firebird/InterBase 6 driver for PDO
PDO_IBM 1.3.2 (stable) PDO driver for IBM databases
PDO_INFORMIX 1.2.6 (stable) PDO driver for IBM Informix INFORMIX databases
PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO
PDO_OCI 1.0 (stable) Oracle Call Interface driver for PDO
PDO_ODBC 1.0.1 (stable) ODBC v3 Interface driver for PDO
PDO_PGSQL 1.0.2 (stable) PostgreSQL driver for PDO
PDO_SQLITE 1.0.1 (stable) SQLite v3 Interface driver for PDO
pdo_user 0.3.0 (beta) Userspace driver for PDO
当透过 pecl 安装装好后,就可以透过以下方式来操作资料库:
代码示例:
<?php
$dsn = "mysql:host=$db_host;dbname=$db_name";
$dbh = new PDO($dsn, $db_user, $db_password);
$sql = "SELECT `name`, `location` FROM `users` WHERE `location` = ? , `name` = ?";
$sth = $dbh->prepare($sql);
$sth->execute(array($location, $name));
$result = $sth->fetch(PDO::FETCH_OBJ);
echo $result->name . $result->location;
$dbh = NULL;
?>
乍看之下,pdo 的程式码好像也没有比较短,那到底好处是什麽呢?
1. pdo 连接资料库时透过 connection string 来决定连接何种资料库。
2. pdo 可以透过 pdo::setattribute 来决定连线时的设定,像是 persistent connection, 回传错误的方式(exception, e_warning, null)。甚至是回传栏位名称的大小写…等等。
2. pdo 支援 bind column 的功能,除了基本的 prepare, execute 以外,也可以 bind 单一栏位,并且指定栏位型态。
4. pdo 是 abstraction layer 所以就算更换储存媒介,需要花的功夫比起来是最少的。
可惜的是,??管这些东西都已经出现很久了,但还是不够大众化。我想或许是肇因于大家习惯看坊间的书籍学习,但那些书本往往只会介绍最简单最传统的方式。导致很多人还是在用 mysql 这种方直接连资料库。
最喜爱透过 dbi 来连接资料库,像是 activerecord 以及 propel orm(object-relational mapping)。
例如说以 activerecord 为例,如果要实现这样的 sql 叙述…
insert into `users` (id, name, gender, location) values(1, 'roga', 'male', 'tpe')
以 pdo 来写是:
代码示例:
<?php
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES(?, ?, ?, ?)";
$sth = $dbh->prepare($sql);
$sth->execute(array(1, 'roga', 'male', 'tpe'));
?>
但以 ActiveRecord 来说的话,则是:
代码示例:
<?php
$user = new User();
$user->id = 1;
$user->name = 'roga';
$user->gender = 'male';
$user->location = 'tpe';
$user->save();
?>
后者在语法上是不是简洁很多呢,而且也大幅降低对 SQL 语言的依赖性!(不同资料库对 SQL 实作的问题可参考 Comparison of different SQL implementations)
以上是一些简单的介绍,如有疏漏谬误也欢迎大家补充。
mysql是非持继连接函数而mysqli是永远连接函数。也就是说
mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销
有些朋友在编程的时候,使用new mysqli('localhost', usenamer', 'password', 'databasename');总是报
错,Fatal error: Class 'mysqli' not found in d:...
mysqli类不是php自带的吗?
不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。
一:Mysqli.dll是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易。这里就几个常见的操作和 mysql.dll做一个对比。
1、mysql.dll(可以理解为函数式的方式):
代码示例:
$conn = mysql_connect('localhost', 'user', 'password'); //连接mysql数据库
mysql_select_db('data_base'); //选择数据库
$result = mysql_query('select * from data_base');//这里有第二个可选参数,指定打开的连接
$row = mysql_fetch_row( $result ) ) //为了简单,这里只取一行数据
echo $row[0]; //输出第一个字段的值
mysqli也有过程式的方式,只不过开始贯以mysqli的前缀,其他都差不多。如果mysqli以过程式的方式操作的话, 有些函数必须指定资源,比如说 mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而 mysql_query(SQL语句,'可选')的资源标识是放在后面的,并且可以不指定,它默认是上一个打开的连接或资源。
2、mysqli.dll(对象方式):
代码示例:
$conn = new mysqli('localhost', 'user', 'password','data_base');
//这里的连接是new出来的,最后一个参数是直接指定数据库,不用mysql_select_db()了
//也可以构造时候不指定,然后 $conn -> select_db('data_base')
$result = $conn -> query( 'select * from data_base' );
$row = $result -> fetch_row(); //取一行数据
echo row[0]; //输出第一个字段的值
二、mysql_fetch_row(),mysql_fetch_array()
这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能$row[0],
$row[1],这样以数组下标来读取数据,而mysql_fetch_array()返回的数组既包含第一种,也包含键值
对的形式,可以这样读取数据,(假如数据库的字段是 username,passwd):
代码示例:
$row['username'], $row['passwd']
而且,如果用($row as $kay => $value)来操作的话,还以直接取得数据库的字段名称。
更主要的是mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快。
相关文章
php 中file_get_contents超时问题的解决方法
file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
- 最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法
手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21连接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-20MySQL 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-15IE6-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- 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
- 小米手机如果想要刷机就必须要先解锁验证才可以,那么,如果遇到小米解锁验证失败以及小米解锁工具登录失败的现象怎么办呢?对此,本文就为大家进行解答,有需要的朋友来看看。...2016-12-21
Photoshop提示“此产品的许可证已过期"及“无法开始您的Adobe Photoshop CS5.1 订阅”解决方法
首先不要鄙视我用Photoshop盗版,实在是贵。现在我们来看看如果你的Photoshop提示“此产品的许可证已过期",还有“无法开始您的Adobe Photoshop CS5.1 订阅”如何解决吧...2016-09-14- 今天小编在这里就来给各位photoshop的这一款软件的使用者们来详细的说一下软件的字体出现了乱码这一问题的解决方法,那么各位有出现这个问题的,下面就来跟着小编一起看...2016-09-14
- 有部分小伙伴表示自己遇到了51模拟器程序不能打开的情况,那么51模拟器打不开怎么回事?下面我就来为大家分享一下解决的方法,有需要的小伙伴就来看一看吧。  &...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-15PHP 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-07mysql too many open connections问题解决方法
曾经以为在my.cnf写入max_connections = 2000就可以改变mysql的最大并发量,今天查到一个命令,发现服务器的mysql最大连接数为151.控制台,连接上mysql复制代码 代码如下:show variables;这条命令可以看到所有基础配置如果...2014-05-31mysql报错: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-15Can'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上无法发送邮件怎么回事呢,我们以前在php5.2.7版本中使用了PHPMailer是可以发,但移到sae中发现无法发邮件了,那么此问题如何解决 在SAE上直接用5.2.7...2016-11-25
帝国CMS登录后台提示"您的Cookie没有开启,不能登陆成功"的解决方法
如果没有动过文件特别是/e/config/config.php文件的话!请按照如下操作肯定就OK了! 到你的主机或者服务器环境里找到php.ini文件(如果不知道在哪联系你的空间商就行了) 找到如下...2016-05-19