Category ArchivePHP
关于cookie中的数据读出时带斜杠
当magic_quotes_gpc=on。
所有从GET/POST/Cookie来的变量的单引号(’)、双引号(”)、反斜杠backslash()以及空字元NUL
(the null byte)都会被加上反斜杠
在文本框中输入一个单引号,显示会变成三个斜杠一个单引号
当你接收$_POSTt数据时自动加一个斜杠,然后取$_COOKIE又会加一次斜杠所以变成三个斜杠一个单引号.
你需要在存和取时根据magic_quotes_gpc各去一次斜杠就可以显示原文本内容。
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() 仅仅只能用于在 INSERT 和 UPDATE 语句的更新之后,所以在执行了其它的 SQL 语句(比如 SELECT 或 SET)之后,你不能够使用 C API 函数检索到 LAST_INSERT_ID(expr) 的值。
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, 这样大家就可以在程序中很方便的调用了。效果如下:
关于中日字符存数据库再显示问题
中文页编码=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时中文和日文中有些字可能乱码,不过俺没见到过.
关于日文”能力”乱码解决方法
form使用编码
输出时如服务器开get_magic_quotes_gpc()用StripSlashes()去一下斜杠去一下.
php发日文邮件
发送text邮件
server需安装Multibyte String模块
- @mb_language("Japanese");
- @mb_internal_encoding('SJIS');
- if(mb_send_mail($to,$subject,$message,$additional_headers)){
- return $msg = "儊乕儖偑憲怣偝傟傑偟偨";
- }else{
- return $msg = "儊乕儖憲怣偑幐攕偟傑偟偨";
- }
——————————————————————————————————
如果没安装,又需要发送日文邮件可以使用html格式.注意html的编码.
居说有些日本人会挡html邮件,所以最好用text方式.
- $headers = "MIME-Version: 1.0\r\n";
- $headers .= "Content-type: text/html; charset=Shift_JIS\r\n";
- $headers .= "From: ".$frommail." \r\n";
- $mailmsg = sendmail($tomail,$subject,$body,$headers);
- echo "";
- echo "";
- die;
- function sendmail($to, $subject, $message, $additional_headers = "") {
- if(@mail($to,$subject,$message,$additional_headers)){
- return $msg = "儊乕儖偑憲怣偝傟傑偟偨";
- }else{
- return $msg = "儊乕儖憲怣偑幐攕偟傑偟偨";
- }
- }
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
- //对照表的使用(一)
- $filename = "gb2utf8.txt.new";
- $fp = fopen($filename,"r");
- while(! feof($fp)) {
- list($gb,$utf8) = fgetcsv($fp,10);
- $charset[$gb] = $utf8;
- }
- fclose($fp);
- //以上读取对照表到数组备用
- function gb2utf8($text) {
- global $charset;
- //提取文本中的成分,汉字为一个元素,连续的非汉字为一个元素
- preg_match_all("/(?:[x80-xff].)|[x01-x7f]+/",$text,$tmp);
- $tmp = $tmp[0];
- //分离出汉字
- $ar = array_intersect($tmp, array_keys($charset));
- //替换汉字编码
- foreach($ar as $k=>$v)
- $tmp[$k] = $charset[$v];
- //返回换码后的串
- return join('',$tmp);
- }
- echo gb2utf8("haha,这是对照表的测试");
- ?>
- //对照表的使用(二)
- //建立表gb2utf8,二个字段:gb、utf8。把对照表导入到表中(代码略)
- function gbk2utf8($text) {
- /* 提取文本中的汉字 */
- preg_match_all("/[x80-xff]./",$text,$ar);
- $expr = join("','", array_unique($ar[0]));
- /* 检索文本中所使用的汉字 */
- mysql_connect();
- mysql_select_db('test');
- $rs = mysql_query("select * from gb2utf8 where gb in ('$expr')");
- while(list($key, $value) = mysql_fetch_row($rs))
- $gb[$key] = $value;
- /* 分解文本的各个成分 */
- preg_match_all("/(?:[x80-xff].)|[x01-x7f]+/",$text,$ar);
- $ar = $ar[0];
- /* 替换汉字编码 */
- foreach($ar as $k=>$v)
- if(array_key_exists($v,$gb))
- $ar[$k] = $gb[$v];
- return join(' ',$ar);
- }
- ?>
有人问及逆转换:utf82gb
假定读照表已读到数组charset,则
原贴
http://www.phpx.com/happy/showthread.php?s=&threadid=90509&perpage=15&pagenumber=2
- function utf82gb($text, &$charset) {
- $p = "/[xf0-xf7][x80-xbf]{3}|[xe0-xef][x80-xbf]{2}|[xc2-xdf][x80-xbf]|[x01-x7f]+/";
- preg_match_all($p,$text,$r);
- $utf8 = array_flip($charset);
- foreach($r[0] as $k=>$v)
- if(isset($utf8[$v]))
- $r[0][$k] = $utf8[$v];
- return join('',$r[0]);
- }
- $s = gb2utf8('这是对照表的测试');
- echo utf82gb($s,$charset);
utf-8字符串截取函数
(转自村子sunggsun)
- /**
- * utf-8编码字符串截取函数
- * @param string $string 要截取的字符串
- * @param int $start 起始位置
- * @param int $length 截取长度
- * @param author sunggsun
- * @date: 2004-12-3
- */
- function utf8_substr($string, $start, $length=-1) {
- switch ($length) {
- case 0:
- return '';
- case -1:
- return $string;
- }
- preg_match_all("/([x80-xff]{0,3}|[^x80-xff]?)/is", $string, $arr);
- $rs = array();
- foreach($arr[0] as $key=>$value) {
- if (trim($value) != '') {
- $rs[] = $value;
- }
- }
- $end = $start+$length;
- $len = 0;
- $str = '';
- foreach ($rs as $key=>$value) {
- $l = $len+strlen($value);
- if ($l >= $start && !isset($s)) {
- $s = $len;
- }
- if ($l >= $end && !isset($e)) {
- $e = $l;
- break;
- }
- $len = $l;
- }
- $l = $e - $s;
- return substr(implode('', $rs), $s, $l);
- }
- $str = "这a是3一b个UTF-8字符串*&^……%¥";
- echo $str . "
- rn";
- $len = strlen($str);
- for ($i=0; $i<$len; $i++) {
- for ($n=0; $n<=$len-$i; $n++) {
- if ($i < 10) {
- $a = " " . $i;
- }
- if ($n < 10) {
- $b = " " . $n;
- }
- echo $a . "," . $b . ":" . utf8_substr($str, $i, $n) . "
- rn";
- }
- }
- ?>