当前位置: 编程技术>php
本页文章导读:
▪多文件上传的例子
多文件上传的例子
//upload_html.php--------------------------------------------------------------------------------------------- <HTML> <HEAD> <TITLE>上传文件</TITLE> </HEAD&g.........
▪PHP4(windows版本)中的COM函数
PHP4(windows版本)中的COM函数
这几天一直在写excel转化成mysql,发现一篇文章,搜一下phpx论坛,没有这个帖子,把它转帖如下:PHP4(windows版本)中的COM函数 介绍内置于PHP4.........
▪实现树状结构的两种方法
实现树状结构的两种方法
1。递归法递归是指在函数中显式的调用它自身。利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢(在树的分支/层次.........
[1]多文件上传的例子
来源: 互联网 发布时间: 2013-11-30
多文件上传的例子 //upload_html.php---------------------------------------------------------------------------------------------
<HTML>
<HEAD>
<TITLE>上传文件</TITLE>
</HEAD>
<script>
function beforesubmit(forma)
{
var indexnamea=forma.indexname.value;
var upfilea=forma.upfile.value;
var k=/ /g;
var indexnamea=indexnamea.replace(k,"");
var upfilea=upfilea.replace(k,"");
if(indexnamea==""
upfilea=="")
{
alert("目录名称或上传的目录不能为空!");
return false;
}
return true;
}
</script>
<BODY BGCOLOR=WHITE>
<BR>
<form name=form1 action="/blog_article/upload.html" method=post enctype=\"multipart/form-data\" >\n";
<table cellspacing="1" cellpadding="5" border="0" width="580" bgcolor="#C2E2F5">
<tr bgcolor="#E3F2FB" align="center">
<td width="280" align="center" height="30">上传的文件</td>
</tr>
<?
for($i=1;$i<8;$i++)
{
$upfile="upfile".strval($i);
echo " <tr>\n";
echo " <td bgcolor=#F5FBFE width=264><input type=file name=$upfile lengh=25></td>\n";
echo " </tr>\n";
}
?>
<tr bgcolor="#E3F2FB">
<td colspan="2" height="1">
</td>
<td colspan="2" height="1">
<div align="center">
<input type=submit name="submit" value=上传>
</div>
</td>
</table>
</form>
</body></html>
//-----------------------------------------------------------------------------------------------------------------------
//upload.php-------------------------------------------------------------------------------------------------------------
//upload_path:文件要上传到的目录路径
<?php
for($i=1;$i<8;$i++)
{
$upfile="upfile".strval($i);
if(chop($$indexname)!="" and chop($$upfile)!="")
{
$upfilename=($upfile."_name");
$filename=upload_path.$$upfilename;
$copyfile = copy($$upfile,$filename);
if (!$copyfile)
die("文件上传失败!");
$ls_file.=$$upfilename."\n";
$flag=1 ;
}
}
if($flag){
$ls_msg="文件\n".$ls_file."上传成功!";
}
else{
$ls_msg="无文件上传,请重新选择!";
}
echo "<HTML>\n" ;
echo "<HEAD>\n" ;
echo "</HEAD>\n" ;
echo "<BODY >\n" ;
echo $ls_msg."\n";
echo "</BODY>\n" ;
echo "</HTML>\n" ;
?>
[2]PHP4(windows版本)中的COM函数
来源: 互联网 发布时间: 2013-11-30
PHP4(windows版本)中的COM函数 这几天一直在写excel转化成mysql,发现一篇文章,搜一下phpx论坛,没有这个帖子,把它转帖如下:
PHP4(windows版本)中的COM函数
介绍
内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档。本文将以三个例子分
别处理 MS office 2000 Word 、 Excel 、 Adobe Distiller 来说明如何在PHP中使用COM函数。
COM技术是由Microsoft在几年前提出并开发的,本文中提到的相关名词有OLE, OLE Automation, ActiveX, COM ,这些词的意思都基本一
样,都表示用一段封装的代码(对象)来完成一个windows 应用程序的一些功能。 PHP4 COM 函数可以连接一个对象实例,并使用它的方法与
属性。
如果你想使用下面的例子源码,请参考一下我的配置。
Windows 98 - MS Office 2000
Apache 1.3.9 Windows
PHP4.02 Dev (08-20-00) Running as CGI
PHP4中的COM标记
现在让我们开始吧,用PHP4的COM来实例化一个组件,需要 new操作符和对象的 "OLE 程序标识":
$instance = new COM("$identifier");
?>
因为COM是一个PHP4的保留字,它传送这个对象的标识给一个构造函数,现在得到了这个组件的一个实例,根据OOP类的性质,我们可以很容易
地访问它的方法与属性。
例如:
$instance->[Object]->[method1]->[method2]->..->[property];
?>
就是这么简单!
OOP的结构在PHP下不能工作,(由于PHP语法的问题,属性的名字.值是非法字符,如点和圆括号等),所以PHP4提供了两个相应的函数:
bool com_set(class com_object, string property name, string property_value);
mixed com_get(class com_object, string property_name);
?>
最后,PHP4也支持DCOM技术,可以在远程计算机创建一个对象实例。
$Instance = new COM(string "Component name", string "remote_server_address");
?>
注意:这是用DCOM指令来设置PHP。在将来,PHP开发者提供Unix下对DCOM的支持。
标识、方法和属性
标识是一个如下的字串:
MS Word: "Word.Application" or "Word.Application.9"
MS Excel: "Excel.Application" or "Excel.Sheet"
ADOBE Acrobat: "Exch.application" or "PdfDistiller.PdfDistiller"
对于最后一个标识,我要指明的是,获得正确的对象标识名不是一件容易的事。如果你不能访问VBA文档,你可以查找一下windows的注册
表,在 HKEY_CLASSES_ROOT 中寻找一下,你就可以得到一些应用程序的名字。在你的机器上有效的对象标识放在 CLSID 子文件夹下。
应用程序一般会提供文档说明它的COM方法和属性。在office2000中,你可以运行程序,打开VBA编辑器 ,选择对象编辑器。输入应用程序
库中的一个方法名或属性名,然后,在下面的窗口中用鼠标右键选择一个类或成员名称,点帮助,你就会得到关于这个类或成员的描述。你也
可以参考 MSDN。一个 Excel 的例子如下: [url]http://msdn.microsoft.com/library/officedev/off2000/xltocobjectmodelapplication.htm[/url]
用COM函数操作 MS Word
现在,我们开始第一个例子吧:
#*********************************************************
# 本例来自Zend站点,略有改动
# 打开一个word实例,并新建一个文档Useless test.doc
# 输入一行文字 "This is a test2..."
#*********************************************************
#实例化一个对象
$word = new COM("word.application") or die("Unable to instantiate Word");
#取得并显示版本
print "Loaded Word, version {$word->Version}
";
#另一种方法去取得版本
$testversion = com_get($word->application,version);
print "Version using Com_get(): $testversion
";
#使其可见
$word->Visible = 1;
#创建新文件
$word->Documents->Add();
#写字符
$word->Selection->TypeText("This is a test...");
#保存
$word->Documents[1]->SaveAs("Useless test.doc");
#关闭
$word->Quit();
?>
你只要花几分钟来读这个程序,并参考Word的OLE 技术文档,你将学到几乎是你在自己程序中所需的全部的操作。
MS Excel在使用PHP的COM函数
如同上面的Word的例子一样,你应学习这个例子的同时参考Excel的Visual Basic 编辑器中的对象浏览器的帮助文档。
#打开workbook和它的sheet,
#本例使用一个电子表格是Excel安装时自带的SOLVSAMP.XLS
$workbook = "C:Program FilesMicrosoft officeOfficeSamplesSOLVSAMP.XLS";
$sheet = "Quick Tour";
#实例化一个组件的对象
$ex = new COM("Excel.sheet") or Die ("Did not connect");
#取程序名称和版本
print "Application name:{$ex->Application->value}
" ;
print "Loaded version: {$ex->Application->version}
";
#打开工作本使我们可使用它
$wkb = $ex->application->Workbooks->Open($workbook) or Die ("Did not open");
#预保存原来的工作本,创建一个工作本的复本
$ex->Application->ActiveWorkbook->SaveAs("Ourtest");
#$ex->Application->Visible = 1; #本句去注释让Excel可见
# 读写一个单元格在一个新的工作表中
# 我们可以读到这个单元格 E11 (Advertising in the 4th. Quarter)
$sheets = $wkb->Worksheets($sheet); #Select the sheet
$sheets->activate; #Activate it
$cell = $sheets->Cells(11,5) ; #Select the cell (Row Column number)
$cell->activate; #Activate the cell
print "Old Value = {$cell->value}
"; #Print the value of the cell:10000
$cell->value = 15000; #Change it to 15000
print "New value = {$cell->value}
";#Print the new value=15000
#最后,用新值重新计算这个单元格
$sheets->Calculate;
#必须的如果要计算,手动则是可选的
#可看到效果总价值(E13单元格)
$cell = $sheets->Cells(13,5) ; #Select the cell (Row Column number)
$number = Number_format($cell->value);
print "New Total cost =$$number - was $47,732 before.
";
#根据计算公式,广告影响了公司的开销,这里将显示 $57,809
#使用Excel内建的函数
# PMT(percent/12 months,Number of payments,Loan amount)
$pay = $ex->application->pmt(0.08/12,10,10000);
$pay = sprintf("%.2f",$pay);
print "Monthly payment for $10,000 loan @8% interest /10 months: $ $pay
";
#Should print monthly payment = $ -1,037.03
#可选,保存
$ex->Application->ActiveWorkbook->SaveAs("Ourtest");
#关闭,不提问
$ex->application->ActiveWorkbook->Close("False");
unset ($ex);
?>
这个例子让你的PHP与Excel一同工作了,当然,也有更多的对象可以使用,访问一个自已写的OOP封装类也与访问excel一样容易。
用PHP的COM访问 Adobe Distiller
这最后一个例子不是MS程序了,如果你的程序有一个PostScript文件,你会对这个有兴趣的,改写(蒸馏)它成为一个PDF文档. Adobe 有一
个程序叫 Distiller ,它可以生成一个实例。代码如下:
$pdf = new COM("pdfdistiller.pdfdistiller.1");
?>
有一点要注意的,是在Distiller 的文档中给出的这个OLE标识名 "pdfdistiller" 是无效的。
蒸馏一个文件的最基本的方法是:
$pdf->FileToPdf ($psfile, strOutputPDF '', strJobOptions "");
?>
这 $psfile 是这个PostScript的文件名, strOutputPDF 是输出文件PDF的文件名。 StrJobOptions 是Distiller的参数文件名,最后两个参数
是可选的,默认是同一名字。 这PS文件名与PDF文件名,使用这个默认的Joboptions 文件。例如:
$pdf->FileToPdf ($psfile, "", "");
#这儿$psfile 可以是 Myfile.ps 将返回 Myfile.pdf 文件。
?>
在Distiller中有更多的方法和属性能被用。如果你感兴趣,请参考一下Adobe的技术文档。
中止/可能的问题
如果你的代码中发生了什么错误,你可能会创建了一个实例,但没有正常地关闭它。最糟的是,这个应用程序可能被这个实例所保持,结
果,在你的程序列表中就存在多份这个程序的副本,即使你更正了这个错误也会干扰你的结果。解决方法是:修正一个bug以来要及时清除它们
在你重新开始运行之前,用 并结束任务。同样的原因,在你的代码最后,也要及时关闭这个程序并删除这个实例。
你有一些技巧在处理 com_get 和 com_set的异常时。例如:
$Version = Com_get($instance->Application,"Version");
将会在Word中工作但在Excel中会产生一个错误。
有一些对象在PHP4中是不能实例化的,这是因为这个程序要一个自定义的接口,但PHP4不支持。
为什么我们要用它?
我希望这三个例子可以给你一些思考的线索,PHP的COM允许你在PHP的脚本中访问windows4的程序。这个代码比ASP简单并且能集成其它的
PHP对数据库强大的支持功能。Microsoft 在各个方面都大力销售这个COM 技术,在不同的名称和结构下,如 COM+(Combine COM with
Microsoft Transaction Server MTS), ADO, OLE DB, OWC, Windows DNA, 等等。 PHP 和 Apache的结合,提供了一个开放源码的解决方案。
[3]实现树状结构的两种方法
来源: 互联网 发布时间: 2013-11-30
实现树状结构的两种方法 1。递归法
递归是指在函数中显式的调用它自身。
利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢(在树的分支/层次较多的情况下尤其明显)。适用与写入数据量大,树的结构复杂的情况下。
数据结构(以mysql为例)
代码:--------------------------------------------------------------------------------
CREATE TABLE `tree1` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL default '0',
`topic` varchar(50) default NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`)
) TYPE=MyISAM;
INSERT INTO `tree1` (`id`, `parentid`, `topic`) VALUES
(1,0,'树1'),
(2,0,'树2'),
(3,0,'树3'),
(4,2,'树2-1'),
(5,4,'树2-1-1'),
(6,2,'树2-2'),
(7,1,'树1-1'),
(8,1,'树1-2'),
(9,1,'树1-3'),
(10,8,'树1-2-1'),
(11,7,'树1-1-1'),
(12,11,'树1-1-1-1');
--------------------------------------------------------------------------------
字段说明
id,记录的id号
parentid,记录的父记录id(为0则为根记录)
topic,记录的显示标题
显示程序
顺序树:
PHP代码:--------------------------------------------------------------------------------
<?
/* 数据库连接 */
mysql_connect();
mysql_select_db('tree');
/* 树状显示的递归函数 */
function tree($parentid = 0) {
/*执行sql查询,获取记录的标题和id*/
$sql = "select topic,id from tree1 where parentid = $parentid order by id asc";
$rs = mysql_query($sql);
/* 缩进*/
echo("<ul>");
while($ra = mysql_fetch_row($rs)) {
/* 显示记录标题 */
echo('<li>'.$ra[0].'</li>');
/* 递归调用 */
tree($ra[1]);
}
echo("</ul>");
}
tree();
?>
--------------------------------------------------------------------------------
逆序树:
PHP代码:--------------------------------------------------------------------------------
<?
/* 数据库连接 */
mysql_connect();
mysql_select_db('tree');
/* 树状显示的递归函数 */
function tree($parentid = 0) {
/*执行sql查询,获取记录的标题和id*/
$sql = "select topic,id from tree1 where parentid = $parentid order by id desc";
$rs = mysql_query($sql);
/* 缩进*/
echo("<ul>");
while($ra = mysql_fetch_row($rs)) {
/* 显示记录标题 */
echo('<li>'.$ra[0].'</li>');
/* 递归调用 */
tree($ra[1]);
}
echo("</ul>");
}
tree();
?>
--------------------------------------------------------------------------------
插入数据程序
PHP代码:--------------------------------------------------------------------------------
<?
/* 数据库连接 */
mysql_connect();
mysql_select_db('tree');
$sql = "insert into tree (topic,parentid) values('树3-1',3);";
mysql_query($sql);
?>
--------------------------------------------------------------------------------
2。排序字段法
此方法是通过在数据结构中增加一个标志记录在整个树中的顺序位置的字段来实现的。特点是显示速度和效率高。但在单个树的结构复杂的情况下,数据写入效率有所不足。而且顺序排列时候,插入,删除记录的算法过于复杂,故通常用逆序排列。
数据结构(以mysql为例)
代码:--------------------------------------------------------------------------------
CREATE TABLE `tree2` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL default '0',
`rootid` tinyint(3) unsigned NOT NULL default '0',
`layer` tinyint(3) unsigned NOT NULL default '0',
`orders` tinyint(3) unsigned NOT NULL default '0',
`topic` varchar(50) default NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`),
KEY `rootid` (`rootid`)
) TYPE=MyISAM
INSERT INTO `tree2` (`id`, `parentid`, `rootid`, `layer`, `orders`, `topic`) VALUES
(1,0,1,0,0,'树1'),
(2,0,2,0,0,'树2'),
(3,0,3,0,0,'树3'),
(4,2,2,1,2,'树2-1'),
(5,4,2,2,3,'树2-1-1'),
(6,2,2,1,1,'树2-2'),
(7,1,1,1,4,'树1-1'),
(8,1,1,1,2,'树1-2'),
(9,1,1,1,1,'树1-3'),
(10,8,1,2,3,'树1-2-1'),
(11,7,1,2,5,'树1-1-1'),
(12,11,1,3,6,'树1-1-1-1');
--------------------------------------------------------------------------------
显示程序
PHP代码:--------------------------------------------------------------------------------
<?
/* 数据库连接 */
mysql_connect();
mysql_select_db('tree');
/* 选出所有根记录id */
$sql = "select id from tree2 where parentid = 0 order by id desc";
$rs = mysql_query($sql);
echo("<ul>");
$lay = 0;
while($ra = mysql_fetch_row($rs)) {
echo("<ul>");
/* 选出此树所有记录,并按orders字段排序 */
$sql = "select topic,layer from tree2 where rootid = $ra[0] order by orders";
$rs1 = mysql_query($sql);
while($ra1 = mysql_fetch_row($rs1)) {
/* 缩进显示 */
if($ra1[1]>$lay) {
echo(str_repeat("<ul>",$ra1[1]-$lay));
}elseif($ra1[1]<$lay) {
echo(str_repeat("</ul>",$lay-$ra1[1]));
}
/* 记录显示 */
//echo("$ra1[1]>$lay");
echo("<li>$ra1[0]</li>");
$lay = $ra1[1];
}
echo("</ul>");
}
echo("</ul>");
?>
--------------------------------------------------------------------------------
插入数据程序
PHP代码:--------------------------------------------------------------------------------
<?
/* 数据库连接 */
mysql_connect();
mysql_select_db('tree');
/* 插入根记录 */
$sql = "insert into tree2 (topic) values ('树5')";
mysql_query($sql);
$sql = "update tree2 set rootid = id where id = ".mysql_insert_id();
mysql_query($sql);
/* 插入子记录 */
$parentid = 5;//父记录id
/* 取出 根记录id,父记录缩进层次,父记录顺序位置 */
$sql = "select rootid,layer,orders from tree2 where id = $parentid";
list($rootid,$layer,$orders) = mysql_fetch_row(mysql_query($sql));
/* 更新插入位置后记录的orders值 */
$sql = "update tree2 set orders = orders + 1 where orders > $orders";
mysql_query($sql);
/* 插入记录 */
$sql = "insert into tree2 (rootid,parentid,orders,layer,topic) values ($rootid,$parentid,".($orders+1).",".($layer+1).",'树2-1-1-2')";
mysql_query($sql);?>
最新技术文章: