多数大学生出来选择的工作和专业无关
首页 > 专业知识

分享PHP乱码问题的几种解决技巧

时间:2018-03-27 18:07:21 [来源]:郑州PHP培训学校

   分享PHP乱码问题的几种解决技巧

  PHP乱码问题是在实际编程中经常会遇到的。针对这个的原因有很多种,解决方法也不尽相同。我们可以在实际编程中逐渐积累经验,来杜绝这一问题的出现。
  PHP乱码问题1、PHP 如何处理上传的CSV文件?
  可以用fgetcsv函数: -- 从文件指针中读入一行并解析 CSV 字段,但他无法处理里边的中文;所以在上传后,要先把csv转一下编码;PHP乱码问题2、编码转换;
  iconv("GB2312","UTF-8
  //IGNORE",file_get_contents($uploadfile));ignore的意思是忽略转换时的错误; 但用另一个函数似乎更好一些mb_convert_encoding;PHP乱码问题3、Jmail 发信时乱码也可能是这个原因:
  如果网页是UTF8编码的;可以$jmail->charset = 'utf8';但收件箱大多是GB2312的,可以把正文件用mb_convert_encoding转一下;$zhengwen = '世上只有妈妈好';
  $jmail->Body = mb_convert_
  encoding($zhennwen, 'GB2312', 'UTF-8');
  希望通过本文介绍的三种PHP乱码问题的处理技巧经验,能帮助大家解决问题。
  探讨PHP数据过滤的安全之道
  对于初学者来说,他们也许并不在意PHP编码中的安全考虑。其实这是一个非常重要的考虑因素。下面,就让我们一起来看看PHP数据过滤的安全性能、在PHP的代码编程中,特别要注意到额当属数据的安全性保障。在这篇文章中我们将会对PHP数据过滤在安全保障上的作用做一个详细的分析。
  在指南的开始,我们说过数据过滤在任何语言、任何平台上都是WEB应用安全的基石。这包含检验输入到应用的数据以及从应用输出的数据,而一个好的软件设计可以帮助开发人员做到:
  确保PHP数据过滤无法被绕过,确保不合法的信息不会影响合法的信息,并且识别数据的来源。
  关于如何确保数据过滤无法被绕过有各种各样的观点,而其中的两种观点比其他更加通用并可提供更高级别的保障。
  PHP数据过滤调度方法
  这种方法是用一个单一的PHP脚本调度(通过 URL)。其他任何操作在必要的时候使用include或require包含进来。这种方法一般需要每个 URL 都传递一个单独的GET变量用于调度。这个GET变量可以被认为是用来替代脚本名称的更加简化的设计。例如:
  http://example.org/dispatch.php?task=print_formdispatch.php是唯一的根文件(Document root)。它可以让开发者做两件非常重要的事情:
  在dispatch.php最开始实现一些全局的安全处理,并且确保这些处理不可以被绕过。容易确定在必要的地方进行数据过滤,特别是一些特殊目的的控制流操作中。看下面的例子以便进一步讨论dispatch.php脚本:
  < ?php
  /* 全局安全处理 */
  switch ($_GET['task']){case
  'print_form':include '/inc/
  presentation/form.inc';
  break;
  case 'process_form':$form_valid = false;
  include '/inc/logic/process.inc';
  if ($form_valid){include '/inc/
  presentation/end.inc';}else{include
  '/inc/presentation/form.inc';}
  break;default:include '/inc/presentation
  /index.inc';
  break;
  }
  ?>
  如果这是唯一的可公开访问到的 PHP 脚本,则可以确信的一点是这个程序的设计可以确保在最开始的全局安全处理无法被绕过。同时也让开发者容易看到特定任务的控制流程。例如,不需要浏览整个代码就可以容易的知道:当$form_valid为true时,end.inc是唯一显示给用户的;由于它在process.inc被包含之前,并刚刚初始化为false,可以确定的是process.inc的内部逻辑会将设置它为true;否则表单将再次显示(可能会显示相关的错误信息)。
  PHP数据过滤要注意的问题
  如果你使用目录定向文件,如index.php(代替dispatch.php),你可以像这样使用 URL 地址:http://example.org/?task=print_form。
  你还可以使用ApacheForceType重定向或者mod_rewrite来调整 URL 地址:http://example.org/app/print-form。
  PHP数据过滤的包含方法
  另外一种方式是使用单独一个模块,这个模块负责所有的安全处理。这个模块被包含在所有公开的 PHP 脚本的最前端(或者非常靠前的部分)。参考下面的脚本security.inc< ?php
  switch ($_POST['form'])
  {case 'login':
  $allowed = array();
  $allowed[] = 'form';
  $allowed[] = 'username';
  $allowed[] = 'password';
  $sent = array_keys($_POST);
  if ($allowed == $sent)
  {include '/inc/logic/
  process.inc';}
  break;
  }
  ?>
 
  在这个PHP数据过滤例中,每个提交过来的表单都认为应当含有form这个唯一验证值,并且security.inc独立处理表单中0需要过滤的数据。实现这个要求的HTML表单如下所示:
  < form. action="/receive.php"
  method="POST">
  <input type="hidden"
  name="form" value="login" />
  < p>Username:
  <input type="text" name="username" />
  < /p>
  < p>Password:<input
  type="password" name="password" />
  < /p>
  < input type="submit" />
  < /form>
  叫做$allowed的数组用来检验哪个表单变量是允许的, 这个列表在表单被处理前应当是一致的。流程控制决定要执行什么,而process.inc是真正过滤后的数据到达的地方。
  注意
  确保security.inc总是被包含在每个脚本的最开始的位置比较好的方法是使用auto_prepend_file设置。
  PHP数据过滤的例子
  建立白名单对于PHP数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例子,部分例子可以帮助你对此有一个大体的了解。
  下面的代码对邮件地址进行了验证:
  < ?php
  $clean = array();
  $email_pattern = '
  /^[^@\s<&>]+@([-a-z0-9]+\.)
  +[a-z]{2,}$/i';
  if (preg_match($email_
  pattern, $_POST['email']))
  {$clean['email'] = $_POST
  ['email'];}
  ?>
  PHP数据过滤的名字转换
  之前每个例子都使用了数组$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好的习惯。 永远不要在对数据验证后还将其保存在$_POST或者$_GET中,作为开发人员对超级全局数组中保存的数据总是应当保持充分的怀疑。
  需要补充的是,使用$clean可以帮助思考还有什么没有被过滤,这更类似一个白名单的作用。可以提升安全的等级。
  如果仅仅将验证过的数据保存在$clean,在数据验证上仅存的风险是你所引用的数组元素不存在,而不是未过滤的危险数据。
  PHP数据过滤的时机
  一旦 PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚本发送数据。因此,没有数据可以被输入到脚本中(甚至register_globals被开启的情况下)。这就是为什么初始化变量是非常好的习惯。
  PHP缓存技术的使用技巧分享
  PHP缓存技术可以分为数据缓存;页面缓存;内存缓存;时间触发缓存;内容触发缓存和静态缓存。我们将会为大家详细介绍这些PHP缓存技术的应用。
  PHP缓存技术的应用时相当普遍的,也许有些人还对这项技术不太了解,我们现在就为大家详细的介绍一下PHP缓存技术的相关应用技巧。
  在大部份情况下我们的网站都会使用数据库作为站点数据存储的容器。当你执行一个SQL查询时,典型的处理过程是:连接数据库->准备SQL查询->发送查询到数据库->取得数据库返回结果->关闭数据库连接。但数据库中有些数据是完全静态的或不太经常变动的,缓存系统会通过把SQL查询的结果缓存到一个更快的存储系统中存储,从而避免频繁操作数据库而很大程度上提高了程序执行时间,而且缓存查询结果也允许你后期处理。
  普遍使用的PHP缓存技术
  PHP缓存技术之数据缓存:
  这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存文件中获得。
  PHP缓存技术之页面缓存:
  每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)PHP缓存技术之内存缓存:
  在里就不介绍了,不是本文所要讨论的,只简单提一下:
  Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
  dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。
  以上的缓存技术虽然能很好的解决频繁查询数据库的问题,但其缺点在在于数据无时效性,下面我给出我在项目中常用的方法:
  PHP缓存技术之时间触发缓存:
  检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
  设定时间内不去判断数据是否要更新,过了设定时间再更新缓存。以上只适合对时效性要求不高的情况下使用,否则请看下面。
  PHP缓存技术之内容触发缓存:
  当插入数据或更新数据时,强制更新缓存。
  在这里我们可以看到,当有大量数据频繁需要更新时,最后都要涉及磁盘读写操作。怎么解决呢?我在日常项目中,通常并不缓存所有内容,而是缓存一部分不经常变的内容来解决。但在大负荷的情况下,最好要用共享内存做缓存系统。
  到这里PHP缓存也许有点解决方案了,但其缺点是,因为每次请求仍然要经过PHP解析,在大负荷的情况下效率问题还是比效严重,在这种情况下,也许会用到静态缓存。
  PHP缓存技术之静态缓存
  这里所说的静态缓存是指HTML缓存,HTML缓存一般是无需判断数据是否要更新的,因为通常在使用HTML的场合一般是不经常变动内容的页面。数据更新的时候把HTML也强制更新一下就可以了。
 

上一篇:PHP开发高效WEB系统的技巧讲解

下一篇:初步了解PHP获取数据库表信息函数