Category ArchivePHP



PHP & 技术 27 Sep 2006 01:24 pm

关于cookie中的数据读出时带斜杠

当magic_quotes_gpc=on。
所有从GET/POST/Cookie来的变量的单引号(’)、双引号(”)、反斜杠backslash()以及空字元NUL
(the null byte)都会被加上反斜杠

在文本框中输入一个单引号,显示会变成三个斜杠一个单引号

当你接收$_POSTt数据时自动加一个斜杠,然后取$_COOKIE又会加一次斜杠所以变成三个斜杠一个单引号.

你需要在存和取时根据magic_quotes_gpc各去一次斜杠就可以显示原文本内容。

PHP & 技术 25 Sep 2006 01:30 pm

auto_prepend_file 文件

A apache中设置,但他会覆盖php.ini中的设置

……………………………..

php_admin_value include_path ".:/usr/lib/php/php:/var/www/html/sso/include"

php_value auto_prepend_file "josso-lib/josso.php"

B php.ini中设置

auto_prepend_file 不支持多个文件

可以预加载中include

Database & PHP & 技术 17 Jul 2006 01:19 pm

mysql 自增id使用 bigint 时的错误返回

使用php mysql_insert_id() 函数将会返回错误值

应使用SELECT LAST_INSERT_ID();需紧跟insert语句。

以下是手册描述:

php:

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

mysql:
LAST_INSERT_ID([expr])
返回被插入到一个 AUTO_INCREMENT 列中的最后一个自动产生的值。查看章节 8.1.3.130 mysql_insert_id()
mysql> SELECT LAST_INSERT_ID();
        -> 195

最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。如果你以一个非特殊值(即一个非 NULL 和非 0 的值)更新其它的 AUTO_INCREMENT,它甚至也不会改变。 如果你在同一时间内以一个插入语句插入了许多记录行,LAST_INSERT_ID() 将返回第一个被插入行的值。这样做的原因是因为,这可能列容易地在其它服务器上再现同一条 INSERT 语句。 如果 expr 被作为一个参数传递给 LAST_INSERT_ID(),那么函数将返回这个参数的值,并且被设置为 LAST_INSERT_ID() 返回的下一个值。这可被用于模拟一个序列: 首先创建一个表:

mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);

然后这个表可以被用来以下面的方式产生序列值:

mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);

你也可以不调用 LAST_INSERT_ID() 产生序列,但是以这种方式使用这个函数的作用就是,ID 值是在服务器端叙谈最后的自动产生值被维护的(是多用户安全的)。你可以检索这的新的 ID 值,就好像读取 MySQL 中任何正常的 AUTO_INCREMENT 值一样。举例来说,LAST_INSERT_ID()(无任何参数) 将返回一个新的 ID。C API 函数 mysql_insert_id() 也可以用来得到这个值。 注意,由于 mysql_insert_id() 仅仅只能用于在 INSERTUPDATE 语句的更新之后,所以在执行了其它的 SQL 语句(比如 SELECTSET)之后,你不能够使用 C API 函数检索到 LAST_INSERT_ID(expr) 的值。

PHP & 技术 05 Oct 2005 01:10 pm

PHP:显示文件上传进度及上传任意大小的文件

转自http://www.ugia.cn/?p=54

利用php上传比较大的文件时,往往需要很长的等待时间,而且受网络和软件等的影响,经常会出现超时及上传失败的现象。如何在上传文件时实时的得到文件上传进度,以及如何避开php和其他因素的限制上传任意大小的文件呢?

php同asp等其他语言对上传文件的处理方式不同,asp中可以用Request.BinaryRead流式的读取客户端提交的数据。php是把文件存放在临时文件夹中,在文件上传完成后才能够获取其信息以及对其进行操作。如果在上传过程中我们能够得到其临时文件的文件名,我们就可以通过判断临时文件的大小来来得到上传进度,不过好像没有办法得到。所以我们只能通过其他方式,就是利用php的socket扩展建立一个简单的服务器,把数据post到这个服务器上,然后再用我们自己的机制来处理。

先说说流程,首先用php的socket函数库建立一个临时的http服务器,在某一端口监听,然后把ip地址和端口号通知客户端,客户端把上传表单提交到http://srvIpAddress:port(临时服务器), 临时服务器接受客户端请求,并读取post数据,分析并获取客户端上传的文件信息,把文件保存在服务器上,然后关闭临时服务器,释放资源,上传完成。 有点绕,不过思路还是简单的。

稍后我会发布一个类库,暂定名为:UGiA Visual PHP Uploader, 这样大家就可以在程序中很方便的调用了。效果如下:

uvpu

PHP & 技术 05 Jan 2005 04:18 pm

关于中日字符存数据库再显示问题

中文页编码=gb2312
日文页编码=Shift_JIS
utf8页编码=utf-8
———————————————————————-
中文页显示中文正常
中文页显示日文乱码

中文页输入中文->db->中文页显示:中文
中文页输入中文->db->日文页显示:乱码
中文页输入日文->db->中文页显示:宋体日文
中文页输入日文->db->日文页显示:乱码
———————————————————————
日文页显示中文乱码
日文页显示日文正常

日文页输入中文->db->日文页显示:乱码
日文页输入中文->db->中文页显示:有些字能正常显示,有些不能
日文页输入日文->db->日文页显示:日文
日文页输入日文->db->中文页显示:乱码
———————————————————————–
utf8页可以同时显示中文和日文但保存时需指定一下保存类型,1个汉字3字节
在非utf8下保存的数据在utf8下显示乱码

utf8页输入中文->db->日文显示:乱码
utf8页输入中文->db->中文显示:乱码
utf8页输入中文->db->utf8显示:正常
utf8页输入日文->db->日文显示:乱码
utf8页输入日文->db->中文显示:乱码
utf8页输入日文->db->utf8显示:正常
——————————————————————-

据前辈说使用utf8时中文和日文中有些字可能乱码,不过俺没见到过.

PHP & 技术 04 Jan 2005 03:59 pm

关于日文”能力”乱码解决方法

form使用编码

输出时如服务器开get_magic_quotes_gpc()用StripSlashes()去一下斜杠去一下.

PHP & 技术 04 Jan 2005 03:52 pm

php发日文邮件

发送text邮件

server需安装Multibyte String模块

  1. @mb_language("Japanese");
  2. @mb_internal_encoding('SJIS');
  3.  if(mb_send_mail($to,$subject,$message,$additional_headers)){
  4.   return $msg = "儊乕儖偑憲怣偝傟傑偟偨";
  5.  }else{
  6.   return $msg = "儊乕儖憲怣偑幐攕偟傑偟偨";
  7.  }

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

如果没安装,又需要发送日文邮件可以使用html格式.注意html的编码.
居说有些日本人会挡html邮件,所以最好用text方式.

  1. $headers  = "MIME-Version: 1.0\r\n";
  2.   $headers .= "Content-type: text/html; charset=Shift_JIS\r\n";
  3.   $headers .= "From: ".$frommail." \r\n";
  4.  
  5.   $mailmsg = sendmail($tomail,$subject,$body,$headers);
  6.   echo "";
  7.   echo "";
  8.   die;
  9.  
  10.  
  11. function sendmail($to, $subject, $message, $additional_headers = "") {
  12.  if(@mail($to,$subject,$message,$additional_headers)){
  13.   return $msg = "儊乕儖偑憲怣偝傟傑偟偨";
  14.  }else{
  15.   return $msg = "儊乕儖憲怣偑幐攕偟傑偟偨";
  16.  }
  17. }

PHP & 技术 04 Jan 2005 11:16 am

GB2UFT8

看到好多人还在用4、5年前的GB - UTF8转换程序,真的很难过。就算不用ICOVN函数,也可以进步一点吧,

上传的文件包含gb2312全集,每行:
1到2字节,GB2312码
3字节,空格
4字节,对应utf8码的位数;
后面,utf8码+回车(rn);

附件: gb2utf8.txt

http://www.phpx.com/happy/showthread.php?s=&threadid=90509&perpage=15&pagenumber=1

  1. //对照表的使用(一)
  2.  
  3. $filename = "gb2utf8.txt.new";
  4.  
  5. $fp = fopen($filename,"r");
  6.  
  7. while(! feof($fp)) {
  8.  
  9.   list($gb,$utf8) = fgetcsv($fp,10);
  10.  
  11.   $charset[$gb] = $utf8;
  12.  
  13. }
  14.  
  15. fclose($fp);
  16.  
  17. //以上读取对照表到数组备用
  18.  
  19.  
  20.  
  21. function gb2utf8($text) {
  22.  
  23.   global $charset;
  24.  
  25.   //提取文本中的成分,汉字为一个元素,连续的非汉字为一个元素
  26.  
  27.   preg_match_all("/(?:[x80-xff].)|[x01-x7f]+/",$text,$tmp);
  28.  
  29.   $tmp = $tmp[0];
  30.  
  31.   //分离出汉字
  32.  
  33.   $ar = array_intersect($tmp, array_keys($charset));
  34.  
  35.   //替换汉字编码
  36.  
  37.   foreach($ar as $k=>$v)
  38.  
  39.     $tmp[$k] = $charset[$v];
  40.  
  41.   //返回换码后的串
  42.  
  43.   return join('',$tmp);
  44.  
  45. }
  46.  
  47.  
  48.  
  49. echo gb2utf8("haha,这是对照表的测试");
  50.  
  51. ?>
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58. //对照表的使用(二)
  59.  
  60. //建立表gb2utf8,二个字段:gb、utf8。把对照表导入到表中(代码略)
  61.  
  62. function gbk2utf8($text) {
  63.  
  64.     /* 提取文本中的汉字 */
  65.  
  66.     preg_match_all("/[x80-xff]./",$text,$ar);
  67.  
  68.     $expr = join("','", array_unique($ar[0]));
  69.  
  70.     /* 检索文本中所使用的汉字 */
  71.  
  72.     mysql_connect();
  73.  
  74.     mysql_select_db('test');
  75.  
  76.     $rs = mysql_query("select * from gb2utf8 where gb in ('$expr')");
  77.  
  78.     while(list($key, $value) = mysql_fetch_row($rs))
  79.  
  80.         $gb[$key] = $value;
  81.  
  82.  
  83.  
  84.     /* 分解文本的各个成分 */
  85.  
  86.     preg_match_all("/(?:[x80-xff].)|[x01-x7f]+/",$text,$ar);
  87.  
  88.     $ar = $ar[0];
  89.  
  90.  
  91.  
  92.     /* 替换汉字编码 */
  93.  
  94.     foreach($ar as $k=>$v)
  95.  
  96.         if(array_key_exists($v,$gb))
  97.  
  98.             $ar[$k] = $gb[$v];
  99.  
  100.     return join(' ',$ar);
  101.  
  102. }
  103.  
  104. ?>

有人问及逆转换:utf82gb
假定读照表已读到数组charset,则

原贴

http://www.phpx.com/happy/showthread.php?s=&threadid=90509&perpage=15&pagenumber=2

  1. function utf82gb($text, &$charset) {
  2.  
  3.   $p = "/[xf0-xf7][x80-xbf]{3}|[xe0-xef][x80-xbf]{2}|[xc2-xdf][x80-xbf]|[x01-x7f]+/";
  4.  
  5.   preg_match_all($p,$text,$r);
  6.  
  7.   $utf8 = array_flip($charset);
  8.  
  9.   foreach($r[0] as $k=>$v)
  10.  
  11.     if(isset($utf8[$v]))
  12.  
  13.       $r[0][$k] = $utf8[$v];
  14.  
  15.   return join('',$r[0]);
  16.  
  17. }
  18.  
  19.  
  20.  
  21. $s = gb2utf8('这是对照表的测试');
  22.  
  23. echo utf82gb($s,$charset);

PHP & 技术 04 Jan 2005 11:05 am

utf-8字符串截取函数

(转自村子sunggsun)

  1. /**
  2. * utf-8编码字符串截取函数
  3. * @param string $string 要截取的字符串
  4. * @param int $start 起始位置
  5. * @param int $length 截取长度
  6. * @param author sunggsun
  7. * @date: 2004-12-3
  8. */
  9.  
  10.  
  11.  
  12. function utf8_substr($string, $start, $length=-1) {
  13.     switch ($length) {
  14.      case 0:
  15.             return '';
  16.         case -1:
  17.             return $string;       
  18.     }
  19.     preg_match_all("/([x80-xff]{0,3}|[^x80-xff]?)/is", $string, $arr);
  20.     $rs = array();
  21.     foreach($arr[0] as $key=>$value) {
  22.         if (trim($value) != '') {
  23.             $rs[] = $value;
  24.         }
  25.     }
  26.     $end = $start+$length;
  27.     $len = 0;
  28.     $str = '';
  29.     foreach ($rs as $key=>$value) {
  30.         $l = $len+strlen($value);
  31.         if ($l >= $start && !isset($s)) {
  32.             $s = $len;
  33.         }
  34.         if ($l >= $end && !isset($e)) {
  35.             $e = $l;
  36.             break;
  37.         }
  38.         $len = $l;
  39.     }
  40.     $l = $e - $s;
  41.     return substr(implode('', $rs), $s, $l);
  42. } 
  43. $str = "这a是3一b个UTF-8字符串*&^……%¥";
  44. echo $str . "
  45. rn";
  46.  
  47. $len = strlen($str);
  48. for ($i=0; $i<$len; $i++) {
  49.     for ($n=0; $n<=$len-$i; $n++) {
  50.         if ($i < 10) {
  51.             $a = " " . $i;
  52.         }
  53.         if ($n < 10) {
  54.             $b = " " . $n;
  55.         }
  56.         echo $a . "," . $b . ":" . utf8_substr($str, $i, $n) . "
  57. rn";
  58.     }
  59. }
  60. ?>

« Previous Page