Php解决读取数据库时显示乱码

 更新时间:2016年11月25日 17:37  点击:1758
利用php读取数据库时如果页面与数据库编码不一致中文就会有乱码了,但我们可以通过set names来强制统一编码。

首先需要修改文件的类型 我的utf8 提交资料的时候 需要在mysql_query上加这么语句话

 代码如下 复制代码
mysql_query("SET NAMES 'utf8'",$db);  

  然后数据库的编码也得是utf8_general_ci  

然后在读取的时候 也加

 代码如下 复制代码
mysql_query("SET NAMES 'utf8'",$db);  

   然后就不会实现乱码了 以下代码是是实例

 代码如下 复制代码

<?php
mysql_query("SET NAMES 'utf8'",$db);
$sql = "select * from wd_sql";
$query=mysql_query($sql);
 $i = 1;//www.111cn.net
 while ($result = mysql_fetch_array($query)) {
 $x = $i++;
 echo "第".$x."位<br>";}
?>


总结一下这个乱码问题的解决方法:

1.确认所有页面都统一使用同样的编码,强烈建议用utf-8;
2. 在用mysql_query作查询时无论是写入数据到mysql还是从mysql提数据出来,设置mysql_query(“set names utf8″)..,连接数据库时就设置,而且不要把这时的“utf8”写成“utf-8”,这点很重要。

同事叫我帮忙解释一个问题:一个PHP生成的重定向请求,在Nginx日志里产生两种截然不同的记录:一种响应体大小是零个字节;另一种响应体大小是五个字节

现在年纪大了,面对问题时的嗅觉不再灵敏,第一感觉零是正确的,心想是不是重定向后忘记退出了,后面还有内容输出,可是查了一下代码发现没有问题:

 
<?php
header('Location: /path');
exit;
?>

在绕了一大圈之后,我猛然意识到环境是Nginx+PHP,响应没有「Content-Length」,数据是通过「Transfer-Encoding」分块发送的,所以重定向的空响应体实际类似:

    0\r\n\r\n

不多不少,正好五个字节,细节大家可以参考Chunked transfer encoding。如此看来在此类空响应体的情况下,PHP主动输出一个「Content-Length: 0」说不定会更好些。

那零个字节的响应如何解释呢?查询日志发现如下两种情况:

    HEAD “/path HTTP/1.1″ 302 0
    GET “/path HTTP/1.0″ 302 0

前者是HEAD请求,不需要响应体;后者是HTTP/1.0,不支持「Transfer-Encoding」。

问题基本解释清楚了,擦擦额头的汗,总算没在同事面前丢脸。

magic_quotes_gpc是一个php中一个给单双引号增加一些安全过滤的函数,但此函数对于我使用unserialize函数时会产生一些影响,下面我就就这个问题与大家看几个实例与解决办法。

昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的(刚换的空间),具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空。

我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息。

调试一下发现问题出现在unserialize上。

我先根据它的购物车原理写了段代码:

 

 代码如下 复制代码
<?php  
    header("Content-type: text/html; charset=utf-8");  
    $magic = get_magic_quotes_gpc() ? "开启" : "未开启";  
     
    $str = array(array('goods_id'=>13,'number'=>1));  
    setcookie("cart", serialize($str));  
    echo "magic_quotes_gpc: ".$magic."<br>";  
    echo $_COOKIE['cart']."<br>";  
    print_r(unserialize($_COOKIE['cart']));  
?> 


大家执行下这段代码可以发现,当你的magic_quotes_gpc关闭时这段程序执行没有任何问题,但是magic_quotes_gpc开启时你会发现反序列化并不成功。这时你可能就知道问题出在哪了?

原因是magic_quotes_gpc开启时,系统会自动对POST GET COOKIE的结果中的单引号进行转义,加上\,所以$_COOKIE['cart']的值就变成了a:1:{i:0;a:2:{s:8:\"goods_id\";i:13;s:6:\"number\";i:1;}},这样的话unserialize是无法反序列化成功的,就出现了问题。

解决的办法简单来说就是将unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉转义符。这样就没问题了。

对于cookie影响我们再做个测试

1.问题:项目数据需要序列化保存在cookie中,然后再获得cookie的数据反序列,获得原数据

 代码如下 复制代码


    $a[0] = array("key"=>"哈  逻"); 
    $a[1] = array("key"=>"哈 逻"); 
    $jsona = json_encode($a); 
    setcookie("testcookie","");  //www.111cn.net
    setcookie("testcookie",$jsona); 
    var_dump($jsona,true); //正常取值 
    var_dump(json_decode($_COOKIE['testcookie'],true)); //取不到值 


在没有经过cookie赋值时,正常反序列化。经过cookie之后,取到值为空

2.分析:

 

 代码如下 复制代码
    $a[0] = array("key"=>"哈  逻"); 
    $a[1] = array("key"=>"哈 逻"); 
    $jsona = json_encode($a); 
    var_dump($jsona); //string(50) "[{"key":"\u54c8 \u903b"},{"key":"\u54c8 \u903b"}]" 
    setcookie("testcookie",""); 
    setcookie("testcookie",$jsona); 
    var_dump($_COOKIE['testcookie']); // string(62) "[{\"key\":\"\\u54c8 \\u903b\"},{\"key\":\"\\u54c8 \\u903b\"}]" 
    var_dump(json_decode($_COOKIE['testcookie'],true)); 


对比了一下数据,经过cookie处理后多了几个//

解决方法:

 代码如下 复制代码


    var_dump(json_decode(stripslashes($_COOKIE['testcookie']),true)); 
    var_dump(json_decode(str_replace("\\","",$_COOKIE['testcookie']),true)); 


总结:magic_quotes_gpc在开启的情况下,会影响通过get|post|cookies获得的数据.所以我们在get|post|cookies处理数据的时候,
首先判断magic_quotes_gpc开启情况
1>在开启情况下,处理数据需要stripslashes
2>在没有开启情况下,接受数据先addslashes,处理数据stripslashes

在linux中增加了fastcgi+php环境,结果在文件上传时如果文件小于100KB是可以上传,但大了点就提示mod_fcgid: HTTP request length 132296 (so far) exceeds MaxRequestLen (131072)错误了,意思是fastcgi限制了文件上传大小而你要上传的文件比maxrequestlen还要大啊,所以不能上传想上传就得修改一下配置了,具体步骤如。

最近在项目中中上传图片时,大约有300多K,结果报了个服务器错误,以前从未遇到过,错误的内容如下:

点击查看原图

mod_fcgid: www.111cn.net HTTP request length 132296 (so far) exceeds MaxRequestLen (131072)

查了下资料,发现fastcgi默认的请求大小为131072,于是在apache配置中添加了MaxRequestLen 配置就好了。如果你只需要修改单个虚拟主机的MaxRequestLen,原来是fastcgi模式下的设置问题,需要在配置文件.htaccess或者直接在apache的配置文件http.conf 中指明,如下:

 代码如下 复制代码

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout  20
  # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB
  FcgidMaxRequestLen  15728640
</IfModule>


如果你是php+apache windows环境下的话我们如下配置即可

在php.ini中找到

upload_max_filesize,及其他post_max_size、max_input_time、memory_limit、 max_execution_time配置

把上传大小修改之后重启apache 即可解决。

 

本文章来给各位朋友分析关于使用strtotime和mktime时参数为0时返回1999-11-30的时间戳问题解决方法,希望本文章对大家会有所帮助。

先看例子

 代码如下 复制代码

<?php
$time = date('Y-m-d',strtotime('00-00-00 00:00:00'));
echo $time;
//输出 1999-11-30
?>

这里没有任何bug,00-00-00的意思是2000-00-00,2000-00-00实际上是1999-12-00,而1999-12-00又会转换成1999-11-30。
所以这里没有任何bug,完全正常。

strtotime('00-00-00 00:00:00')与 mktime(0,0,0,0,0,0) 是完全等价的。

//int mktime(时, 分, 秒, 月, 日, 年)
echo mktime(0,0,0,0,0,0);
mktime() 函数用于从日期取得时间戳,成功返回时间戳,否则返回 FALSE 。

输出 943920000

[!--infotagslink--]

相关文章

  • php生成二维码中文乱码问题解决方法

    最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<&#63;php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10