当前位置:  编程技术>php
本页文章导读:
    ▪php上传Excel文件时如何判断文件中是否有图片的方法      php在上传Excel文件时如何判断文件中是否有图片呢?需要借助phpexcel这个库。   代码如下: <?php   $excelPath = 'Test.xls';     $objReader = PHPExcel_IOFactory::createReader('Excel5');   $objReader->setReadDa.........
    ▪php中header和session_start前不能有任何输出的原因      php中header和session_start前不能有任何输出的原因在于: 在http传输文本中,规定header和content顺序必须是:header在前content在后,并且header的格式必须满足“keyword: value\n”这种格式。 1、在header输.........
    ▪php中的mysqli_set_charset和SET NAMES优劣分析      关于Mysql的”SET NAMES”和mysql_set_charset (mysqli_set_charset): 尽量使用mysqli_set_charset(mysqli:set_charset)而不是”SET NAMES”。 首先, 很多人都不知道”SET NAMES”到底是做了什么, character_set_client/character_set.........

[1]php上传Excel文件时如何判断文件中是否有图片的方法
    来源: 互联网  发布时间: 2013-12-24

php在上传Excel文件时如何判断文件中是否有图片呢?需要借助phpexcel这个库。
 

代码如下:
<?php
  $excelPath = 'Test.xls';
 
  $objReader = PHPExcel_IOFactory::createReader('Excel5');
  $objReader->setReadDataOnly(true);
 
  $objPHPExcel = $objReader->load($excelPath);
  $currentSheet = $objPHPExcel->getActiveSheet();
  $AllImages= $currentSheet->getDrawingCollection();
 
 if(count($AllImages) > 0) {
   //处理
}
?>

    
[2]php中header和session_start前不能有任何输出的原因
    来源: 互联网  发布时间: 2013-12-24

php中header和session_start前不能有任何输出的原因在于:
在http传输文本中,规定header和content顺序必须是:header在前content在后,并且header的格式必须满足“keyword: value\n”这种格式。

1、在header输出之前有输出内容的话,就会造成对header的错误理解(尽管现在已经能容错了),例如不是满足“keyword: value\n”的格式还好,直接错误了,但是满足“keyword: value\n”这个格式以后,客户端是否安装错误理解,还是按照正确理解?

2、session开启是会隐含的触发是否用header(“Set-Cookie: sid=xxxxxx”),也就是其实还是一个隐式的header调用。


    
[3]php中的mysqli_set_charset和SET NAMES优劣分析
    来源: 互联网  发布时间: 2013-12-24

关于Mysql的”SET NAMES”和mysql_set_charset (mysqli_set_charset):
尽量使用mysqli_set_charset(mysqli:set_charset)而不是”SET NAMES”。

首先, 很多人都不知道”SET NAMES”到底是做了什么,

character_set_client/character_set_connection/character_set_results这三个MySQL的”环境变量”。

这三个变量, 分别告诉MySQL服务器, 客户端的编码集, 在传输给MySQL服务器的时候的编码集, 以及期望MySQL返回的结果的编码集.

比如, 通过使用”SET NAMES utf8″, 就告诉服务器, 我用的是utf-8编码, 我希望你也给我返回utf-8编码的查询结果.

一般情况下, 使用”SET NAMES”就足够了, 也是可以保证正确的. 那么为什么手册又要说推荐使用mysqli_set_charset(PHP>=5.0.5)呢?

首先, 我们看看mysqli_set_charset到底做了什么(注意星号注释处, mysql_set_charset类似):
 

代码如下:
<?php
 //php-5.2.11-SRC/ext/mysqli/mysqli_nonapi.c line 342
  PHP_FUNCTION(mysqli_set_charset)
  {
      MY_MYSQL*mysql;
      zval*mysql_link;
      char *cs_name = NULL;
      unsigned int len;
  
      if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis()
           , "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) == FAILURE) {
         return;
     }
     MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link"
         , MYSQLI_STATUS_VALID);
 
     if (mysql_set_character_set(mysql->mysql, cs_name)) {
           //** 调用libmysql的对应函数
        RETURN_FALSE;
     }
     RETURN_TRUE;
 }
?>

那mysql_set_character_set又做了什么呢?
 

代码如下:
<?php
 //mysql-5.1.30-SRC/libmysql/client.c, line 3166:
  int STDCALLmysql_set_character_set(MYSQL*mysql, const char *cs_name)
  {
    structcharset_info_st *cs;
    const char *save_csdir= charsets_dir;
  
    if (mysql->options.charset_dir)
      charsets_dir= mysql->options.charset_dir;
  
   if (strlen(cs_name) < MY_CS_NAME_SIZE &&
      (cs= get_charset_by_csname(cs_name, MY_CS_PRIMARY, MYF(0))))
   {
     char buff[MY_CS_NAME_SIZE + 10];
     charsets_dir= save_csdir;
     /* Skip execution of "SET NAMES" for pre-4.1 servers */
     if (mysql_get_server_version(mysql) < 40100)
       return 0;
     sprintf(buff, "SET NAMES %s", cs_name);
     if (!mysql_real_query(mysql, buff, strlen(buff)))
     {
       mysql->charset= cs;
     }
   }
   //以下省略
?>
 

我们可以看到, mysqli_set_charset除了做了”SET NAMES”以外, 还多做了一步:
 

代码如下:
<?php
 sprintf(buff, "SET NAMES %s", cs_name);
 if (!mysql_real_query(mysql, buff, strlen(buff)))
 {
   mysql->charset= cs;
 }
?>
 

而对于mysql这个核心结构的成员charset又有什么作用呢?

这就要说说mysql_real_escape_string()了, 这个函数和mysql_escape_string的区别就是, 它会考虑”当前”字符集. 那么这个当前字符集从哪里来呢?

对了, 你猜的没错, 就是mysql->charset.

mysql_real_string在判断宽字符集的字符的时候, 就根据这个成员变量来分别采用不同的策略, 比如如果是utf-8, 那么就会采用libmysql/ctype-utf8.c.

看个实例, 默认mysql连接字符集是latin-1, (经典的5c问题):
 

代码如下:
 <?php
     $db = mysql_connect('localhost:3737', 'root' ,'123456');
     mysql_select_db("test");
     $a = "\x91\x5c";//"慭"的gbk编码, 低字节为5c, 也就是ascii中的"\"
 
     var_dump(addslashes($a));
     var_dump(mysql_real_escape_string($a, $db));
 
     mysql_query("set names gbk");
     var_dump(mysql_real_escape_string($a, $db));
 
     mysql_set_charset("gbk");
     var_dump(mysql_real_escape_string($a, $db));
?>

因为, “慭”的gbk编码低字节为5c, 也就是ascii中的”\”, 而因为除了mysql(i)_set_charset影响mysql->charset以外, 其他时刻mysql->charset都为默认值, 所以, 结果就是:
$ php -f 5c.php
string(3) "慭\"
string(3) "慭\"
string(3) "慭\"
string(2) "慭"

本文转自:http://www.laruence.com/2010/04/12/1396.html


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

oracle iis7站长之家