基本概念
php的数组分为两种数组:索引数组和关联数组。索引数组的键值为整数,从0开始;关联数组的键值为字符串。
不管是索引数组还是关联数组,键值都不能重复。重复的话,之前的值会被覆盖。
$arr[1] 与 $arr[‘1′]引用相同的元素,但与 arr[’01’] 引用不同元素。
关联数组的索引值要加单引号或者双引号,在php5中不加引号会报错。但在字符串中引用数组元素时则不能加引号。
$arr[‘a’] = ‘AAA’;
$arr[‘b’] = ‘BBB’;
echo “array[a] is $arr[a]”;
数组的创建
1:通过array()结构
创建索引数组:
$arr = array(‘aaa’, ‘bbb’);
创建关联数组:
$arr = array(‘a’=>’AAA’, ‘b’=>’BBB’);
创建空数组
$arr = array();
2:如果数组不存在,那么向数组存放值将创建数组,但是在一个还没有定义的数组中检索一个值不会创建数组。
$arr[0] = ‘aaa’;
$arr[1] = ‘bbb’;
foreach($arr as $v){
echo $v;
}
操作数组
1:在数组末尾添加值
$arr = array(‘a’=>’AAA’, ‘b’=>’BBB’);
$arr[] = ‘CCC’;
常用数组函数
count()或者sizeof()
获得数组大小;
array_pad()
填充数组
1:
首先找到位于WordPress安装目录/wp-includes/”目录里面的”formatting.php”文件;
2:
搜索到如下代码:
// static strings
$curl = str_replace($static_characters, $static_replacements, $curl);
// regular expressions
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);
3:
将其全部注释掉:
// static strings
// $curl = str_replace($static_characters, $static_replacements, $curl);
// regular expressions
// $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);
4:
OK,搞定。
1 第一次访问,检查该文件是否存在,如果没有缓存,从数据库中取出文件放到缓存里面,以后访问,就直接从缓存里面取。每一个静态页面都需要一个辅助的meta文件,例如wp-cache-12345.meta
为什么需要独立的meta?因为返回一个静态html还不够,还有很多信息,例如还需要这个页面的时间,content-type等信息。这些信息又不能存放在html中,所以需要辅助的.meta文件
meta文件中的内容是:
$meta_object->uri = $_SERVER[‘REQUEST_URI’];
$meta_object->post = wp_cache_post_id();
$meta_object->dynamic = true;
$meta_object->headers = array();
array_push($meta_object->headers, “Last-Modified: $value”);
array_push($meta_object->headers, “Content-Type: $value”);
2 如果某篇文章修改了,删除这篇文章的缓存,如果某个blog换主题了,删除整个blog的缓存。以后按照1的逻辑来。
wp-cache-phase1 检查某页面是否存在,如果存在直接去缓存。否则进入wp-cache-phase2,访问动态页面,生成缓存文件
其中用到
ob_start(‘wp_cache_ob_callback’);
register_shutdown_function(‘wp_cache_ob_end’);
wp_cache_ob_callback wp_cache_ob_end
wp-cache-phase2还有个作用是响应页面的事件,例如publish_post edit_post delete_post publish_phone trackback_post pingback_post comment_post edit_comment wp_set_comment_status delete_comment switch_theme,不管什么事件,本质就是将缓存里面的页清空
采用这种插件形式需要修改的地方
1 cache: 需要有一个include文件,根据URL,统一判断所有的访问
2 事件响应:
由于硬盘文件系统,同一目录下的文件数超过3000个,访问就会比较慢
所以缓存文件在硬盘上的结构:需要增加目录,这样可以提升索引速度,而且删除时候也比较方便
可以按照用户,分类,日期或其他属性建立目录
http://www.builder.com.cn/2008/0328/786511.shtml
function add_qc_object(){
var height = 250;
var width = 800;
var top = (screen.availHeight – height)/2;
var left = (screen.availWidth – width)/2;
var param = ‘toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,’ +
‘width=’ + width + ‘,height=’ + height + ‘,left= ‘ + left + ‘,top=’ + top;
window.open(‘K230_add_qc_object.jsp’, ‘win_name’, param);
}
Oracle number datatype 语法:
NUMBER[(precision [, scale])]
简称:
precision –> p
scale –> s
NUMBER(p, s)
范围: 1 <= p <=38, -84 <= s <= 127
保存数据范围:-1.0e-130 <= number value < 1.0e+126
保存在机器内部的范围: 1 ~ 22 bytes
有效位:从左边第一个不为0的数算起的位数,小数点和负号不计入有效位数。
s的情况:
s > 0
精确到小数点右边s位,并四舍五入。然后检验有效位是否 <= p。
s < 0
精确到小数点左边s位,并四舍五入。然后检验有效位是否 <= p + |s|。
s = 0
此时NUMBER表示整数。
eg:
Actual Data Specified As Stored As
----------------------------------------
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision (有效位为5, 5 > 4)
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5) .01234 (有效位为4)
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error (有效位为5+2 > 6)
1234.9876 NUMBER(6) 1235 (s没有表示s=0)
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error (有效位为8 > 7)
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error (有效位为10 > 9)
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error (0.10000, 有效位为5 > 4)
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
http://dev.csdn.net/develop/article/70/70922.shtm
http://www.cublog.cn/u/19782/showart_207809.html
http://hi.baidu.com/tdskee/blog/item/5d59870a8f40f01b95ca6be4.html
在UNIX/LINUX中,普通进程用&符号就可以放到后台运行,如果启动该程序的控制台logout,则该进程随即终止。
在UNIX/LINUX中还有一种进程被称为守护进程,守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示,并且进程也不会被任何终端所产生的终端信息所打断。 More …
方法一:导出到csv文件,存放在服务器端任一路径,然后给客户下载
优点:
1、可以进行身份认证后给客户下载,如果放到非web目录就没有对应的url,客户无法随时下载。
2、也是因为生成了文件,所以占用了服务器的空间,但是可以把文件名存放到数据库,再次给客户下载的时候不需要重复生成文件。
3、csv文件是文本文件,逗号隔开字段,回车隔开行,易于数据导入导出。
实现方法:
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[“conn”]);
SqlDataAdapter da=new SqlDataAdapter(“select * from tb1″,conn);
DataSet ds=new DataSet();
da.Fill(ds,”table1”);
DataTable dt=ds.Tables[“table1”];
string name=System.Configuration.ConfigurationSettings.AppSettings[“downloadurl”].ToString()+DateTime.Today.ToString(“yyyyMMdd”)+new Random(DateTime.Now.Millisecond).Next(10000).ToString()+”.csv”;//存放到web.config中downloadurl指定的路径,文件格式为当前日期+4位随机数
FileStream fs=new FileStream(name,FileMode.Create,FileAccess.Write);
StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding(“gb2312”));
sw.WriteLine(“自动编号,姓名,年龄”);
foreach(DataRow dr in dt.Rows)
{
sw.WriteLine(dr[“ID”]+”,”+dr[“vName”]+”,”+dr[“iAge”]);
}
sw.Close();
Response.AddHeader(“Content-Disposition”, “attachment; filename=” + Server.UrlEncode(name));
Response.ContentType = “application/ms-excel”;// 指定返回的是一个不能被客户端读取的流,必须被下载
Response.WriteFile(name); // 把文件流发送到客户端
Response.End();
方法二:导出到csv文件,不存放到服务器,直接给浏览器输出文件流
优点:
1、随时生成,不需要占用资源
2、可以结合身份认证
3、同样利于数据交换
实现方法:
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[“conn”]);
SqlDataAdapter da=new SqlDataAdapter(“select * from tb1″,conn);
DataSet ds=new DataSet();
da.Fill(ds,”table1”);
DataTable dt=ds.Tables[“table1”];
StringWriter sw=new StringWriter();
sw.WriteLine(“自动编号,姓名,年龄”);
foreach(DataRow dr in dt.Rows)
{
sw.WriteLine(dr[“ID”]+”,”+dr[“vName”]+”,”+dr[“iAge”]);
}
sw.Close();
Response.AddHeader(“Content-Disposition”, “attachment; filename=test.csv”);
Response.ContentType = “application/ms-excel”;
Response.ContentEncoding=System.Text.Encoding.GetEncoding(“GB2312”);
Response.Write(sw);
Response.End();
对方法一,二补充一点,如果你希望导出的是xls文件分隔符用\t就可以了,不要用逗号
代码修改如下:
sw.WriteLine(“自动编号\t姓名\t年龄”);
foreach(DataRow dr in dt.Rows)
{
sw.WriteLine(dr[“ID”]+”\t”+dr[“vName”]+”\t”+dr[“iAge”]);
}
另外,修改输出的文件扩展名为xls即可。
方法三:从datagrid导出html代码,生成excel文件,给客户端下载
优点:
1、有固定的格式,样子好看(datagrid的样子)
局限性:
1、不适合数据交换,里面有html代码,比较乱,没有固定格式
2、datagrid不能有分页、排序等,否则出错
实现方法:
Response.Clear();
Response.Buffer= false;
Response.Charset=”GB2312″;
Response.AppendHeader(“Content-Disposition”,”attachment;filename=test.xls”);
Response.ContentEncoding=System.Text.Encoding.GetEncoding(“GB2312”); Response.ContentType = “application/ms-excel”; this.EnableViewState = false;
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.DataGrid1.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();
在这里说明一点:有的网友反映代码出现“没有dr[“id”]”之类的错误,这个代码是按照我的数据结构来写的,到时候相关的字段要换成你自己的才是。
还有就是如果文件名需要中文的话,这么修改Response.AddHeader(“Content-Disposition”, “attachment; filename=”+System.Web.HttpUtility.UrlEncode(“中文”,System.Text.Encoding.UTF8)+”.xls”);
Go to source web page: (原创)datagrid数据导出到excel文件给客户端下载的几种方法 – LoveCherry – 博客园