PHP 解决mysql结果集转json后中文乱码

做了一个ajax的站,php后台处理完了数据库后,需要把结果以json数据的方式发到前端由js使用,编程这东西,编码总是会莫名其妙造成影响…

//$result是一个mysql查询的结果集
while($row = mysql_fetch_array($result)){
	foreach ( $row as $key => $value ) {  
		$row[$key] = urlencode ( $value );
	}  
	$urlencode_result[$i++]=$row;
}
$json = urldecode(json_encode($urlencode_result));

以上代码,首先把结果集中的每个值都urlencode来解决可能出现的编码问题,然后json_encode,把已经urlencode处理过的转成json数据,最后把json数据中被urlencode的数据恢复.

原理就是PHP的json_encode会把中文转成乱码,但是在json_encode前先urlencode,这样就没有中文了,转为json后没有问题,转换完,要用的时候在urldecode恢复中文数据.

你可能还需要看看PHP读取MYSQL数据后中文乱码的解决方法

PHP 查看上一个sql语句影响的行数

有些mysql查询返回的结果仅仅是成功或失败.

也许有些查询影响的行数为0,但是这个查询没有错误,那么返回的也是执行成功,然而有的时候是需要知道查询影响了多少条数据的.

PHP有个函数

mysql_affected_rows();

可以取得最近一次 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。

这个函数可以带一个MYSQL连接标识符的参数,如果不加参数,如果没有指定,默认使用最后被 mysql_connect() 打开的连接。

返回值

执行成功,则返回受影响的行的数目,如果最近一次查询失败的话,函数返回 -1。

如果最近一次操作是没有任何条件(WHERE)的 DELETE 查询,在表中所有的记录都会被删除,但本函数返回值在 4.1.2 版之前都为 0。

当使用 UPDATE 查询,MySQL 不会将原值与新值一样的列更新。这样使得 mysql_affected_rows() 函数返回值不一定就是查询条件所符合的记录数,只有真正被修改的记录数才会被返回。

REPLACE 语句首先删除具有相同主键的记录,然后插入一个新记录。该函数返回的是被删除的记录数加上被插入的记录数。

解决MySql中文乱码

最近写了个数据上报统计的小东西,用的PHP&MySql,输入输出都没有做任何编码设置,先开始输入输出都没有任何问题,但是在PHPMyAdmin中,发现中文是乱码,虽然似乎不影响实际输出,终究心里有点不舒服,刚好群里聊天有人问到这个问题,于是百度google了一下,应该是解决了这个问题.

1.首先创建数据库时需要做的操作:

最好是在创建数据库的时候直接指定编码:

方法1、

create database db_name default character set utf8

方法2、

create database db_name default charset=utf8

然而对于使用虚拟主机的用户来说,我们的MySql帐号是没有权限执行创建数据库的代码的,于是就只能在管理页面创建数据库(通常他不提供设置编码的选项)后执行修改数据库编码的指令:

alter database db_name default character set utf8;

—————————————

还可以创建表的时候指定表的编码:

方法1、

create table table_name

(

……//字段信息

)default character set utf8;

方法2、

create table table_name

(

……//字段信息

)default charset=utf8;

同样提供修改表table的编码的指令:

alter table table_name default character set utf8

——————————————————-

创建表时设定字段属性:

create table table_name

(

filed_name varchar(20) character set utf8

);

修改字段编码:

alter table table_name change old_filed_name new_filed_name varchar(20) not null default ‘123’ character set utf8;

//将 table_name表的old_filed_name字段的字段名修改为new_filed_name,类型varchar(20),不为空,默认值123,编码utf8

modify只能修改字段属性,change可以修改字段名。

———————————————————-

2.然后是前台输出要进行的操作:

连接数据库要输出时需要设置编码:

mysql_query(“set names ‘utf8′”);

//set names  设置的编码不需要与前台页面的字符编码一致,即使你的前台页面编码错误导致乱码,但只要set names设置的编码与数据库的编码一致,那么从数据库读出来的数据就不会乱码(也有说这个要和前台一致,但是道理上说不通,没理由要求前台页面编码和数据库编码一致,另外我测试的结果就是只要set names正确,就不会乱码,无关前台页面编码)。

//set names 应该在执行sql查询前执行,一个连接执行一次就够了,写在mysql_connect或mysql_select_db后面就行了.

//建议数据库编码使用utf8.

MYSQL允许远程连接

首先,MySQL 默认的端口是 3306 ,请确认你的防火墙没有阻止该端口.如果您在安装 MySQL 时指定了其他端口,请在防火墙中开启您指定的 MySQL 使用的端口号。

然后我们还需要修改mysql的配置文件my.cnf:

1.在旧版本中:
找到skip-networking,在前面加#,注释掉该选项(#skip-networking)

2.在新版本中:
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
找到 :bind-address = 127.0.0.1 这一行要注释掉
#bind-address = 127.0.0.1
或者把允许访问的 ip 填上
#bind-address = 192.168.1.2

—————————————————————–

配置远程连接的账户:

以 root 帐户登陆 MySQL

  • > MySQL -uroot -p

使用root用户登陆,会提示输入密码,Enter password:输入root的密码登陆.

(也可以在-p后面直接接密码,但是注意不要加空格,如 MySQL -uroot -p123456,不过这样密码是明码显示,容易被人看到?)

然后执行

  • > grant all PRIVILEGES on database.* to test@’192.168.1.2′ identified by ‘123456’;

上面的语句表示将名称为database的数据库的所有权限授权给 test 这个用户,

允许test 用户在 192.168.1.2 这个 IP 上进行远程登陆,并设置 test 用户的密码为 123456 。

解释一下参数:

all PRIVILEGES 表示赋予所有的权限给指定用户,也可以替换为某一具体的权限,例如:select,insert,update,delete,create,drop 等,具体权限间用“,”半角逗号分隔。

database.* 表示上面的权限是针对于哪个表的,database 指的是数据库名称,后面的 * 表示对象是database中所有的表,对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授 权为“数据库名.表名”。

test 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。

192.168.1.2 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。

123456 为用户的密码。

执行了上面的语句后,再执行下面的语句,方可立即生效。

> flush privileges;

注意,如果之前还修改了my.cnf,那么mysql需要重启才能生效!