http://www.downcc.com/网络编程zh-cnhttp://www.downcc.comCopyright 2023 http://www.downcc.com, All Rights Reserved2015/07/28 10:38:22http://www.downcc.com/tech/5453.htmlAsp编程2015/07/28 10:38:22<p>在本地iis服务器上可以正常上传图片的asp版百度ueditor编辑器,上传到网络服务器上,使用上传时错误,用firebug查看响应:uploader.class.asp中代码:fs.CreateFolder(path )无权限;经分析和测试,原来百度这个asp上传组件是采取逐级检测文件夹的机制,如:物理地址为:e:\website\www.downcc.com\upload\image\20150529\,它会从e:检测是否存在,但遇到网络服务器设置的比较安全的,不在当前网站的物理路径是不允许访问的,但程序认为是不存在路径,从而执行下面的创建文件夹的操作,建e:文件夹?肯定会显示无权限。<br style="TEXT-TRANSFORM: none; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; FONT: 14px/22px punctuation, 微软雅黑, Tohoma; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(68,68,68); WORD-SPACING: 0px; -webkit-text-stroke-width: 0px"/>其实问题也好解决,在检测过程中,先把本站所在根路径获取到,这个就不用检测了,只用检测本站根路径下的文件夹是否存在就好了,这个权限一般的虚拟主机服务器是有的,把百度的asp上传组件uploader.class.asp里的CheckOrCreatePath过程修改如下:<wbr/></p><p>Private&nbsp;<wbr/>Function&nbsp;<wbr/>CheckOrCreatePath(&nbsp;<wbr/>ByVal&nbsp;<wbr/>path&nbsp;<wbr/>)</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>Set&nbsp;<wbr/>fs&nbsp;<wbr/>=&nbsp;<wbr/>Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>Dim&nbsp;<wbr/>parts,serverpath</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>serverpath=lcase(Server.MapPath(&quot;/&quot;))</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>path=replace(lcase(path),serverpath,&quot;&quot;)&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/></p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>parts&nbsp;<wbr/>=&nbsp;<wbr/>Split(&nbsp;<wbr/>path,&nbsp;<wbr/>&quot;\&quot;&nbsp;<wbr/>)</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>path&nbsp;<wbr/>=&nbsp;<wbr/>&quot;&quot;&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/></p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/><wbr/><wbr/><wbr/><wbr/><wbr/><wbr/><wbr/></p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>For&nbsp;<wbr/>Each&nbsp;<wbr/>part&nbsp;<wbr/>in&nbsp;<wbr/>parts</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>path&nbsp;<wbr/>=&nbsp;<wbr/>path&nbsp;<wbr/>+&nbsp;<wbr/>part&nbsp;<wbr/>+&nbsp;<wbr/>&quot;\&quot;&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/></p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>If&nbsp;<wbr/>fs.FolderExists(&nbsp;<wbr/>serverpath&nbsp;<wbr/>&amp;&nbsp;<wbr/>path&nbsp;<wbr/>)&nbsp;<wbr/>=&nbsp;<wbr/>False&nbsp;<wbr/>Then</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>fs.CreateFolder(serverpath&nbsp;<wbr/>&amp;&nbsp;<wbr/>path&nbsp;<wbr/>)</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>End&nbsp;<wbr/>If</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>Next</p><p>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>&nbsp;<wbr/>End&nbsp;<wbr/>Function<wbr/></p><p>完美解决上传权限问题。&nbsp;<wbr/></p>http://www.downcc.com/tech/5422.html.Net编程2015/04/17 09:50:21<p><span style="line-height: 1em;">我们有时可能需要将 .Net 重新注册到 IIS 上面,可以用下面的命令行来操作。</span></p><p>如果您电脑已经安装了 IIS 然后再装.net 在安装过程中 .net 是会自动帮您注册的.</p><p>打开程序-运行-cmd:输入一下命令重新注册IIS<br/><img src="http://pic.pdowncc.com/upload/2015-4/2015041709521887471.jpg" alt=""/><br/><span style="color:#ff0000;">C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i</span></p><p><span style="color:#ff0000;">注册成功就可以在IIS里看到< /span></p><p><br/><strong>以下是aspnet_regiis.exe参数的说明信息:</strong><br/><br/>-i - 安装 ASP.NET 的此版本,并更新 IIS 元数据库根处的<br/>脚本映射和根以下的所有<br/>脚本映射。现有的低版本脚本映射<br/>升级到此版本。<br/>-ir - 安装 ASP.NET 的此版本,仅注册。不<br/>更新 IIS 中的脚本映射。<br/>-enable - 带 -i 或 -ir 指定 -enable 时,还将<br/>在 IIS 安全控制台(IIS 6.0 或更高版本)中启用 ASP.NET。<br/>-s& lt;path&gt; - 在指定的路径以递归方式安装此版本<br/>的脚本映射。现有的低版本脚本映射<br/>升级到此版本。<br/>例如 aspnet_regiis.exe -s W3SVC/1/ROOT/SampleApp1<br/>-sn& lt;path&gt; - 在指定的路径以非递归方式安装此版本的<br/>脚本映射。现有的低版本脚本映射<br/>升级到此版本。<br/>-r - 为 IIS 元数据库根位置的此版本<br/>以及根以下的所有脚本映射安装脚本映射。不论当前版本是什么,<br/>所有现有的脚本映射都<br/>更改为此版本。<br/>-u - 卸载 ASP.NET 的此版本。到此版本的<br/>现有脚本映射重新映射到此计算机上安装的<br/>其余的最高 ASP.NET 版本。<br/>-ua - 卸载计算机上的所有 ASP.NET 版本<br/>-k& lt;path&gt; - 从指定的路径中以递归方式移除到任何 ASP.NET 版本的所有<br/>脚本映射。<br/>例如 aspnet_regiis.exe -k W3SVC/1/ROOT/SampleApp1<br/>-kn& lt;path&gt; - 从指定的路径中以非递归方式移除到任何 ASP.NET 版本的所有<br/>脚本映射。<br/>-lv - 列出计算机上安装的所有<br/>ASP.NET 版本(包括状态和安装路径)。<br/>Status: Valid[ (Root)]|Invalid<br/>-lk - 列出包含 ASP.NET 脚本映射的所有 IIS 元数据库项的所有路径<br/>(连同版本一起)。不显示从父项<br/>继承 ASP.NET 脚本映射的项。<br/>-c - 将客户端脚本的此版本安装到<br/>每个 IIS 站点目录的 aspnet_client 子目录中。<br/>-e - 从每个 IIS 站点目录的 aspnet_client 子目录中<br/>移除客户端脚本的此版本。<br/>-ea - 从每个 IIS 站点目录的 aspnet_client 子目录中<br/>移除客户端脚本的所有版本。<br/>-? - 打印此帮助文本。<br/></p>http://www.downcc.com/tech/3633.html.Net编程2015/03/09 16:23:35<p>用<a href="http://www.downcc.com/soft/9014.html" target="_blank" textvalue="Visual Studio .NET 2003">Visual Studio .NET 2003</a>打开,因为它是个网页编程文件。但如果想正常在本机浏览这个网页,需要使用IIS,不能进行普通打开。否则会提示IE下载</p><p>1、打开IIS,(没有安装则要到&quot;添加删除程序&quot;里安装)<br/>2、找到&quot;默认网站&quot;,右键点击<br/>3、在弹出的菜单中选择&quot;新建--虚拟目录&quot;<br/>4、按照向导提示完成向导,具体方法如下:<br/>1、跳过欢迎界面,随便启一个别名。(如&quot;abcd&quot;不含引号)<br/>2、提示寻找目录,找到你那个ASPX文件所在的目录。<br/>3、权限按默认(前两个选择,后三不选)即可<br/>5、向导完毕,打开&quot;默认网站&quot;前的&quot;+&quot;号<br/>6、找到&quot;abcd&quot;(不含引号,刚才创建的目录别名),点击它<br/>7、在右边的窗口找到那个ASPX文件,右键点击,选择浏览</p><p>方可浏览该网页文件,同样,ASP文件也可以用该方法浏览</p><p>而如果要浏览该文件的源代码,直接用记事本即可,但我推荐使用Dreamweawer,下面以<a href="http://www.downcc.com/soft/821.html" target="_blank">Dreamweawer8</a>为例,其他版本相似:<br/>1、建立IIS,按照上文方法建立,仅执行12345步即可,67步可不执行<br/>2、打开Dreamweawer,选择&quot;站点--新建站点&quot;,启一个网站名字。<br/>(如&quot;abcd&quot;不含引号)<br/>3、服务器技术选择&quot;ASP VBscript&quot;<br/>4、找到ASPX文件存储的目录,下一步<br/>5、输入http://localhost/虚拟目录名/ (结尾的&quot;/&quot;至关重要)<br/>假如虚拟目录名为qwer,则输入<br/>http://localhost/qwer/<br/>保险点最好测试以下URL前缀<br/>6、不使用远程服务器,下一步即可</p><p>哈哈,成功了。以后改变后浏览直接使用Dreamweawer自带的浏览即可,不必打开IIS</p><p>提示:Visual Studio .NET 2003有同样的效果,</p><p>如果你只需要浏览网页,不需要编辑,直接使用IIS即可,不需要使用什么Visual Studio .NET 2003和Dreamweawer</p>http://www.downcc.com/tech/3565.html.Net编程2015/02/28 11:00:41<p>引起这个的原因大概是现安装了<span style="COLOR: #41b80f">.Net Framework</span>后装的IIS导致.Net没有在IIS里注册。< br/><br/>在网上找了很久都是说从.net命令行工具里运行aspnet_regIIS /i就可以了(或者在类似下面的目录:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i),但是自己试了很多次都不行,后来发现还是要先卸载再安装,重新创建为应用程序才行,具体如下:< br/><br/>从.net命令行工具里运行 aspnet_regIIS /u 卸载,再aspnet_regIIS /i安装< br/>然后重启IIS ,删除“默认应用程序”,然后将站点重新创建为应用程序。< br/><br/>另外,还有可能是ASPNET账户没有IIS所指定服务器目录的权限。在资源管理器中找到“工具-文件夹选项-查看-使用简单文件夹共享(推荐)”,把前面的勾去掉,然后在服务器指定目录上点右键,属性-安全-添加-高级-立即查找,把ASPNET这个账户添加进去,给它指定完全访问的权限。这样做了以后就会发现没有了那个错误,不过如果访问数据库可能有会提示ASPNET这个账户没有权限访问数据库。这个提示就清楚多了,把该账户在数据库中加入相应的权限就可以了。< br/><br/><strong>解决方法一 重新注册.Net 2.0:< br/></strong>C:WINDOWSMicrosoft.NetFrameworkv2.0.50727as.Net_regiis.exe –i< br/><br/><strong>解决方法二 新建应用程序池:</strong>< br/>新建应用程序池的步骤< br/>1. 单击“开始”,指向“程序”,然后单击“控制面板”。< br/>2. 双击“管理工具”,然后双击“Inte.Net 信息服务 (IIS)”。< br/>3. 右键单击“应用程序池”,指向“新建”,然后单击“应用程序池”。< br/>4. 在“应用程序池 ID”文本框中键入 AppPool1。< br/>5. 单击“确定”。< br/><br/><strong>将应用程序分配到应用程序池</strong>< br/>1. 单击“开始”,指向“程序”,然后单击“控制面板”。< br/>2. 双击“管理工具”,然后双击“Inte.Net 信息服务 (IIS)”。< br/>3. 双击“Web 站点”。< br/>4. 双击“默认 Web 站点”。< br/>5. 右键单击“DebugApp1”,然后单击“属性”。< br/>6. 在“主目录”标签中的“应用程序池”列表框中选择“AppPool1”,然后单击“确定”。< br/><br/><strong>解决方法三,修改网站目录所在文件夹的访问权限:</strong>< br/><br/>找到当前网站目录-&gt;右键-&gt;属性-&gt;安全-&gt;添加-&gt;高级-&gt;立即查找-&gt;选择 Users 用户 -&gt;确定-&gt;确定< br/><br/><strong>解决办法:</strong>< br/>1、新建一个应用程序池,点属性,标识,选择应用程序池的安全性帐户,本地系统,OK!< br/>2、WEB文件夹属性中的权限添加NetWork Service帐号权限。< br/>至此,网站可以正常运行.NET程序了</p>http://www.downcc.com/tech/4114.htmlPHP编程2015/02/19 15:54:57<p><strong>一、下载</strong></p><p>先到互联网上下载&nbsp;phpMyAdmin,也可以到&nbsp;phpMyAdmin&nbsp;官方网站下载,地址为:<a href="http://www.downcc.com/soft/10956.html" target="_blank" textvalue="http://www.downcc.com/soft/10956.html">http://www.downcc.com/soft/10956.html</a>&nbsp;再解压到&nbsp;web&nbsp;可以访问的目录下,如果是虚拟空间,可以解压后通过&nbsp;ftp&nbsp;工具上传到&nbsp;web&nbsp;目录下,同时您可以修改解压后该文件的名称。</p><p><strong>二、配置</strong></p><p>打开&nbsp;libraries&nbsp;目录下的&nbsp;config.default.php&nbsp;文件,依次找到下面各项,按照说明配置即可。</p><p>1、&nbsp;&nbsp;访问网址</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840116.png"/></p><p>2、&nbsp;&nbsp;&nbsp;&nbsp;MySQL&nbsp;主机信息</p><p>填写&nbsp;localhost&nbsp;或&nbsp;MySQL&nbsp;所在服务器的&nbsp;ip&nbsp;地址,如果&nbsp;MySQL&nbsp;和该&nbsp;phpMyAdmin&nbsp;在同一服务器,则按默认&nbsp;localhost</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840210.png"/></p><p>MySQL&nbsp;端口,默认为&nbsp;3306,保留为空即可,如果您安装&nbsp;MySQL&nbsp;时使用了其它的端口,需要在这里填写。</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840124.png"/></p><p>3、&nbsp;&nbsp;MySQL&nbsp;用户名和密码</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840760.png"/></p><p>4、&nbsp;&nbsp;&nbsp;认证方法</p><p>在此有四种模式可供选择,cookie,http,HTTP,config;<br/>config&nbsp;方式即输入&nbsp;phpMyAdmin&nbsp;的访问网址即可直接进入,无需输入用户名和密码,是不安全的,不推荐使用。<br/>当该项设置为&nbsp;cookie,http&nbsp;或&nbsp;HTTP&nbsp;时,登录&nbsp;phpMyAdmin&nbsp;需要数据用户名和密码进行验证,具体如下:<br/>PHP&nbsp;安装模式为&nbsp;Apache,可以使用&nbsp;http&nbsp;和&nbsp;cookie;<br/>PHP&nbsp;安装模式为&nbsp;CGI,可以使用&nbsp;cookie。</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840649.png"/></p><p>5、&nbsp;短语密码(blowfish_secret)的设置</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840601.png"/></p><p>6、&nbsp;修改界面语言</p><p>修改此属性为zh[简体中文]</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293840954.png"/></p><p>7、&nbsp;&nbsp;测试PhpMyAdmin</p><p style="TEXT-INDENT: 0px"><img style="CURSOR: pointer" title="点击查看大图" alt="" src="http://pic.pdowncc.com/upload/tech/UploadPic/2012-8/20128293841307.png"/></p>http://www.downcc.com/tech/3557.htmlPHP编程2015/02/18 15:38:02<p>PHP中session详解< br/>  综述< br/>  Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。< br/>  一般来说,在网站上某一个页面中的变量(指服务器端变量,下同)是不能在下一页中用的,有了session就好办了。session中注册的变量可以作为全局变量使用。这样我们就可以将session用于用户身份认证,程序状态记录,页面之间参数传递。< br/>  在PHP3版本中是如何实现session的?< br/>  php3本身是没有实现session功能的,我们只有用其他的方法来实现,这其中最有名的要算phplib了。phplib最基本的功能包括用户认证、Session管理、权限及数据库的抽象化。下面我们就讲述一下如何用phplib实现session。< br/>  1、首先安装phplib(环境为win2000+<a href="http://www.downcc.com/soft/5705.html" target="_blank" textvalue="php">php</a>3.0.16+<a href="http://www.downcc.com/soft/225.html" target="_blank" textvalue="Apache">Apache</a>1.3.12+phplib7.2c+<a href="http://www.downcc.com/soft/5690.html" target="_blank" textvalue="mysql">mysql</a>3.23.21 for win32)< br/>  首先将phplib解开,里面有一个&quot;php&quot;目录,将这个目录拷贝到Apache的安装目录下。例如:Apache安装在d:\Apache 目录下,那么就将&quot;php&quot;目录拷贝到d:\Apache,并将phplib目录的pages目录下(不包括目录本身)的文件和目录一起拷贝到d:\Apache\htdocs下。< br/>  phplib的类库需要根据系统进行初始化,可能需要修改local.inc文件,其中包含着一些基本参数,可以根据自己机器的实际情况来进行修改。< br/>  将d:\Apache\php\prepend.php文件中的一段程序改为如下样子:< br/>    if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {< br/>      $_PHPLIB[&quot;libdir&quot;] =& quot;d:/Apache/php/&quot;; //放phplib下php目录的路径< br/>    }< br/>  修改d:\Apache\php\local.inc文件:< br/>    class DB_Example extends DB_Sql {< br/>      var $Host =& quot;localhost&quot;; //mysql数据库所在主机名< br/>      var $Database =& quot;test&quot;; //数据库名< br/>      var $User =& quot;root&quot;; //数据库用户名< br/>      var $Password =& quot;1234567&quot;; //数据库用户密码< br/>    }< br/>  最后根据phplib目录下的stuff子目录中的create_database.mysql文件生成初始表。< br/>  由于每一个使用phplib的页面首先必须可以找到运行phplib所必需的类库文件,我们可以在php.ini中设置auto_prepend变量来支持,phplib中包含一个prepend.php文件,并将auto_prepend指定为&quot;d:/Apache/php/prepend.php&quot;(带引号)后,各页面就会自动包含phplib类库,我们还可以将phplib类库所在目录加进include变量中,以便可以找到这些文件。< br/>2、调用page_open()函数< br/>  在每一个使用phplib的页面中,必须首先调用page_open函数进行初始化,例如:< br/>  <?php< br/>  page_open(array(&quot;sess&quot; =>& quot;Test_Session&quot;));< br/>  ?>< br/>  数组变量(sess)用来初始化一些状态保存对象,这里应该注意:必须使用phplib内置名(sess),这些内置名是在local.inc中所定义的.。< br/>  因为phplib使用了Cookies来保存状态信息,所以page_open()函数必须在页面内容输出到浏览器之前被调用。php脚本最后应以page_close()结束,这将会将有关状态数据写回到数据库中,否则变量会丢失。< br/>  3、具体使用。< br/>  注册一个变量后即可在随后的页面中使用它,直至session结束。方法:< br/>    <?php $sess->register(& quot;varname&quot;); ?>< br/>  注意,这里的varname不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改变变量的值,随后的页面访问该变量时会得到改变后的值。变量的类型是多样的,可以是一个字符串,一个数字,一个数组。举例来说明:< br/>  第一页:< br/>    <?php< br/>    page_open(array(&quot;sess&quot; =>& quot;Test _Session&quot;));< br/>    $sess->register(& quot;welcome&quot;); //注册变量$welcome,注意不需要加$< br/>    $welcome=&quot;Hello,PHP world!&quot;;< br/>    ……< br/>    page_close();< br/>    ?>< br/>  第二页:< br/>    <?php< br/>    page_open();//开始session< br/>    echo $welcome;//显示第一页中定义的$welcome< br/>    page_close();//保存状态信息< br/>    ?>< br/>  注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果忘记调用page_close()函数的话,变量就不会被写回数据库,这样将出现不可预知的后果。当变量被使用完毕,不再需要用到时,可以调用以下函数将变量删除:< br/>    <?php< br/>    page_open(array(&quot;sess&quot; =>& quot;Test _Session&quot;));< br/>    ……< br/>    $sess->unregister(& quot;variable_name&quot;);< br/>    ……< br/>    page_close();< br/>    ?>< br/>  在PHP4版本中是如何实现session的?< br/>  php4的session也靠cookies保存session id,用文件系统保存变量(默认情况下),因此,它的session变量不能保存对象。当然也可以将session保存在数据库中。< br/>  在php4中有关session的函数很多(详见php.ini配置一文),通常情况下我们只需要调用三个函数即可:sesssion_start()、session_register()、session_is_registered()。< br/>  在需要用到session的每一页的最开始处调用session_start()函数, 例如:< br/>    <?session_start()?>< br/>    <html><body>< br/>    <?< br/>    $welcome=&quot;hello world !&quot;;< br/>    session_register(&quot;welcome&quot;);//注册$welcome变量,注意没有$符号< br/>    if(session_is_registered(&quot;welcome&quot;))//检查$welcome变量是否注册< br/>      echo& quot;welcome变量已经注册了!&quot;;< br/>    else< br/>      echo& quot;welcome变量还没有注册!&quot;;< br/>    ?>< br/>    </body></html>< br/>  php4中session处理的定制< br/>  我们需要扩充6个函数:< br/>    sess_open($sess_path, $session_name);< br/>    这个函数被session处理程序调用来作初始化工作。< br/>    参数$sess_path对应php.ini文件中的session.save_path选项< br/>    参数$session_name对应php.ini中的session.name 选项。< br/>    sess_close();< br/>    这个函数在页面结束执行并且session处理程序需要关闭时被调用< br/>    sess_read($key);< br/>    这个函数在session处理程序读取指定session键值($key)时,检索并返回标识为$key的session数据.(注意:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。)< br/>    sess_write($key, $val);< br/>    这个函数据在session处理程序需要将数据保存时调用,这种情况经常在程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。< br/>    sess_destroy($key);< br/>    这个函数在需要消毁session时。它负责删除session并且清除环境。< br/>    sess_gc($maxlifetime);< br/>    这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。< br/>  定制程序可以用mysql数据库或DBM文件保存session数据,视具体的情况而定。如果使用mysql作支持,那还需要进行以下的步骤:< br/>  首先在mysql中创建一个sessions数据库,并且创建一个sessions表:< br/>  mysql> CREATE DATABASE sessions;< br/>  mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost< br/>    -> IDENTIFIED BY& #39;phpsession&#39;;< br/>  mysql> CREATE TABLE sessions (< br/>    -> sesskey char(32) not null,< br/>    -> expiry int(11) unsigned not null,< br/>    -> value text not null,< br/>    -> PRIMARY KEY (sesskey)< br/>    -> );< br/>  下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置:< br/><?< br/>$SESS_DBHOST=& quot;localhost&quot;; /* 数据库主机名 */< br/>$SESS_DBNAME=& quot;sessions&quot;; /* 数据库名 */< br/>$SESS_DBUSER=& quot;phpsession&quot;; /* 数据库用户名 */< br/>$SESS_DBPASS=& quot;phpsession&quot;; /* 数据库密码 */< br/>$SESS_DBH=& quot;&quot;;< br/>$SESS_LIFE= get_cfg_var(&quot;session.gc_maxlifetime&quot;);< br/>……//定制函数< br/>session_set_save_handler(& quot;sess_open&quot;,& quot;sess_close&quot;,& quot;sess_read&quot;,& quot;sess_write&quot;,& quot;sess_destroy&quot;,& quot;sess_gc&quot;);< br/>?>< br/>  定制使用dbm文件时的接</p>http://www.downcc.com/tech/5383.htmlPHP编程2014/10/25 18:02:13<p>本文实例讲述了PHP利用header跳转失效的解决方法,分享给大家供大家参考。具体方法分析如下:</p>< p><strong>一、问题:</strong></p>< p>今天header(\&quot;Location: $url\&quot;),以往跳转总是可以的,今天却不动,只是输出结果,以往自己要确认检查,$url的值获取的是否正确,所以在前面加了echo $url;来调试用,结果就导致了header函数的无效.</p>< p><strong>二、解决方法:</strong></p>< p>在PHP中用header(&quot;location:test.php&quot;)进行跳转要注意以下几点:</p>< p>1、location和&ldquo;:&rdquo;号间不能有空格,否则会出错.//downcc.com</p>< p>2、在用header前不能有任何的输出,包括include的页面中标签&ldquo;?&gt;&rdquo;后不能有空格.</p>< p>3、header后的PHP代码还会被执行.</p>< p>PHP的 header 跳转之前不能有任何内容输出,因为PHP开始执行的时候就已经向浏览器送出HTTP头信息,之后就不再允许更改了.</p>< p>但是如果必须要在输出之后再处理header信息的话可以使用 ob_start() ob_end_flush() 来缓存一下要发送的内容,等到header继续再发送内容.</p>< p>或者一个更简单的办法,修改php.ini,找到 output_buffering=Off 修改为 output_buffering=4096.</p>< p>希望本文所述对大家的PHP程序设计有所帮助。</p>http://www.downcc.com/tech/5265.htmlAsp编程2014/04/07 13:58:52<p><span style="color: rgb(255,0,0)">PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于c语言,被广泛的运用。<br />< /span></p>< p><span style="color: rgb(255,0,0)">ASP是Active Server Page的缩写,意为&ldquo;动态服务器页面&rdquo;。ASP是微软公司开发的代替CGI脚本程序的一种应用,它可以与<a target="_blank" href="http://www.downcc.com/zhuanti/sql.html">数据库</a>和其它程序进行交互,是一种简单、方便的编程工具。ASP的网页文件的格式是.asp,现在常用于各种动态网站中。另外阿斯匹林、天门冬氨酸、阿里软件销售合作伙伴、美国武装系统暨程序公司等的缩写也都为ASP。 PHP是一种编写网站的技术语言,ASP也是编写网站的一种语言。</span></p>< p>但是为什么PHP如今能成为一种主流呢,因为他开放源代码,就像如今的手机安卓系统一样,他是基于Linux系统开发的。开源的话用户可以随便设置自己想要的功能。所以相对ASP而言PHP的安全性也是比较高的。这个是ASP没办法比的 。不过他们做出来的效果都是差不多的。。ASP是最早的网页编程语言。</p>< p><strong>ASP</strong>:</p>< p>1.使用VBScript 、 JScript等简单易懂的脚本语言,结合HTML代码,即可快速地完成网站的应用程序。< br /> 2. 无须compile编译,容易编写,可在服务器端直接执行。< br /> 3. 使用普通的文本编辑器,如Windows的记事本,即可进行编辑设计。< br /> 4. 与浏览器无关(Browser Independence), 客户端只要使用可执行HTML码的浏览器,即可浏览Active Server Pages所设计的网页内容。Active ServerPages 所使用的脚本语言(VBScript 、 Jscript)均在web服务器端执行,客户端的浏览器不需要能够执行这些脚本语言。< br /> 5.Active Server Pages能与任何ActiveX scripting语言兼容。除了可使用VB Script或JScript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其它脚本语言,譬如REXX 、Perl 、Tcl等。脚本引擎是处理脚本程序的COM(Component Object Model) 对象。< br /> 6. 可使用服务器端的脚本来产生客户端的脚本。< br /> 7. ActiveX Server Components(ActiveX 服务器组件 )具有无限可扩充性。可以使用Visual Basic 、Java 、Visual C++ 、COBOL等程序设计语言来编写你所需要的ActiveX Server Component 。</p>< p><strong>PHP:</strong><br /> 1.数据库连接< br /> PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的群组合。你还可以自己编写外围的函数去间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松地修改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。但PHP提供的数据库接口支持彼此不统一,比如对Oracle, MySQL,Sybase的接口,彼此都不一样。这也是PHP的一个弱点。< br /> 两种不同的动态网页设计语言,ASP是微软开发的,主要用于WINDOWS平台,编写格式和语言不一样。ASP 多数用 VBScript 书写, JavaScript用一些辅助;PHP 的交互性能比 ASP 好,安全性也好,主要在LINUX平台下。</p>http://www.downcc.com/tech/5076.html.Net编程2013/10/15 10:09:48<p><strong>win8 RP8000的.net framework3.5安装方法</strong></p>< p>将Win8 ISO文件里的source目录里的sxs目录,放入C盘,也就是装Win8的盘成为C:\SxS (必须是这个目录,其他路径无效!!)</p>< p>然后用管理员模式运行cmd 黏贴<br />< br /> Dism.exe /online /enable-feature /featurename:NetFX3 /Source:c:\sxs /LimitAccess<br />< br /> 稍等10分钟 就完成了</p>http://www.downcc.com/tech/5075.html.Net编程2013/10/14 22:16:21<p>&nbsp;-.net framework是一个重新包装的windows操作系统的应用程序接口库(API Library);<br /> - .NET Framework是一个类似java虚拟机的运行时(Common Language Runtime),借了java 虚拟机的很多概念,但机制更优化(比如它有java所没有的&ldquo;确定的垃圾收集器&rdquo;机制Deterministic Garbage Collection,强制资源在指定点回收);<br /> - 定义了一个共同中间语言(Common Intermediate Language),所有语言都先编译到这个CIL,使得不同语言开发的程序(VB,C#,J#等等)可以在同一机制下运行,并且可以无缝配合工作。<br /> - .NET Framework是操作系统服务和应用程序的桥梁,是一个应用软件抽象层。<br />< br />< strong>.NET Framework不是什么?<br />< /strong>- 并不包括新的windows内核代码<br /> - 并没有增加Windows的操作系统一级的功能,它只是OS功能的延伸<br /> - 并不会加快windows的速度<br />< br /> 所以,.NET framework主要是一个程序架构,在这个架构下,程序员可以快速高效地开发高质量的软件。但因为它是一个中间抽象层,所以基于.net framework的软件一般会比直接针对windows API开发的程序速度慢。就好比从前你要盖一个违章建筑,要自己买原始的建筑材料,比如砖,水泥,要知道如何用砖和水泥砌成一堵墙,但现在.net framework已经提供了很多可以灵活配置的半成品部件,包括&ldquo;墙&rdquo;,你直接装上用就是了,质量往往比你自己买砖和水泥砌的墙还好,但当然这个配置的&ldquo;墙&rdquo;一般没有你自己砖一瓦砌起来的墙对你自己的胃口。<br />< br /> .net framework一般比较适合开发在pc上运行的桌面软件和企业级的软件,但可能基于下面两个原因,Microsoft推出在移动设备上运行的.net CF(compact framework):<br /> 1)Java 早就有了在移动设备上运行的 J2ME(Java Micro Edition),是J2SE(Java Standard Edition)的子集,微软在产品线上必须跟它竞争;<br /> 2)移动设备大行其道,很多企业级的系统需要整合到移动设备上,使移动设备成为这些系统的终端,而很多新的企业级系统是针对.NET framework开发的,那么使用.net CF开发手机端程序可以很方便整合到服务器端系统上(比如用.net remoting直接访问服务器端的.net应用)。<br />< br /> 在PC上,.net framework经历了几代:从1.1,到2.0到3.0以致最新的3.5,需要说明的是,这几代产品并不是完美向下兼容的,也就是说,你装了.net 2.0并不一定能运行针对.net 1.1开发的软件,而往往要同时装上1.1才行。但是在PPC上的.net compact framework据说是向下兼容的(我试过装了3.5是可以运行现有的.net CF 软件),你装一个3.5就应该可以运行基于任何以前版本开发的软件了。<br />< br /> .net CF 2.0据说效率并不高,起码我装的几个2.0的软件,感觉是比较慢。3.5据说优化了很多,但问题是,3.5才刚出来没多久,针对3.5的软件还几乎没有,所以还无从证实3.5是否真的比2.0快了很多。只是因为3.5向下兼容2.0的原因,我自己把3.5刷进去是为了确保以后能运行所有基于.net CF的软件而已。<br />< br /> 所以我估计很多ppc软件开发商还对.net CF持观望态度,移动设备对软件性能要求比较苛刻,就这一点也足以令人不敢贸然使用了。不过用.net framework开发软件真的很方便,尤其是微软的.net开发工具做得很强大,这是它比较成功的地方<br />< br /> 有些PPC软件一定要安装.NET Compact Framework 才支持运行<br />< br /> 本程序包使用 ActiveSync 4.0 及以上版本来更新设备,更多信息请参见 Windows Mobile Center。请确保在运行 NETCFSetupv35.msi 之前连接好您的设备。如果未连接设备,ActiveSync 会存储 CAB 文件,直到您连接了设备后才进行更新。不使用 ActiveSync 的用户可以直接在设备上运行与安装文件夹中的找到的设备相匹配的 CAB 文件。</p>http://www.downcc.com/tech/5074.html.Net编程2013/10/14 22:15:05<p>安装 .Net Framework4,怎么安装都不行,老是提示&ldquo;安装未成功&rdquo;、&ldquo;沿未安装.NET Framework 4 ,原因是:一般信任关系失败。&rdquo;。没办法只能先放放这些比较特殊的机器了,让他们休息休息!< br />< br /> 出现这个问题的原因是dll文件注册不正确,需要重新注册Softpub.dll, Wintrust.dll, Initpki.dll, and Mssip32.dll这四个dll文件。<br />< br /> 如果您尝试安装 .net framwork 4时出现『安装未成功』、因为『一般信任错误』时,如下图所示:</p>< p style="text-indent: 0px"><img title="点击查看大图" alt="" style="cursor: pointer" src="http://pic.pdowncc.com/upload/tech/UploadPic/2013-10/20131014221555959.jpg" /></p>< p>这是因为您系统中的DLL注册存在问题,请按以下步骤解决问题:</p>< p>按Win(Windows徽章键)+R,弹出运行对话框,输入『<strong>cmd</strong>』然后回车;</p>< p>在弹出来的窗口中,依次输入下面的内容并回车:『<strong>regsvr32 /s Softpub.dll</strong>』,『<strong>regsvr32 /s Wintrust.dll</strong>』,『<strong>regsvr32 /s Initpki.dll</strong>』,『<strong>regsvr32 /s Mssip32.dll</strong>』</p>< p>再重新安装。< br />< br />< span style="color: #ff0000">在命令行中运行以下命令:<br />< /span>regsvr32 /s Softpub.dll<br /> regsvr32 /s Wintrust.dll<br /> regsvr32 /s Initpki.dll<br /> regsvr32 /s Mssip32.dll</p>< p>还有的用户<span style="color: #ff0000">主要是由于我系统登录的帐号不是Admin权限</span> ,所有报那个错误!</p>http://www.downcc.com/tech/5073.html.Net编程2013/10/14 22:12:19<p>原本将Microsoft .NET Framework 4.0删除后,再安装时,就出现了这样的情况&ldquo;Microsoft .NET Framework 4.0安装时发生严重错误& rdquo;</p>< p>尝试了多种方法后,才解决了问题,解决我问题的是第3种方法,重新下载安装 .NET Framework 4.0独立安装包,成功,但是不是这种方法适合所有的朋友,而下面收集的几种方法是适合不同的朋友的,如果你遇到了此问题,请参考一下。<br />< br />< strong>方法一:<br />< /strong><br /> 第一步:如果是XP系统,这么做:<br />< br /> 1.开始&mdash;&mdash;运行&mdash;&mdash;输入cmd&mdash;&mdash;回车&mdash;&mdash;在打开的窗口中输入net stop WuAuServ<br />< br /> 2.开始&mdash;&mdash;运行&mdash;&mdash;输入%windir%<br />< br /> 3.在打开的窗口中有个文件夹叫SoftwareDistribution,把它重命名为SDold<br />< br /> 4.开始&mdash;&mdash;运行&mdash;&mdash;输入cmd&mdash;&mdash;回车&mdash;&mdash;在打开的窗口中输入net start WuAuServ<br />< br />< strong>第二步:<br />< /strong><br /> 1.开始&mdash;&mdash;运行&mdash;&mdash;输入regedit&mdash;&mdash;回车<br />< br /> 2.找到注册表,HKEY_LOCAL_MACHINE\SOFWARE\Microsoft\Internet Explorer下的<br />< br /> MAIN子键,点击main后,在上面菜单中找到&ldquo;编辑&rdquo;&ndash;&ldquo;权限&rdquo;,点击后就会出<br />< br /> 现&ldquo;允许完全控制&rdquo;等字样,勾上则可。出现这种情况的原因,主要是用ghost做的系统,有很多系统中把ie给绑架了。<br />< br />< strong>第三步:安装 Net.Framework4.0<br />< /strong><br />< strong>方法二:<br />< /strong><br /> 可能是.NET Framework 4.0没有删除完整的缘故,所以导致了.NET Framework 4.0无法正常的安装,那么就需要借助微软的.NET Framework 自动清理工具,该方法在微软问题集里有了详细的图文说明,我就不转了,大家请前往。<br />< br /> http://support.microsoft.com/kb/2497934/zh-cn<br />< br />< strong>方法三:<br />< /strong><br /> 重新下载安装Microsoft .NET Framework 4 ,下载地址:<a target="_blank" href="http://www.downcc.com/soft/8931.html">http://www.downcc.com/soft/8931.html</a></p>http://www.downcc.com/tech/5032.htmlPHP编程2013/08/30 13:49:12<p>总结3种在PHP中常用的页面跳转方法,具体如下。</p>< p><strong>方法1: PHP中 header() 函数</strong></p>< p>&lt;?php<br /> header(&quot;Location:http://www.downcc.com&quot;);<br /> ?&gt;</p>< p>注意:<br /> 1. location 与 : 之间不能有空格,否则不会跳转。<br /> 2. header()前不能有任何的输出。<br /> 3. header()之后的PHP代码还会被执行。</p>< p><strong>方法2: Meta标签</strong></p>< p>Meta标签是HTML中负责提供文档元信息的标签,在PHP程序中使用该标签,也可以实现页面跳转。 若定义http-equiv为refresh,则打开该页面时将根据content规定的值在一定时间内跳转到相应页面。若设置content=&rdquo;秒数;url=网址&rdquo;,则定义了经过多长时间后页面跳转到指定的网址。</p>< p>&lt;html&gt;<br />& lt;head&gt;<br />& lt;meta http-equiv=&quot;refresh&quot;content=&quot;1;url=http://www.downcc.com&quot;&gt;<br />& lt;title&gt;HTML标题&lt;/title&gt;<br />& lt;/head&gt;<br />& lt;content&gt;我爱PHP!&lt;/content&gt;<br />& lt;/html&gt;</p>< p><strong>方法3: javascript实现</strong></p>< p>&lt;script language=&quot;javascript&quot;type=&quot;text/javascript&quot;&gt;<br /> location.href =http://www.downcc.com;<br />& lt;/script&gt;</p>http://www.downcc.com/tech/4966.htmlAsp编程2013/08/12 10:30:13<p>问:安装了IIS,怎么ASP文件打不开</p>< p>我现在暂时没有连上互联网。我安装了<a target="_blank" href="http://www.downcc.com/soft/9687.html">IIS</a>,但本地机子上的ASP文件打不开。提示要选择程序,但缺没有IE。打开IE,用文件》打开的方式也打不开。</p>< p>问题补充:我的是2000Server,已经安了IIS,但打开ASP文件的时候,就提示选择程序,但却没有IE的选项。用记事本打开都是代码。</p>< p>答:你安装了IIS只能在IIS里面建一个账号,以浏览的方式来浏览网站(仅限于ASP,ASPX就不行了),如果你单击文件要打开,那就是表示你要用编辑软件来对这个文件进行编辑,你没有装网页制作的软件时,系统会提示你选择程序,你可以选择记事本,如果你懂代码的话就可以用记事本打开后进行编辑了.ASP的文件不同于HTML文件,无法用浏览器直接浏览的.所以你要在IIS上新建一个站点,然后点击浏览就可以看到网页,要修改页面内容就得用<a target="_blank" href="http://www.downcc.com/soft/12133.html">DW</a>等网页编辑软件来修改了,用记事本也行,只要你认识它的话.</p>< p>问:原本是静态的网站,改为动态网站(asp),IIS的默认路径已经更改了。可是ASP文件浏览不了.你在搜索浏览找到的答案都解决不了的情况下,试下这个</p>< p>答:重新把IIS注册一下,命令:aspnet_regiiis -i .注意,为什么要这样呢?因为IIS和<a target="_blank" href="http://www.downcc.com/soft/848.html">.net</a>框架安装是有先后顺序的.[具体操作:在运行了键入cmd,然后转到c盘,在键入cd C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322,最后键入aspnet_regiis -i</p>< p>试试吧,应该没问题了.</p>http://www.downcc.com/tech/4916.htmlAsp编程2013/07/17 14:57:10<p>一个批处理清理了一下电脑垃圾,结果ACC数据库就出错。</p>< p>&nbsp;<span style="font-size: 14pt"><strong>系统环境</strong></span><br /> Windows 2003+IIS6+NTFS<br /> ASP+Access<br />< br />< span style="font-size: 14pt"><strong>错误信息</strong></span><br /> Microsoft JETDatabase Engine 错误 '80004005' 未指定的错误<br />< br />< span style="font-size: 14pt"><strong>故障原因</strong></span><br /> 此类错误一般出现于文件系统为NTFS格式中,是IIS匿名帐号(<strong>IUSR_计算机名</strong>)对相关文件、文件夹操作权限不足引起的。<br /> 一、存放数据库文件夹对IIS匿名帐号没有写入、修改权限,错误表现为无法对数据库进行更新、写入<br /> 二、 系统临时文件夹目录对IIS匿名帐号没有写入、修改权限,错误表现为访问服务器上任何采用Microsoft JET Database Engine 链接Access类数据库的文件都是出错。正常情况下是不会出现这个错误的,当使用某些系统垃圾清理优化工具、或其它一些因素可能会导致这个目录权限发生 改变。所以请慎重使用此类工具。<br />< br />< span style="font-size: 14pt"><strong>解决办法</strong></span><br /> 一、检查存放Microsoft Access数据库文件的文件夹是否有对IIS匿名帐号有写入权限,如果没有,请赋于<strong>写入</strong>权限,特别是当错误信息为<em>(Microsoft< /em>JET<em> Database Engine 错误 '80004005' 操作必须使用一个可更新的查询。</em>)时。<br />< br /> 二、<span style="background-color: #ffffff">JET< /span>引擎在链接数据库的时候会在<strong>%windir%/temp/</strong>目录下创建临时文件,而IIS匿名帐号对<strong>%windir%/temp/</strong>目录操作权限不够,添加IIS匿名帐号(<strong>IUSR_计算机名</strong>)对<strong>%windir%/temp/</strong>的读写权限即可。<br />< br /> 其它一些未指定的错误,可以尝试重新注册ASP脚本解释链接库文件。< br /> 依顺序运行以下命令:<br /> 1.regsvr32 jscript.dll<br /> 2.regsvr32 vbscript.dll< br /> 3.iisreset</p>http://www.downcc.com/tech/4914.htmlAsp编程2013/07/14 20:47:13<p>使用 NetBox 可以方便的将 asp 应用编译成为独立运行的执行程序,完全摆脱 iis 的束缚,在几乎所有的 Windows 版本上面直接运行,完全不需要考虑平台兼容性和对 asp 运行环境的要求。下面就是快速移植已有的 asp 应用的步骤。</p>< p>一、创建 asp 运行环境</p>< p>首先创建一个空的目录,在你喜欢的位置,假设是 d:\websvr。在目录中创建一个文件:main.box,编辑其内容为:</p>< pre> Dim httpd Shell.Service.RunService& quot;NBWeb&quot;,& quot;NetBox Web Server&quot;,& quot;NetBox Http Server Sample&quot; '---------------------- Service Event --------------------- Sub OnServiceStart() Set httpd = CreateObject(&quot;NetBox.HttpServer&quot;) If httpd.Create(&quot;&quot;, 80) = 0 Then Set host = httpd.AddHost(&quot;&quot;,& quot;\wwwroot&quot;) host.EnableScript = true< strong>host.AddDefault& quot;default.asp&quot; host.AddDefault& quot;default.htm&quot;</strong> httpd.Start else Shell.Quit 0 end if End Sub Sub OnServiceStop() httpd.Close End Sub Sub OnServicePause() httpd.Stop End Sub Sub OnServiceResume() httpd.Start End Sub</pre>< p>上面的代码摘自《创建一个 WEB 服务器》。其中加粗的部分是缺省文件名,如果你的应用不同,可以自行添加修改。</p>< p>二、复制 asp 应用</p>< p>在目录中再创建一个子目录:wwwroot,将你在 iis 中的文件全部复制到 wwwroot 中。此时,你的 asp 运行环境应该已经准备好了。</p>< p>三、测试运行</p>< p>为了运行你刚才新建的 netbox 应用,你必须确认你的 iis 或者其他占用 80 端口的程序已经停止,较大的可能是你的 iis 在使用这个端口,所以最好停止你的 iis,或者将 iis 的使用端口更换为其他端口。</p>< p>在确保 iis 已经停止后,你便可以执行你的 netbox 应用了。双击 main.box 文件,很快,你将在窗口右下角看见 netbox 的图标。此时,netbox 已经正常运行了。你需要做的是使用 ie 访问 http://localhost 测试你的 asp 应用是否也已经正常运行。一般情况下此时 asp 也已经完全正常运行了。</p>< p>四、编译</p>< p>编译的过程是简单的,执行 nbdw.exe。</p>< p>点 Select Folder,找到刚才我们建立的目录 d:\websvr,点 Browser,设定要生成的执行文件名,点 Build...,开始编译。</p>< p>成功喽&hellip;&hellip;</p>< p>最后,我们得到了编译成功的那个执行文件,这个就是我们的最后目标。</p>< p>因为这个例程是以服务方式创建的 Web 服务器,所以你可以使用:</p>< pre> myapp -install</pre>< p>将应用安装成为服务,这样,系统无须登录便可以自动运行应用了。如果需要卸载服务,则可以执行下面的命令:</p>< p>myapp -remove</p>http://www.downcc.com/tech/4744.html.Net编程2013/04/04 23:05:34<p>问题是这样的...我在VS2008直接运行打开网页,可以连接数据库...但通过输入地址,也可以打开网页,但涉及数据库就出问题...</p>< p>无法打开登录所请求的数据库& quot;TakeClass&quot;。登录失败。<br /> 用户 '2D2727E2578F446ASPNET' 登录失败。< br /> 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。< br />< br /> 异常详细信息: System.Data.SqlClient.SqlException: 无法打开登录所请求的数据库& quot;TakeClass&quot;。登录失败。< br /> 用户 '2D2727E2578F446ASPNET' 登录失败。< br />< br /> 以前也碰到过这个问题,搜索后按下面方法就解决了。< br />< br /> 1.打开数据库企业管理器,然后选择数据库---安全性---找到刚才报错的哪个''XXXASPNET'' --右键&quot;属性&quot;;< br /> 2.选择&quot;用户映射&quot;选项---在里面将我们要访问的数据库选中< br /> 3.先别点确定---再选择我们刚才选择的哪个数据库,在下面的&quot;数据库角色成员身份&quot;里要选择&quot;db_owner&quot;权限</p>http://www.downcc.com/tech/4742.html.Net编程2013/04/04 22:57:15<p>解决方法:增加站点所在目录的ntfs权限,增加service用户对站点目录的完全控制权< br />< br /> 出错信息如下:< br /> 运行时错误< br />< br /> 说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。< br />< br /> 详细信息: 若要使他人能够在远程计算机上查看此特定错误信息的详细信息,请在位于当前 Web 应用程序根目录下的&ldquo;web.config&rdquo;配置文件中创建一个& lt;customErrors&gt; 标记。然后应将此& lt;customErrors&gt; 标记的&ldquo;mode&rdquo;属性设置为&ldquo;Off&rdquo;。< br />< br />& lt;!-- Web.Config 配置文件 --&gt;< br />< br />& lt;configuration&gt;< br />& lt;system.web&gt;< br />& lt;customErrors mode=&quot;Off&quot;/&gt;< br />& lt;/system.web&gt;< br />& lt;/configuration&gt;< br />< br /> 注释: 通过修改应用程序的& lt;customErrors&gt; 配置标记的&ldquo;defaultRedirect&rdquo;属性,使之指向自定义错误页的 URL,可以用自定义错误页替换所看到的当前错误页。< br />< br />& lt;!-- Web.Config 配置文件 --&gt;< br />< br />< br />& lt;configuration&gt;< br />& lt;system.web&gt;< br />& lt;customErrors mode=&quot;RemoteOnly&quot; defaultRedirect=&quot;mycustompage.htm&quot;/&gt;< br />& lt;/system.web&gt;< br />& lt;/configuration&gt;< br />< br />< br />& ldquo;/&rdquo;应用程序中的服务器错误。< br /> 配置错误< br /> 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。< br />< br /> 分析器错误信息: 无法识别的配置节&ldquo;connectionStrings&rdquo;< br />< br /> 源错误:< br />< br /> 行 12:& lt;add key=&quot;Dsn&quot; value=&quot;server=(local);database=al_bysj;uid=sa;pwd=&quot;/&gt;< br /> 行 13:& lt;/appSettings&gt;< br /> 行 14:& lt;connectionStrings&gt;< br /> 行 15:& lt;add name=&quot;al_bysjConnectionString&quot; connectionString=&quot;Data Source=(local);Initial Catalog=al_bysj;User ID=sa;Password=&quot; providerName=&quot;System.Data.SqlClient&quot;/&gt;< br /> 行 16:& lt;/connectionStrings&gt;< br />< br />< br /> 源文件: D:\PrecompiledWeb\MaterialManage\web.config 行: 14< br />< br /> 版本信息: Microsoft .NET Framework 版本:1.1.4322.2300; ASP.NET 版本:1.1.4322.2300< br /> 从版本信息中可以捕捉到,< br />< br /> 确认你的Microsoft .NET Framework 版本,我是用的是Microsoft .NET Framework 2.0。< br />< br />< br />< br /> 解决方法一:< br />< br /> 在cmd 命令行中运行 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis.exe -i< br />< br /> 解决方法二:< br />< br /> 在IIS中选中该网站,单击右键&lsquo;属性&rsquo;,选择 Asp.net 标签栏。将 Asp.net 版本改成2.0 即可。< br /> Microsoft .NET Framework 版本:1.1.4322.2300</p>http://www.downcc.com/tech/4677.html.Net编程2013/03/02 16:17:41<p>在提交表单时候,asp.net 提示:&quot;从客户端(......)中检测到有潜在危险的 Request.Form 值&quot; 。asp.net中的请求验证特性提供了某一等级的保护措施防止XSS攻击,asp.net的请求验证是默认启动的。这个给出各个版本.net的解决方法。<br />< br />< strong>asp.net 2.0 通常解决办法<br />< br /> 方案一:<br />< br />< /strong>将.aspx文件中的page项添加ValidateRequest=&quot;false&quot; ,如下:<br />< br />& lt;%@ Page ValidateRequest=&quot;false&quot; Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;test2.aspx.cs&quot; Inherits=&quot;test2&quot; %&gt;< br />< br />< strong>方案二:<br />< br />< /strong>修改web.config配置文件<br />< br />  &lt;system.web&gt;< br />   &lt;pages validateRequest=&quot;false&quot;& gt;< br />   &lt;/pages&gt;< br />  &lt;/system.web&gt;< br />< br />< strong><span style="color: #000099; font-size: 16px">总结:</span></strong>validateRequest 这句我们知道是关闭验证,也就是说提交带标签,比如& lt;strong&gt;粗体&lt;/strong&gt; 这样的值时,ASP.NET 不会报错。这里推荐使用方案一,因为方案一只修改test.aspx这一个页面;而如果使用方案二的话,将是整个解决方案都变成ValidateRequest=&quot;false&quot; 。<br />< br />< strong>asp.net 4.0 解决办法<br />< br />< /strong>4.0和2.0的方法一样,不过要注意的是从 .Net Framework 4.0 开始,asp.net开始强制检测Request参数安全,而我们可以通过修改 Web.config 来恢复 2.0 版本的模式。<br />< br />< strong><span style="color: #ff0000">方法如下:<br />< br />< /span></strong>修改Web.config,增加requestValidationMode=&quot;2.0&quot;属性值<br />< br />  &lt;system.web&gt;<br />   &lt;httpRuntime requestValidationMode=&quot;2.0&quot; /&gt;<br />   &lt;pages validateRequest=&quot;false&quot;&gt;&lt;/pages&gt;<br />  &lt;/system.web&gt;<br />< br /> 4.0 中多了一个 requestValidationMode,这是什么意思呢?<br />< br /> requestValidationMode 有两个值:<br />< br />& bull;2.0仅对网页启用请求验证。是启用还是关闭取决于 validateRequest。<br />< br />& bull;4.0 默认值。任何 HTTP 请求都会启用请求验证,也就是说不光是网页,还包括 Cookie 等。此时强制启用,不管 validateRequest 为何值。<br />< br /> 由于 requestValidationMode=&quot;4.0&quot; 是强制启用,所以我们会发现在 .NET Framework 4.0 中仅靠设置 validateRequest 是关闭不了请求验证的,还得将 requestValidationMode 设置为 2.0。</p>http://www.downcc.com/tech/4359.html.Net编程2012/11/28 13:15:36<div >< p>今天碰到这样一个需求,写的C#库,有时候需要在.net 2.0下编译,有时候需要在.net 4.0下编译,这个库里使用了lambda表达式,使用了扩展方法,使用了几个 System.Core.dll 引入的Action类型。为了在 .net 2.0 下能够编译成功,我写了一个文件 Patch.cs,定义了 System.Runtime.CompilerServices.ExtensionAttribute&nbsp; 类型,这样就可以在2.0下使用lambda表达式和扩展方法了,同时,添加了几个用到的System.Core.dll 引入的Action类型:</p>< p>1: namespace System.Runtime.CompilerServices< br /> 2: {< br /> 3: public class ExtensionAttribute : Attribute { }< br /> 4: } 5: 6: namespace System< br /> 7: {<br /> 8: public delegate void Action();<br /> 9: public delegate void Action&lt;T0,T1&gt;(T0 t0,T1 t1);<br /> 10: }<br /> 11:</p>< p>然而,要在.net 4.0 下编译,因为类型已经存在,必须注释掉Patch.cs,很麻烦。于是想通过条件编译来解决,即:</p>< p>1: #if NET2< br /> 2:< br /> 3: namespace System.Runtime.CompilerServices< br /> 4: {< br /> 5: public class ExtensionAttribute : Attribute { }< br /> 6: }< br /> 7:< br /> 8: namespace System< br /> 9: {<br /> 10: public delegate void Action();<br /> 11: public delegate void Action&lt;T0,T1&gt;(T0 t0,T1 t1);<br /> 12: }<br /> 13:< br /> 14: #endif</p>< p>问题是,.net 里没有定义和.net版本有关的指示符。怎么办呢?自己动手,丰衣足食,使用Build Events在编译之前自动侦测出项目所使用的.net版本,定义出我们想要的指示符。</p>< p>在&nbsp; C#模板编程(2): 编写C#预处理器,让模板来的再自然一点 一文中,写了一个程序 Csmacro.exe 来实现C#下的模板机制,本文在Csmacro.exe 的基础上,增加侦测项目所引用的.net 版本的功能。</p>< p>原理:查找项目目录下的 csproj 文件,解析它,找到节点TargetFrameworkVersion,判断.net版本,然后生成一个Csmacro_Template.cs文件,在里面 #define 版本指示符。例如,对 .Net 2.0 项目,生成的 Csmacro_Template.cs 文件内容为:</p>< p>#define NET2</p>< p>修改后Csmacro的代码可在:https://github.com/xiaotie/GebCommon&nbsp;上下载(目前只处理了 .net 2.0 和 4.0,如需要针对其它版本,可自行修改代码)。有了 Csmacro,一切就好办了。</p>< p>第一步,把 Csmacro.exe 放在Path路径下</p>< p>第二步,打开需要条件编译的项目,添加 Pre-build 事件:Csmacro.exe $(ProjectDir)</p>< p>第三步,编辑源文件,如,Patch.cs 文件修改为:</p>< p>1: #region include& quot;Csmacro_Template.cs&quot;< br /> 2: #endregion< br /> 3:< br /> 4: #if NET2< br /> 5:< br /> 6: namespace System.Runtime.CompilerServices< br /> 7: {<br /> 8: public class ExtensionAttribute : Attribute { }< br /> 9: }<br /> 10:< br /> 11: namespace System<br /> 12: {<br /> 13: public delegate void Action();<br /> 14: public delegate void Action&lt;T0,T1&gt;(T0 t0,T1 t1);<br /> 15: }<br /> 16:< br /> 17: #endif</p>< p>#region include 是我引入的 Csmacro 宏语法。详见 C#模板编程(2): 编写C#预处理器,让模板来的再自然一点 一文。点击编译,系统会生成一个 Patch_Csmacro.cs 文件,内容如下:</p>< p>1: #define NET2< br /> 2:< br /> 3: #if NET2< br /> 4:< br /> 5: namespace System.Runtime.CompilerServices< br /> 6: {< br /> 7: public class ExtensionAttribute : Attribute { }< br /> 8: }< br /> 9:< br /> 10: namespace System<br /> 11: {<br /> 12: public delegate void Action();<br /> 13: public delegate void Action&lt;T0,T1&gt;(T0 t0,T1 t1);<br /> 14: }<br /> 15:< br /> 16: #endif</p>< p>第四步,把生成的 Patch_Csmacro.cs 添加到项目中来。</p>< p>搞定以后,选择不同的target,编译时产生的就是对该target的条件编译!</p>< /div>http://www.downcc.com/tech/4333.html.Net编程2012/11/22 10:06:26<p><strong>解决方法</strong></p>< p>1、对于每个网站建立一个用户、并将用户放入guest组,给站点写入、读取的权限。并在iis上允许匿名访问。</p>< p>2、</p>< p>&lt;system.web&gt;</p>< p>&lt;identity impersonate=&quot;true&quot; /&gt;</p>< p>&lt;/system.web&gt;</p>< p>将以上代码复制到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG&nbsp; web.config 中的以下地方:即可实现禁止跨站、禁止读取iis信息、禁止cmd命令执行。</p>< p>&lt;/location&gt;</p>< p>&lt;system.web&gt;</p>< p>&lt;identity impersonate=&quot;true&quot; /&gt;</p>< p>&lt;/system.web&gt;</p>< p>&lt;system.net&gt;</p>< p>3、asp.net1.1 在machine.config C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG 中搜索&lt;identity impersonate=&quot;false&quot; userName=&quot;&quot; password=&quot;&quot;/&gt; 将false 改成true</p>< p>代码作用:模拟匿名帐户来运行网站程序。</p>< p>此法可以禁止跨目录、读取iis站点信息,禁止执行cmd。</p>http://www.downcc.com/tech/4288.htmlPHP编程2012/10/23 11:25:05<p>php输出内容包括网页显示及弹出的信息框内容。</p>< p>乱码一般情况下都是浏览器选择的显示编码与网页的编码方式不同导致的,尽管网站浏览者可以通过手动选择编码来解决乱码问题,但这也大大降低了网站的用户亲和力,况且没多少人懂得如何操作。</p>< p>解决方法:在php文件的开头添加 header(&quot;Content-type: text/html; charset=UTF-8&quot;); UTF-8根据你的网页编码方式自行修改。</p>http://www.downcc.com/tech/4130.htmlAsp编程2012/08/21 22:20:21<p>Asp中的 Application 是一个公用的对像</p>< p>我们可以用一个语句来清理服务器上的所有Application 对像</p>< p><strong>application.contents.removeall&nbsp; '清空所有缓存</strong></p>< p>会员登陆后修改application变量,比如我们用一个application(&quot;login&quot;)=true表示登陆了.那么登陆时就应该先进行一次的application(&quot;login&quot;)=ture<br /> 直到其退出后才会将其值修改为false.<br /> 当然登陆前先检查一下application(&quot;login&quot;)的值,若不存在或是false就可以让其进行登陆,否则做出限制跟转至错误提示页面.<br />< br /> 而session只是一个单用户的级别,不合适用的.而session变量是其他用户根本取不到的.<br />< br /> 剩下要考虑的是非正常退出等,如果user1直接关闭的浏览器,那么没有退出时进行修改application(&quot;login&quot;)的值,这时会发生所有用户都登陆不上的问题.这里要用到session_OnEnd事件进行一次的清除变量,这里面显然要加上application(&quot;login&quot;)=false或null这样的修改.但是还要把session.tiomeout时间设短一点,要不如果某用户关闭后要等很长的时间后才可能登陆的.但是过短又不行,如果太短的话,你的这个用户连一个填写表单完成的机会都没有,那么user2会抢先登陆进去的.显然,这里最好的办法就是增加一个提醒机制进行计时,比如我设的是十分钟,在登陆者的页面上会出现计时的,倒计至9分钟左右让其点一个按钮与服务器交互一下,这样计时器重新从十分钟开始计时.或者写一个小的自动请求服务的ajax,让其每隔1分钟向服务器发一次请求,这样时间你可以设置为略大于1分钟而保证在线者的不掉线,别人不能抢入,而其关闭后,显然1分钟后允许别人登陆.<br />< br /> 过期页面的处理,如果一个用户在session时间内无任何服务器动作的话,可由别的登陆用户进行抢入,这时,也就是十分钟后,该页面进行了刷新操作,此时必须把这个用户进行一个过期处理.不能让其再进入,如果不加过期处理,此时会发生两个人同时在线的情况.<br />< br /> 抢登陆,假定两地都有用户在同时抢登陆时,如果进行处理.user1登陆时发现application(&quot;login&quot;)的值是可以登陆的.于是就正在填写,而user2此时也在读取application的值,发现可以登陆,那么两者会同时登陆上的.解决的办法是:<br /> 1,页面进行取值的方法,也就是说当有人请求login页面时就先进行application值的更改.其他用户再请求时已经不能请求到页面了.或请求到了不允话登陆的页面信息.但如果是这样的话,不管登陆没有登陆都是要清除的,所以session_OnEnd事件中不管是否登陆都要进行application的靖除的.<br /> 2.锁定变量的方法,application变量是可以锁定的,进入页面时先将application进行锁定,而其他用户是取不到值的.取不到值时就好办了,提示有用户正在尝试登陆.当然无论那个尝试登陆的是否登陆都要对其进行解锁的.也就是说在关闭页面中,最好是这样,写一个ajax进行application进行解除锁定.当然登陆完成时也要进行解锁定.最后是如果意外时,session_OnEnd也要进行尝试解锁定,如果变量正在锁定,则解锁定就是尝试解锁定的意思.<br />< br /> 当然,数据库法也可以用的,数据库中有一个字段进行标志,但这样的解决方法只是将使用application变量,换成了使用字段而已.其他都是一样的.但速度上与安全上依赖于application变量比较好的.<br />< br /> 一楼,session变量是一个用户级变量,请问另一个用户在登陆时如果得到其他用户的变量?这样不乱套了吗?别忘记一句话:每一个用户在请求页面时都自动生成一个session的.而application则是全局变量,网页的即时聊天就是来源于这个变量的.但变量过大时会占用服务器较大的内存的!<br /> 二楼,就是一个统计在线用户的程序,请问,考虑到两个用户在同时尝试登陆的情况吗?这种方法可以是登陆上,但必须加代码再测试一下是否有同时在线用户,如果有,必须让其当即退出登陆才行的,这样才能做到单用户登陆.<br />< br /> 不过一个用户登陆的网站你干什么用呢?如果是单单限制登陆用户不能进入login界面的话,可以使用session值,在登陆界面中进行一次的简单判断嘛.那样的话又非常简单,比如登陆用户登陆后会有session(&quot;username&quot;),在登陆页面上去查这个查是否为空或是否存在,若为空或存在则正常登陆,否则转向错误页面不就行了?</p>http://www.downcc.com/tech/4033.htmlPHP编程2012/05/30 10:04:44<p>首先 我们介绍一下<strong>ISBN码的背景知识</strong>,不想看的朋友可以直接看第二页,第二页讲解的是ISBN码校验函数(php版)</p>< p>最近在编写一个图书管理程序的时候,需要校验图书<strong>ISBN码</strong>正确性,查了一些资料,了解了图书ISBN码的构成,详细资料可以参考:国际标准书号& ndash; 维基百科,下面还是简述一下什么是ISBN码:</p>< p>国际标准书号(International Standard Book Number,ISBN;拟发音is-ben),是国际通用的图书或独立的出版物(除定期出版的期刊)代码。出版社可以通过国际标准书号清晰的辨认所有非期刊书籍。一个国际标准书号只有一个或一份相应的出版物与之对应。新版本如果在原来旧版的基础上没有内容上太大的变动,在出版时也不会得到新的国际标准书号码。当平装本改为精装本出版时,原来相应的国际标准书号号码也应当收回。</p>< p>平常我们能够见到的ISBN码有10位和13位两种,其中10位的ISBN自2007年1月起已经停止使用,目前新出版的图书ISBN码都是13位。考虑到一个严谨的图书管理程序要考虑到多方面的问题,因为10位ISBN码的图书还是有巨大的存世量的,所以要校验图书ISBN码的正确性,就必须同时考虑10位和13位的情况。从维基百科可以了解到ISBN码最后一位是校验码,其实要想校验ISBN码的正确,就是通过计算ISBN的校验码,看是否与最后一位吻合。这里所说的校验也只是校验ISBN在构成上是否合法,而不会校验是否为已发行图书的ISBN。下面是维基百科提供的ISBN码校验算法:</p>< p><strong>校验码的计算方法(10码)</strong></p>< p>假设某国际标准书号号码前9位是:7-309-04547</p>< p>计算加权和S:S = 7&times;10+3&times;9+0&times;8+9&times;7+0&times;6+4&times;5+5&times;4+4&times;3+7&times;2 = 226</p>< p>计算S&divide;11的余数M:M = 226 mod 11 = 6</p>< p>计算11& ndash; M 的差N:N = 11& minus; 6 = 5</p>< p>如果N = 10,校验码是字母&quot;X&quot;</p>< p>如果N = 11,校验码是数字&quot;0&quot;</p>< p>如果N为其他数字,校验码是数字N&nbsp;</p>< p>所以,本书的校验码是5;如果用户提供的ISBN码是7-309-04547-6,那么校验失败</p>< p><strong>校验码的计算方法(13码)</strong></p>< p>假设某国际标准书号号码前12位是:978-986-181-728</p>< p>计算加权和S:S = (9&times;1)+(7&times;3)+(8&times;1)+(9&times;3)+(8&times;1)+(6&times;3)+(1&times;1)+(8&times;3)+(1&times;1)+(7&times;3)+(2&times;1)+(8&times;3) = 164</p>< p>计算S&divide;10的余数M:M = 164 mod 10 = 4</p>< p>计算10& ndash; M 的差N:N = 10& minus; 4 = 6</p>< p>如果N = 10,校验码是数字&quot;0&quot;</p>< p>如果N为其他数字,校验码是数字N&nbsp;</p>< p>所以,本书的校验码是6。完整的国际标准书号号码为 ISBN 978-986-181-728-6</p>< p>好了,背景知识介绍到这,下面我写的ISBN码校验函数(php版),需要的话可以直接使用:</p>< p>function isbn_sum($isbn, $len)<br /> {<br /> /*< br />& nbsp;* 该函数用于计算ISBN加权和< br />& nbsp;* 参数说明:<br />& nbsp;*&nbsp;&nbsp; $isbn : isbn码<br />& nbsp;*&nbsp;&nbsp; $len&nbsp; : isbn码长度<br />& nbsp;*/<br />& nbsp;&nbsp;&nbsp; $sum = 0;<br />& nbsp;&nbsp;&nbsp; if ($len == 10)<br />& nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ($i = 0; $i& lt; $len-1; $i++)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sum = $sum + (int)$isbn[$i] * ($len - $i);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; elseif ($len == 13)<br />& nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ($i = 0; $i& lt; $len-1; $i++)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($i % 2 == 0)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sum = $sum + (int)$isbn[$i];<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sum = $sum + (int)$isbn[$i] * 3;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; return $sum;<br /> }<br /> function isbn_compute($isbn, $len)<br /> {<br /> /*< br /> * 该函数用于计算ISBN末位校验码<br /> * 参数说明:<br /> *&nbsp;&nbsp; $isbn : isbn码<br /> *&nbsp;&nbsp; $len&nbsp; : isbn码长度<br /> */<br />& nbsp;&nbsp;&nbsp; if ($len == 10)<br />& nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $digit = 11 - isbn_sum($isbn, $len) % 11;</p>< p>&nbsp; if ($digit == 10)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rc = 'X';<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ($digit == 11)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rc = '0';<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rc = (string)$digit;<br />& nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; else if($len == 13)<br />& nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $digit = 10 - isbn_sum($isbn, $len) % 10;</p>< p>&nbsp; if ($digit == 10)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rc = '0';<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rc = (string)$digit;<br />& nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; return $rc;<br /> }<br /> function is_isbn($isbn)<br /> {<br /> /*< br />& nbsp;* 该函数用于判断是否为ISBN号< br />& nbsp;* 参数说明:<br />& nbsp;*&nbsp;&nbsp;&nbsp; $isbn : isbn码<br />& nbsp;*/<br />& nbsp;&nbsp;&nbsp; $len = strlen($isbn);<br />& nbsp;&nbsp;&nbsp; if ($len!=10& amp;&amp; $len!=13)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />& nbsp;&nbsp;&nbsp; $rc = isbn_compute($isbn, $len);<br />& nbsp;&nbsp;&nbsp; if ($isbn[$len-1] != $rc)&nbsp;&nbsp; /* ISBN尾数与计算出来的校验码不符 */<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />& nbsp;&nbsp;&nbsp; else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br /> }</p>< p>函数写好后,就可以直接调用了,下面是调用示例:</p>< p><span ><font color="#000000">&lt;?php echo is_isbn('9787507421781') ? '校验通过' : '校验失败'; ?&gt;</font></span></p>http://www.downcc.com/tech/4032.htmlPHP编程2012/05/30 10:02:26<p>PHP代码</p>< pre >& lt;?php /** * 功能:生成缩略图 * 作者:phpox * 日期:Thu May 17 09:57:05 CST 2007 */ class CreatMiniature { //公共变量 var $srcFile=&quot;&quot;; //原图 var $echoType; //输出图片类型,link--不保存为文件;file--保存为文件 var $im=&quot;&quot;; //临时变量 var $srcW=&quot;&quot;; //原图宽 var $srcH=&quot;&quot;; //原图高 //设置变量及初始化 function SetVar($srcFile,$echoType) { if (!file_exists($srcFile)){ echo '源图片文件不存在!'; exit(); } $this-&gt;srcFile=$srcFile; $this-&gt;echoType=$echoType; $info=& quot;&quot;; $data= GetImageSize($this-&gt;srcFile,$info); switch ($data[2]) { case 1: if(!function_exists(&quot;imagecreatefromgif&quot;)){ echo& quot;你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!&lt;a href='javascript:go(-1);'&gt;返回&lt;/a&gt;&quot;; exit(); } $this-&gt;im = ImageCreateFromGIF($this-&gt;srcFile); break; case 2: if(!function_exists(&quot;imagecreatefromjpeg&quot;)){ echo& quot;你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!&lt;a href='javascript:go(-1);'&gt;返回&lt;/a&gt;&quot;; exit(); } $this-&gt;im = ImageCreateFromJpeg($this-&gt;srcFile); break; case 3: $this-&gt;im = ImageCreateFromPNG($this-&gt;srcFile); break; } $this-&gt;srcW=ImageSX($this-&gt;im); $this-&gt;srcH=ImageSY($this-&gt;im); } //生成扭曲型缩图 function Distortion($toFile,$toW,$toH) { $cImg=$this-&gt;CreatImage($this-&gt;im,$toW,$toH,0,0,0,0,$this-&gt;srcW,$this-&gt;srcH); return $this-&gt;EchoImage($cImg,$toFile); ImageDestroy($cImg); } //生成按比例缩放的缩图 function Prorate($toFile,$toW,$toH) { $toWH=$toW/$toH; $srcWH=$this-&gt;srcW/$this-&gt;srcH; if($toWH&lt;=$srcWH) { $ftoW=$toW; $ftoH=$ftoW*($this-&gt;srcH/$this-&gt;srcW); } else { $ftoH=$toH; $ftoW=$ftoH*($this-&gt;srcW/$this-&gt;srcH); } if($this-&gt;srcW&gt;$toW||$this-&gt;srcH&gt;$toH) { $cImg=$this-&gt;CreatImage($this-&gt;im,$ftoW,$ftoH,0,0,0,0,$this-&gt;srcW,$this-&gt;srcH); return $this-&gt;EchoImage($cImg,$toFile); ImageDestroy($cImg); } else { $cImg=$this-&gt;CreatImage($this-&gt;im,$this-&gt;srcW,$this-&gt;srcH,0,0,0,0,$this-&gt;srcW,$this-&gt;srcH); return $this-&gt;EchoImage($cImg,$toFile); ImageDestroy($cImg); } } //生成最小裁剪后的缩图 function Cut($toFile,$toW,$toH) { $toWH=$toW/$toH; $srcWH=$this-&gt;srcW/$this-&gt;srcH; if($toWH&lt;=$srcWH) { $ctoH=$toH; $ctoW=$ctoH*($this-&gt;srcW/$this-&gt;srcH); } else { $ctoW=$toW; $ctoH=$ctoW*($this-&gt;srcH/$this-&gt;srcW); } $allImg=$this-&gt;CreatImage($this-&gt;im,$ctoW,$ctoH,0,0,0,0,$this-&gt;srcW,$this-&gt;srcH); $cImg=$this-&gt;CreatImage($allImg,$toW,$toH,0,0,($ctoW-$toW)/2,($ctoH-$toH)/2,$toW,$toH); return $this-&gt;EchoImage($cImg,$toFile); ImageDestroy($cImg); ImageDestroy($allImg); } //生成背景填充的缩图 function BackFill($toFile,$toW,$toH,$bk1=255,$bk2=255,$bk3=255) { $toWH=$toW/$toH; $srcWH=$this-&gt;srcW/$this-&gt;srcH; if($toWH&lt;=$srcWH) { $ftoW=$toW; $ftoH=$ftoW*($this-&gt;srcH/$this-&gt;srcW); }</pre> http://www.downcc.com/tech/3949.html.Net编程2012/05/02 11:02:43<p>解决方法:应用程序&ldquo;DEFAULT WEB SITE&rdquo;中的服务器错误</p>< p>错误摘要<br /> HTTP 错误 404.0 - Not Found<br /> 您要找的资源已被删除、已更名或暂时不可用。</p>< p>详细错误信息<br /> 模块 IsapiFilterModule< br /> 通知 MapPath< br /> 处理程序 StaticFile< br /> 错误代码 0x80070002< br /> 请求的 URL http://server:80/bin/index.html< br /> 物理路径 C:\inetpub\wwwroot\bin\index.html< br /> 登录方法 尚未确定< br /> 登录用户 尚未确定< br />& nbsp;最可能的原因:<br />& bull;指定的目录或文件在 Web 服务器上不存在。<br />& bull;URL 拼写错误。<br />& bull;某个自定义筛选器或模块(如 URLScan)限制了对该文件的访问。<br />& nbsp;可尝试的操作:<br />& bull;在 Web 服务器上创建内容。<br />& bull;检查浏览器 URL。<br />& bull;创建跟踪规则以跟踪此 HTTP 状态代码的失败请求,并查看是哪个模块在调用 SetStatus。有关为失败的请求创建跟踪规则的详细信息,请单击此处。<br /> 链接和更多信息<br /> 此错误表明文件或目录在服务器上不存在。请创建文件或目录并重新尝试请求。</p>< p>只需要将bin文件夹从新命名,就可以正常访问.</p>< p>在系统盘 C:\Windows\System32\inetsrv\config 下有一个applicationHost.conf文件,内包含这么一段代码:</p>< p style="border-bottom: #bebebe 2px dashed; border-left: #bebebe 2px dashed; padding-bottom: 5px; background-color: #fdfddf; margin: 5px; padding-left: 5px; padding-right: 5px; border-top: #bebebe 2px dashed; border-right: #bebebe 2px dashed; padding-top: 5px">&lt;hiddenSegments applyToWebDAV=&quot;true&quot;&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;web.config&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;bin&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;App_code&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;App_GlobalResources&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;App_LocalResources&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;App_WebReferences&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;App_Data&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;add segment=&quot;App_Browsers&quot; /&gt;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt;/hiddenSegments&gt;&nbsp;&nbsp;<br />& nbsp;</p>< p>将&nbsp;& lt;add segment=&quot;bin&quot; /&gt; 删除以后,重启iis解决问题了</p>< p>不过因为.net里面使用到bin文件夹,里面涉及到一些安全问题,所以不得已只好恢复原来样式,所以建议用户在编写网站的时候不要包含类似系统常用的的或者软件常用的文件夹作为你的网站文件夹,经常造成不必要的麻烦。</p>http://www.downcc.com/tech/3948.htmlPHP编程2012/05/02 10:53:54<p>在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板、缓存等实现页面静态化,今天就以PHP实例教程形式讨论PHP生成静态页面的方法。页面静态化的方法,分为两种,一种是伪静态,就是url 重写,一种是你真的静态化。下面介绍PHP中页面静态化的方法。</p>< p><strong>什么是PHP静态化</strong></p>< p>PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在访客面前,PHP静态化分纯静态化和伪静态化,两者的区别在于PHP生成静态页面的处理机制不同。</p>< p><strong>PHP生成静态HTML页面的方法</strong></p>< p>1、利用PHP模板生成静态页面</p>< p>PHP模板实现静态化非常方便,比如安装和使用PHP Smarty实现网站静态化。</p>< p>2、使用PHP文件读写功能生成静态页面</p>< p><strong>PHP生成静态页面实例代码</strong></p>< p>&lt;?< br /> $out1=& quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;PHP网站静态化教程&lt;/title&gt;&lt;/head&gt;< br />& lt;body&gt;欢迎访问PHP网站开发教程网<a href="http://www.downcc.com">www.downcc.com</a>,本文主要介绍PHP网站页面静态化的方法< br />& lt;/body&gt;&lt;/html&gt;&quot;;< br /> $fp= fopen(&quot;leapsoulcn.html&quot;,&quot;w&quot;);< br /> if(!$fp)< br /> {< br /> echo& quot;System Error&quot;;< br /> exit();< br /> }< br /> else {< br /> fwrite($fp,$out1);< br /> fclose($fp);< br /> echo& quot;Success&quot;;< br /> }< br /> ?&gt;</p>< p>3、使用PHP输出控制函数(Output Control)生成静态页面</p>< p>输出控制函数(Output Control)也就是使用和控制缓存来生成静态HTML页面,也会使用到PHP文件读写函数。</p>< p>PHP生成静态页面实例代码</p>< p>&lt;?< br /> ob_start();< br /> echo& quot;&lt;html&gt;&quot;.< br />& quot;&lt;head&gt;&quot;.< br />& quot;&lt;title&gt;PHP网站静态化教程&lt;/title&gt;&quot;.< br />& quot;&lt;/head&gt;&quot;.< br />& quot;&lt;body&gt;欢迎访问PHP网站开发教程网<a href="http://www.downcc.com">www.downcc.com</a>,本文主要介绍PHP网站页面静态化的方法&lt;/body&gt;&quot;.< br />& quot;&lt;/html&gt;&quot;;< br /> $out1= ob_get_contents();< br /> ob_end_clean();< br /> $fp= fopen(&quot;leapsoulcn.html&quot;,&quot;w&quot;);< br /> if(!$fp)< br /> {< br /> echo& quot;System Error&quot;;< br /> exit();< br /> }< br /> else< br /> {< br /> fwrite($fp,$out1);< br /> fclose($fp);< br /> echo& quot;Success&quot;;< br /> }< br /> ?&gt;< br /> 我们知道使用PHP进行网站开发,一般执行结果直接输出到游览器,为了使用PHP生成静态页面,就需要使用输出控制函数控制缓存区,以便获取缓存区的内容,然后再输出到静态HTML页面文件中以实现网站静态化。</p>< p>PHP生成静态页面的思路为:首先开启缓存,然后输出了HTML内容(你也可以通过include将HTML内容以文件形式包含进来),之后获取缓存中的内容,清空缓存后通过PHP文件读写函数将缓存内容写入到静态HTML页面文件中。PHP文件读写教程?</p>< p>获得输出的缓存内容以生成静态HTML页面的过程需要使用三个函数:ob_start()、ob_get_contents()、ob_end_clean()。</p>< p>知识点:</p>< p>1、ob_start函数一般主要是用来开启缓存,注意使用ob_start之前不能有任何输出,如空格、字符等。</p>< p>2、ob_get_contents函数主要用来获取缓存中的内容以字符串形式返回,注意此函数必须在ob_end_clean函数之前调用,否则获取不到缓存内容。</p>< p>3、ob_end_clean函数主要是清空缓存中的内容并关闭缓存,成功则返回True,失败则返回False</p>< p>PHP输出控制函数(Output Control)有很多应用,今后将陆续展开。</p>< p>至此,使用PHP生成静态HTML页面以实现网站静态化的方法就介绍完了,根据实际情况和需求你可以选择不同的静态化方法。</p>http://www.downcc.com/tech/3947.htmlAsp编程2012/05/02 10:45:20<p>错误提示:Microsoft OLE DB Provider for ODBC Drivers (0x80004005) [Microsoft][ODBC Microsoft Access Driver] 不能更新。数据库或对象为只读。<br /> 或者程序运行很慢甚至死机!<br /> 或者机器码不固定。</p>< p>解决办法:<br /> 给Access文件Everyone完全控制即可解决。< br />& lt;1&gt;、先在工具-&gt;文件夹选项-&gt;查看-&gt;去掉&ldquo;使用简单文件共享(推荐)&rdquo;的对钩。< br />& lt;2&gt;、然后右键点wwwroot文件夹或data文件夹-&gt;属性-&gt;安全-&gt;添加everyone-&gt;勾选完全控制。<br /> 说明:<br /> WIN2K系统延续了WINNT系统的NTFS权限。<br /> 对于系统中的文夹都有默认的安全设置。<br /> 而通过HTTP对WWW访问时的系统默认用户是 iusr_计算机名 用户 ,它属于guest组。<br /> 当通过HTTP访问时,可以ASP或JSP,也或是PHP或.NET程序对数据进行修改操作:<br /> 比如:<br /> 当打开某一个文章时,程序设定,文章的阅读次数=原阅读次数+1<br /> 执行<br /> conn.execute(&quot;update arts set clicks=clicks+1 where id=n&quot;)<br /> 语句时,如果 iusr_计算机名 用户没有对数据库的写权限时,就会出错.<br /> 解决方法:<br /> 找到数据库所在目录<br /> 右键》属性》安全选项卡》设置 iusr_计算机名 用户的写权限(当然,也可以是everyone</p>http://www.downcc.com/tech/3946.htmlAsp编程2012/05/02 10:41:00<p>&nbsp;&nbsp;&nbsp; 重装更改目录为e盘后,上传文件出现问题。解决方法:</p><p>&nbsp;&nbsp;&nbsp; 调用adodb.stream的savetofile方法时发生错误, ADODB.Stream 错误 800a0bbc 写入文件失败。</p><p>&nbsp;&nbsp;&nbsp; 原因可能是:</p><p>&nbsp;&nbsp;&nbsp; 1、你要保存的文件名已存在,而未设置savetofile方法的覆盖属性。</p><p>&nbsp;&nbsp;&nbsp; 2、路径没有用server.MapPath()映射,这种情况下:< br/>&nbsp;&nbsp;&nbsp; 如果路径为绝对路径,则发生上面的问题:写入文件失败。<br/>&nbsp;&nbsp;&nbsp; 如果路径为相对路径,则会保存到相对于:c:\\windows\\system32的路径。(本机测试结果)。</p><p>&nbsp;&nbsp;&nbsp; 3、和错误& #39;80070070&#39; 一样,空间不足, 引起这个800a0bbc错误。</p><p>&nbsp;&nbsp;&nbsp; 4、服务器目录不支持写入,或者需要写入的目录不存在 。</p><p>&nbsp;&nbsp;&nbsp; 在使用化境的上传组件,若网站在服务器的根目录,通常是不会遇到此类问题的,遇到此问题往往是网站是以二级目录方式存放在服务器IIS内,化境的上传路径默认是根目录,因此必须修改化境的上传保存文件的路径,也就是提示出错的ASP网页ManageAddSave.asp&amp;rarr;我的出错网页名),而不是提示& amp;ldquo;dr.SaveToFile FullPath,2&amp;rdquo;写入出错所在的文件(UpFile.inc.inc&amp;rarr;我的化境无组件上传文件名),将提示出错的网页打开,修改上传文件保存路径& amp;ldquo;formPath=&quot;/UploadFile/NewsFile&quot;&#39;得到上传目录&amp;rdquo;,如:你的网站存放的二级目录为&amp;lsquo;web2&amp;rsquo;,路径则改为:& amp;ldquo;formPath=&quot;/web2/UploadFile/NewsFile&quot;&#39;得到上传目录&amp;rdquo;,至此,问题解决上传成功!</p><p>&nbsp;&nbsp;&nbsp; 5、老问题有出现,这次的原因是上传的过程中,server.mappath 中上传目录前不能加&amp;ldquo;/&amp;rdquo;,原来是& amp;ldquo;/upload/11111&amp;rdquo;改为& quot;upload/1111&quot;</p><p>&nbsp;&nbsp;&nbsp; 6、2009年6月12日调试ll上机考试,又出现这个错误,总结原因是上传目录formpath为&amp;ldquo;test/upload/&amp;rdquo;,因为本次虚拟目录设置为test路径,所以相应修改:</p><p>&nbsp;&nbsp;&nbsp; upfile.asp&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp; 1) formpath=&amp;ldquo;test/upload/&amp;rdquo;,--&gt; formpath=upload/&quot;</p><p>&nbsp;&nbsp;&nbsp; 2) if fso.FolderExists(&quot;e:/jiaoling-zuoye/javatest/test/upload/&quot;&amp;session(&quot;CurUserId&quot;))=false then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fso.CreateFolder(&quot;e:/jiaoling-zuoye/javatest/test//upload/&quot;&amp;session(&quot;CurUserId&quot;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if</p><p>&nbsp;&nbsp;&nbsp; 注意虚拟目录对应文件夹的位置修改e:/jiaoling-zuoye/javatest</p>http://www.downcc.com/tech/3877.htmlAsp编程2012/04/13 22:00:07<p>asp是什么文件/asp是什么意思/asp是什么格式</p><p>asp是active server page的意思,中文的意思是活动服务器页,是IIS服务器上一种动态网页文件。ASP文件的内容一般是由HTML、CSS、javascript或VBscript脚本、ASP对象组成。这种文件内容可以用记事本打开查看,服务器上的ASP文件一般都在服务器端执行完后传到客户端,所以传到客户端的ASP文件都是执行后的HTML网页。</p>http://www.downcc.com/tech/3561.htmlAsp编程2012/02/20 20:22:59<p>方法一:FSO</p>< p>Set fs = CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> NewFile=Server.MapPath(&quot;/asp/chap06/at/newfile.html&quot;)<br /> '新建一文件/newfile.html,若该文件已存在,则覆盖它<br /> Set a = fs.CreateTextFile(NewFile, True)<br /> Response.Write&quot;新文件已建立!&quot;<br /> a.close<br /> File=Server.MapPath(&quot;newfile.html&quot;)<br /> Set txt=fs.OpenTextFile(File,8,True) '打开成可以在结尾写入数据的文件<br /> data1=&quot;这句话是使用WriteLine方法写入的哦!~~&quot;<br /> txt.WriteLine data1<br /> data2=&quot;这句话是使用Write方法写入的哦!~~&quot;<br /> txt.Write data2<br /> txt.Close</p>< p>方法二:XMLHTTP</p>< p>&lt;%<br /> Set xml = Server.CreateObject(&quot;Microsoft.XMLHTTP&quot;)<br /> '把下面的地址替换成你的首页的文件地址,一定要用http://开头的绝对路径,不能写相对路径<br /> xml.Open& quot;GET&quot;,& quot;http://www.downcc.com&quot;, False<br /> xml.Send<br /> BodyText=xml.ResponseBody<br /> BodyText=BytesToBstr(BodyText,&quot;gb2312&quot;)<br /> Set xml = Nothing<br /> Dim fso, MyFile<br /> Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> Set MyFile= fso.CreateTextFile(server.MapPath(&quot;aa.htm&quot;), True)<br /> MyFile.WriteLine(BodyText)<br /> MyFile.Close</p>< p>其他:</p>< p>1</p>< p>下面的例子是将、index.asp?id=1/index.asp?id=2/index.asp?id=3/这三个动态<br /> 页面,分别生成ndex1.htm,index2.htm,index3.htm存在根目录下面:</p>< p><br />& lt;%<br /> dim strUrl,Item_Classid,id,FileName,FilePath,Do_Url,Html_Temp<br /> Html_Temp=&quot;&lt;UL&gt;&quot;<br /> For i=1 To 3<br /> Html_Temp = Html_Temp&amp;&quot;&lt;LI&gt;&quot;<br /> Item_Classid = i<br /> FileName =& quot;Index&quot;&amp;Item_Classid&amp;&quot;.htm&quot;<br /> FilePath = Server.MapPath(&quot;/&quot;)&amp;&quot;\&quot;&amp;FileName Html_Temp = Html_Temp&amp;FilePath&amp;&quot;&lt;/LI&gt;&quot;<br /> Do_Url =& quot;http://&quot;<br /> Do_Url = Do_Url&amp;Request.ServerVariables(&quot;SERVER_NAME&quot;)&amp;&quot;/main/index.asp&quot;<br /> Do_Url = Do_Url&amp;&quot;?Item_Classid=&quot;&amp;Item_Classid</p>< p><br /> strUrl = Do_Url<br /> dim objXmlHttp<br /> set objXmlHttp = Server.createObject(&quot;Microsoft.XMLHTTP&quot;)<br /> objXmlHttp.open& quot;GET&quot;,strUrl,false<br /> objXmlHttp.send()<br /> Dim binFileData<br /> binFileData = objXmlHttp.responseBody<br /> Dim objAdoStream<br /> set objAdoStream = Server.createObject(&quot;ADODB.Stream&quot;)<br /> objAdoStream.Type = 1<br /> objAdoStream.Open()<br /> objAdoStream.Write(binFileData)<br /> objAdoStream.SaveToFile FilePath,2<br /> objAdoStream.Close()</p>< p>Next<br /> Html_Temp = Html_Temp&amp;&quot;&lt;UL&gt;&quot;<br /> %&gt;</p>< p>&lt;%<br /> Response.Write (& quot;成功生成文件:&quot; )<br /> Response.Write (& quot;&lt;BR&gt;&quot; )<br /> Response.Write Html_Temp<br /> %&gt;</p>< p>Function BytesToBstr(body,Cset)<br /> dim objstream<br /> set objstream = Server.CreateObject(&quot;adodb.stream&quot;)<br /> objstream.Type = 1<br /> objstream.Mode =3<br /> objstream.Open<br /> objstream.Write body<br /> objstream.Position = 0<br /> objstream.Type = 2<br /> objstream.Charset = Cset<br /> BytesToBstr = objstream.ReadText<br /> objstream.Close<br /> set objstream = nothing<br /> End Function<br /> %&gt;</p>< p>2</p>< p>&lt;%@LANGUAGE=&quot;VBSCRIPT&quot; CODEPAGE=&quot;936&quot;%&gt;<br />& lt;%<br /> public tempelatefile,tmpdata<br /> sub ofile()'打开文件,并把文件内容放到tmpdata<br /> on error resume next<br /> tmpdata=&quot;&quot;<br /> set Astream=Server.CreateObject (&quot;Adodb.Stream&quot;)<br /> Astream.type=2'文件类型文本<br /> Astream.Mode = 3'读写<br /> Astream.open<br /> Astream.CharSet =& quot;GB2312&quot;'字符集<br /> Astream.LoadFromFile(tempelatefile)'从文件装载<br /> Assp=Astream.size<br /> if err.number&lt;&gt;0 then<br /> xz=-18<br /> response.Write tempelatefile&amp;&quot;&lt;br&gt;&quot;<br /> err.clear<br /> tmpdata=&quot;&quot;<br /> else<br /> tmpdata=Astream.ReadText(Assp)<br /> end if</p>< p>end sub</p>< p>sub save_file()<br /> ofile()<br /> recfilen=server.MapPath(dts)<br /> Astream.Flush<br /> Astream.close<br /> Astream.type=2<br /> Astream.Mode = 3<br /> Astream.open<br /> Astream.CharSet =& quot;GB2312&quot;<br /> Astream.position=0<br /> Astream.Writetext tmpdata,1'写入数据到stream<br /> Astream.SaveToFile recfilen,2'保存到文件<br /> end sub</p>< p>function dts()'产生随机文件名<br /> if len(month(now()))&gt;1 then<br /> mm=month(now())<br /> else<br /> mm=&quot;0&quot;&amp;month(now())<br /> end if<br /> if len(day(now()))&gt;1 then<br /> d=day(now())<br /> else<br /> d=&quot;0&quot;&amp;day(now())<br /> end if<br /> if len(hour(now()))&gt;1 then<br /> h=hour(now())<br /> else<br /> h=&quot;0&quot;&amp;hour(now())<br /> end if<br /> if len(minute(now()))&gt;1 then<br /> m=minute(now())<br /> else<br /> m=&quot;0&quot;&amp;minute(now())<br /> end if<br /> if len(second(now()))&gt;1 then<br /> s=second(now())<br /> else<br /> s=&quot;0&quot;&amp;second(now())<br /> end if<br /> Randomize<br /> upperbound=9999<br /> lowerbound=1000<br /> rds=Int((upperbound - lowerbound + 1) * Rnd + lowerbound)< br /> dts=&quot;htm/&quot;&amp;year(now())&amp;mm&amp;d&amp;h&amp;m&amp;s&amp;rds&amp;&quot;.htm&quot;<br /> end function<br /> title=request.Form(&quot;title&quot;)<br /> content=request.Form(&quot;content&quot;)<br /> tmpdata=replace(tmpdata,&quot;&lt;title&gt;&lt;/title&gt;&quot;,title)'以拥护提交内容替换<br /> tmpdata=replace(tmpdata,&quot;&lt;content&gt;&lt;/content&gt;&quot;,content)<br /> tempelatefile=server.MapPath(&quot;tempelate/1.htm&quot;)'模版文件<br /> save_file()<br /> %&gt;</p>http://www.downcc.com/tech/3503.htmlPHP编程2012/02/01 13:25:29<p>open_basedir: 将用户可操作的文件限制在某目录下;<br />& mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;<br /> 如下是php.ini中的原文说明以及默认配置:<br /> ; open_basedir, if set, limits all file operations to the defined directory<br /> ; and below. This directive makes most sense if used in a per-directory or<br /> ; per-virtualhost web server configuration file. This directive is<br /> ; *NOT* affected by whether Safe Mode is turned On or Off.<br /> open_basedir = .<br /> open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也可用符号&rdquo;.&rdquo;来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。举例来说: 若&rdquo;open_basedir = /dir/user&rdquo;, 那么目录& ldquo;/dir/user&rdquo; 和& ldquo;/dir/user1&Prime;都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成:&ldquo;open_basedir = /dir/user/&rdquo;</p>< p>open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。</p>< p>有三种方法可以在Apache中为指定的用户做独立的设置:</p>< p>(a) 在Apache的httpd.conf中Directory的相应设置方法:</p>< p>php_admin_value open_basedir /usr/local/apache/htdocs/<br /> #设置多个目录可以参考如下:<br /> php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/</p>< p>(b) 在Apache的httpd.conf中VirtualHost的相应设置方法:<br /> php_admin_value open_basedir /usr/local/apache/htdocs/<br /> #设置多个目录可以参考如下:<br /> php_admin_value open_basedir /var/www/html/:/var/tmp/</p>< p>(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动继承php.ini中的open_basedir设置值了,这就难以达到灵活的配置措施, 所以建议您不要在VirtualHost中设置此项限制. 例如,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示允许访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录.</p>< p>请注意: 若在php.ini所设置的上传文件临时目录为/tmp/, 那么设置open_basedir时就必须包含/tmp/,否则会导致上传失败. 新版php则会提示&rdquo;open_basedir restriction in effect&rdquo;<br /> 警告信息, 但move_uploaded_file()函数仍然可以成功取出/tmp/目录下的上传文件,不知道这是漏洞还是新功能.</p>http://www.downcc.com/tech/3502.htmlAsp编程2012/02/01 13:22:27<p>简介<br /> IIS5的HTTP 500内部服务器错误是我们经常碰到的错误之一,它的主要错误表现就是ASP程序不能浏览但HTM静态网页不受影响。另外当错误发生时,系统事件日志和安全事件日志都会有相应的记录。具体如下&hellip;&hellip;</p>< p>正文<br />< strong>一.错误表现</strong></p>< p>IIS5的HTTP 500内部服务器错误是我们经常碰到的错误之一,它的主要错误表现就是ASP程序不能浏览但HTM静态网页不受影响。另外当错误发生时,系统事件日志和安全事件日志都会有相应的记录。</p>< p>具体如下:</p>< p>(一)IE中的表现</p>< p>当浏览以前能够正常运行的asp页面时会出现如下的错误:</p>< p>网页无法显示</p>< p>您要访问的网页存在问题,因此无法显示。</p>< p>---------------------------------------------</p>< p>请尝试下列操作:</p>< p><br /> 打开 http://127.0.0.1 主页,寻找指向所需信息的链接。</p>< p>单击刷新按钮,或者以后重试。</p>< p><br /> HTTP 500 - 内部服务器错误</p>< p>Internet 信息服务</p>< p>--------------------------------------------------------------------------------</p>< p>技术信息(支持个人)</p>< p>详细信息:</p>< p>Microsoft 支持</p>< p>或者是:</p>< p>Server Application Error</p>< p>The server has encountered an error while loading an application during the processing of your request. Please refer to the event log for more detail information. Please contact the server administrator for assistance.</p>< p>(二)安全日志记录(2条)</p>< p>事件类型: 失败审核</p>< p>事件来源: Security</p>< p>事件种类: 登录/注销</p>< p>事件 ID: 529</p>< p>日期: 2001-9-9</p>< p>事件: 11:17:07</p>< p>用户: NT AUTHORITY\SYSTEM</p>< p>计算机: MYSERVER</p>< p>描述:</p>< p>登录失败:</p>< p>原因: 用户名未知或密码错误</p>< p>用户名: IWAM_MYSERVER</p>< p>域: MYDOM</p>< p>登录类型: 4</p>< p>登录过程: Advapi</p>< p>身份验证程序包: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0</p>< p>工作站名: MYSERVER</p>< p><br /> 事件类型: 失败审核</p>< p>事件来源: Security</p>< p>事件种类: 帐户登录</p>< p>事件 ID: 681</p>< p>日期: 2001-9-9</p>< p>事件: 11:17:07</p>< p>用户: NT AUTHORITY\SYSTEM</p>< p>计算机: MYSERVER</p>< p>描述:</p>< p>登录到帐户: IWAM_MYSERVER</p>< p>登录的用户: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0</p>< p>从工作站: MYSERVER</p>< p>未成功。错误代码是: 3221225578</p>< p><br /> (三)系统日志中的记录(2条)</p>< p>事件类型: 错误</p>< p>事件来源: DCOM</p>< p>事件种类: 无</p>< p>事件 ID: 10004</p>< p>日期: 2001-9-9</p>< p>事件: 11:20:26</p>< p>用户: N/A</p>< p>计算机: MYSERVER</p>< p>描述:</p>< p>DCOM 遇到错误&ldquo;无法更新密码。提供给新密码的值包含密码中不允许的值。& rdquo;并且无法登录到 .\IWAM_MYSERVER 上以运行服务器:</p>< p>{3D14228D-FBE1-11D0-995D-00C04FD919C1}</p>< p><br /> 事件类型: 警告</p>< p>事件来源: W3SVC</p>< p>事件种类: 无</p>< p>事件 ID: 36</p>< p>日期: 2001-9-9</p>< p>事件: 11:20:26</p>< p>用户: N/A</p>< p>计算机: MYSERVER</p>< p>描述:</p>< p>服务器未能转入应用程序 '/LM/W3SVC/4/Root'。错误是 'RunAs 的格式必须是&lt;域名&gt;\&lt;用户名&gt;或只是&lt;用户名&gt;'。</p>< p>若要获取关于此消息的更多的信息,请访问 Microsoft 联机支持站点: http://www.microsoft.com/contentredirect.asp 。</p>< p><br />< strong>二.原因分析</strong></p>< p>综合分析上面的错误表现我们可以看出,主要是由于IWAM账号(在我的计算机即是IWAM_MYSERVER账号)的密码错误造成了HTTP 500内部错误。</p>< p><br /> 在详细分析HTTP500内部错误产生的原因之前,先对IWAM账号进行一下简要的介绍:IWAM账号是安装IIS5时系统自动建立的一个内置账号,主要用于启动进程之外的应用程序的Internet信息服务。IWAM账号的名字会根据每台计算机NETBIOS名字的不同而有所不同,通用的格式是IWAM_MACHINE,即由&ldquo;IWAM&rdquo;前缀、连接线&ldquo;_&rdquo;加上计算机的NETBIOS名字组成。我的计算机的NETBIOS名字是MYSERVER,因此我的计算机上IWAM账号的名字就是IWAM_MYSERVER,这一点与IIS匿名账号ISUR_MACHINE的命名方式非常相似。</p>< p><br /> IWAM账号建立后被Active Directory、IIS metabase数据库和COM+应用程序三方共同使用,账号密码被三方分别保存,并由操作系统负责这三方保存的IWAM密码的同步工作。按常理说,由操作系统负责的工作我们大可放心,不必担心出错,但不知是BUG还是其它什么原因,系统的对IWAM账号的密码同步工作有时会失败,使三方IWAM账号所用密码不统一。当IIS或COM+应用程序使用错误IWAM的密码登录系统,启动IIS Out-Of-Process Pooled Applications时,系统会因密码错误而拒绝这一请求,导致IIS Out-Of-Process Pooled Applications启动失败,也就是我们在ID10004错误事件中看到的&ldquo;不能运行服务器{3D14228D-FBE1-11D0-995D-00C04FD919C1}& rdquo;(这里{3D14228D-FBE1-11D0-995D-00C04FD919C1} 是IIS Out-Of-Process Pooled Applications的KEY),不能转入IIS5应用程序,HTTP 500内部错误就这样产生了。</p>< p><strong>三.解决办法</strong></p>< p>知道了导致HTTP 500内部错误的原因,解决起来就比较简单了,那就是人工同步IWAM账号在Active Directory、IIS metabase数据库和COM+应用程序中的密码。</p>< p>具体操作分三步,均需要以管理员身份登录计算机以提供足够的操作权限(IWAM账号以IWAM_MYSERVER为例)。</p>< p><br /> (一)更改Active Directory中IWAM_MYSERVER账号的密码</p>< p>因IWAM账号的密码由系统控制,随机产生,我们并不知道是什么,为完成下面两步的密码同步工作,我们必须将IWAM账号的密码设置为一个我们知道的值。</p>< p>1、选择&ldquo;开始&rdquo;-&gt;&ldquo;程序&rdquo;-&gt;&ldquo;管理工具&rdquo;-&gt;&quot;Active Directory用户和计算机&quot;,启动&ldquo;Active Directory用户和计算机&rdquo;管理单元。</p>< p>2、单击&ldquo;user&rdquo;,选中右面的&ldquo;IWAM_MYSERVER&rdquo;,右击选择&ldquo;重设密码(T)...&rdquo;,在跳出的重设密码对方框中给IWAM_MYSERVER设置新的密码,这儿我们设置成&ldquo;Aboutnt2001&rdquo;(没有引号的),确定,等待密码修改成功。</p>< p><br /> (二)同步IIS metabase中IWAM_MYSERVER账号的密码</p>< p>可能因为这项改动太敏感和重要,微软并没有为我们修改IIS metabase中IWAM_MYSERVER账号密码提供一个显式的用户接口,只随IIS5提供了一个管理脚本adsutil.vbs,这个脚本位于C:\inetpub\adminscripts子目录下(位置可能会因你安装IIS5时设置的不同而有所变动)。</p>< p>adsutil.vbs脚本功能强大,参数非常多且用法复杂,这里只提供使用这个脚本修改IWAM_MYSERVER账号密码的方法:</p>< p>adsutil SET w3svc/WAMUserPass Password</p>< p>&quot;Password&quot;参数就是要设置的IWAM账号的新的密码。因此我们将IIS metabase中IWAM_MYSERVER账号的密码修改为&ldquo;Aboutnt2001&rdquo;的命令就是:</p>< p>c:\Inetpub\AdminScripts&gt;adsutil SET w3svc/WAMUserPass& quot;Aboutnt2001&quot;</p>< p>修改成功后,系统会有如下提示:</p>< p>WAMUserPass: (String)& quot;Aboutnt2001&quot;</p>< p><br /> (三)同步COM+应用程序所用的IWAM_MYSERVER的密码</p>< p>同步COM+应用程序所用的IWAM_MYSERVER的密码,我们有两种方式可以选择:一种是使用组件服务MMC管理单元,另一种是使用IWAM账号同步脚本synciwam.vbs。</p>< p><br /> 1、使用组件服务MMC管理单元</p>< p>(1)启动组件服务管理单元:选择&ldquo;开始&rdquo;-&gt;&ldquo;运行&rdquo;-&gt;&ldquo;MMC&rdquo;,启动管理控制台,打开&ldquo;添加/删除管理单元&rdquo;对话框,将&ldquo;组件服务&rdquo;管理单元添加上。</p>< p>(2)找到&ldquo;组件服务&rdquo;-&gt;&ldquo;计算机&rdquo;-&gt;&ldquo;我的电脑&rdquo;-&gt;&ldquo;COM+应用程序&rdquo;-&gt;&ldquo;Out-Of-Process Pooled Applications&rdquo;,右击&ldquo;Out-Of-Process Pooled Applications&rdquo;-&gt;&ldquo;属性&rdquo;。</p>< p>(3)切换到&ldquo;Out-Of-Process Pooled Applications&rdquo;属性对话框的&ldquo;标志&rdquo;选项卡。&ldquo;此应用程序在下列账户下运行&rdquo;选择中&ldquo;此用户&rdquo;会被选中,用户名是&ldquo;IWAM_MYSERVER&rdquo;。这些都是缺省的,不必改动。在下面的&ldquo;密码&rdquo;和&ldquo;确认密码&rdquo;文本框内输入正确的密码&ldquo;Aboutnt2001&rdquo;,确定退出。</p>< p>(4)系统如果提示&ldquo;应用程序被一个以上的外部产品创建。你确定要被这些产品支持吗?&rdquo;时确定即可。</p>< p>(5)如果我们在IIS中将其它一些Web的&ldquo;应用程序保护&rdquo;设置为&ldquo;高(独立的)&rdquo;,那么这个WEB所使用的COM+应用程序的IWAM账号密码也需要同步。重复(1)-(4)步,同步其它相应Out of process application的IWAM账号密码。</p>< p><br /> 2、使用IWAM账号同步脚本synciwam.vbs</p>< p>实际上微软已经发现IWAM账号在密码同步方面存在问题,因此在IIS5的管理脚本中单独为IWAM账号密码同步编写了一个脚本synciwam.vbs,这个脚本位于C:\inetpub\adminscripts子目录下(位置可能会因你安装IIS5时设置的不同而有所变动)。</p>< p>synciwam.vbs脚本用法比较简单:</p>< p>cscript synciwam.vbs [-v|-h]</p>< p>&ldquo;-v&rdquo;参数表示详http://www.downcc.com/tech/3493.htmlPHP编程2012/01/29 11:29:36<p>&lt;?<br /> $s= $_SERVER['QUERY_STRING'];<br /> if ($s ==& quot;http://www.baidu.com&quot;)<br /> {<br /> $s= http://www.downcc.com;<br /> }<br /> if ($s ==& quot;http://www.itmop.com&quot;)<br /> {<br /> $s=& quot;http://www.downcc.com&quot;;<br /> }<br /> header(&quot;Location:&quot;.$s.&quot;&quot;);<br /> ?&gt;< br />< br /> 一般都是用 header , 稍微高级点的还要在header 再加上其它的东西</p>http://www.downcc.com/tech/3467.htmlAsp编程2012/01/09 20:59:45<p>方法:BuildPath<br /> 语法:对象名.BulidPath(路径,文件名)<br /> 说明:在路径上添加文件名,如果有需要的话,会自动加上\分隔符。</p>< p>方法:CopyFile<br /> 语法:对象名.CopyFile(源路径,目标路径[,是否覆盖])<br /> 说明:将一个或多个文件从源位置复制到目标位置。源位置支持通配符,如果目标路径最后字符为\则认为目标路径是目录,<br /> 是否覆盖参数默认值为TURE,如果目标位置文件已经存在,而是否覆盖属性设置为FALSE的话会出错。(关于是否覆盖参数的说明其它各处皆同)</p>< p>方法:CopyFolder<br /> 语法:对象名.CopyFolder(源路径,目标路径[,是否覆盖])<br /> 说明:将一个文件夹从源位置复制到目标位置。</p>< p>方法:CreateFolder<br /> 语法:对象名.CreateFolder(文件夹名)<br /> 说明:创建一个文件夹。</p>< p>方法:CreateTextFile<br /> 语法:对象名.CreateTextFile(文件名[,是否覆盖[,是否为Unicode编码]])<br /> 说明:创建指定的文件,并返回TextStream对象,该对象可用于读或写创建的文件。</p>< p>方法:DeleteFile<br /> 语法:对象名.DeleteFile(文件名[,是否删除只读文件])<br /> 说明:删除指定文件,可以使用通配符,如果是否删除只读文件参数设置为TURE,则即便为只读属性也会被删除,默认值为FALSE。</p>< p>方法:DeleteFolder<br /> 语法:对象名.DeleteFolder(目录名[,是否删除只读文件夹])<br /> 说明:删除指定文件夹,可以使用通配符,如果是否删除只读文件夹参数设置为TURE,则即便为只读属性也会被删除,默认值为FALSE。</p>< p>方法:DriveExists<br /> 语法:对象名.DriveExists(驱动器名)<br /> 说明:如果指定的驱动器存在,则返回TURE,否则返回FLASH。</p>< p>方法:FileExists<br /> 语法:对象名.FileExists(文件名)<br /> 说明:如果指定的文件存在,则返回TURE,否则返回FLASH。</p>< p>方法:FolderExists<br /> 语法:对象名.FolderExists(文件夹名)<br /> 说明:如果指定的文件夹存在,则返回TURE,否则返回FLASH。</p>< p>方法:GetAbsolutePathname<br /> 语法:对象名.GetAbsolutePathname(路径)<br /> 说明:从提供的路中返回完整且含义明确的路径,支持通配符。</p>< p>方法:GetBaseName<br /> 语法:对象名.GetBaseName(路径)<br /> 说明:返回一个字符串,该字符串包含路径,最后一个部分的基本名,无扩展名。</p>< p>方法:GetDrive<br /> 语法:对象名.GetDrive(驱动器名)<br /> 说明:返回与指定驱动器相对应的Drive对象。</p>< p>方法:GetDriveName<br /> 语法:对象名.GetDriveName(路径)<br /> 说明:返回一个包含指定路径中驱动器名的字符串。</p>< p>方法:GetExtensionName<br /> 语法:对象名.GetExtensionName(路径)<br /> 说明:返回一个字符串,包含路径最后一个组成部分的扩展名。</p>< p>方法:GetFile<br /> 语法:对象名.GetFile(文件路径)<br /> 说明:返回一个与指定路径中某文件相应的FILE对象。</p>< p>方法:GetFileName<br /> 语法:对象名.GetFileName(文件路径)<br /> 说明:返回路径中的文件名。</p>< p>方法:GetFolder<br /> 语法:对象名.GetFolder(文件夹路径)<br /> 说明:返回一个与指定的路径中某文件夹相应的Folder对象。</p>< p>方法:GetParentFolderName<br /> 语法:对象名.GetParentFolderName(文件夹路径)<br /> 说明:返回一个字符串,该字符串包含指定的路径中最后一个组成部分的你文件夹。</p>< p>方法:GetSpecialFolder<br /> 语法:对象名.GetSpecialFolder(参数)<br /> 说明:返回一个与特定的WINDOWS文件夹相对应的FOLDER对象。参数的允许值是0(WindowsFolder)1(SystemFolder)2(TemporaryFolder)。</p>< p>方法:GetTempName<br /> 语法:对象名.GetTempName()<br /> 说明:返回随机生成的临时文件或文件夹的名称,用于执行要求临时文件或文件夹的操作。</p>< p>方法:MoveFile<br /> 语法:对象名.MoveFile(源路径,目标路径)<br /> 说明:将一个或多个文件从某位置移动到另一个位置,支持通配符。</p>< p>方法:MoveFolder<br /> 语法:对象名.MoveFolder(源路径,目标路径)<br /> 说明:将一个或多个文件夹从某位置移动到另一个位置,支持通配符。</p>< p>方法:OpenTextFile<br /> 语法:对象名.OpenTextFile(文件名[,访问类型[,是否创建不存在的文件[,文件读写格式]]])<br /> 说明:打开一个文件,并且返回一个与其相关的TextStream对象,访问类型参数可以是ForReading(1 默认)、ForWriting(2)、ForAppending(8),当是否创建不存在的文件参数值为TRUE时会创建不存在的文件,默认值为FALSE,文件读写格式允许值是:0 (默认,按照ASCII格式打开)、-1(按照UNICODE格式打开)、-2(用系统默认格式打开)。</p>http://www.downcc.com/tech/3464.html.Net编程2012/01/09 13:00:33<p>身份证号码15位升18位</p>< p>身份证18位验证</p>< p>18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称&quot;社会保障号码&quot;更名为&quot;公民身份号码&quot;,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:< br /> 一、范围< br /> 该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。< br /> 二、编码对象< br /> 公民身份号码的编码对象是具有中华人民共和国国籍的公民。< br /> 三、号码的结构和表示形式< br /> 1、号码的结构< br /> 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。< br /> 2、地址码< br /> 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。< br /> 3、出生日期码< br /> 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。< br /> 4、顺序码< br /> 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。< br /> 5、校验码< br /> (1)十七位数字本体码加权求和公式< br /> S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和< br /> Ai:表示第i位置上的身份证号码数字值< br /> Wi:表示第i位置上的加权因子< br /> Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2< br /> (2)计算模< br /> Y = mod(S, 11)</p>< p>(3)通过模得到对应的校验码< br /> Y: 0 1 2 3 4 5 6 7 8 9 10< br /> 校验码: 1 0 X 9 8 7 6 5 4 3 2< br /> 四、举例如下:< br /> 北京市朝阳区: 11010519491231002X< br /> 广东省汕头市: 440524188001010014< br />& nbsp;</p>< h5 align="left">15位升18的方法</h5>< p>根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。</p>< p>地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。</p>< p>15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)</p>< p>某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:</p>< p>&sum;(ai&times;Wi)(mod 11)&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;(1)</p>< p>公式(1)中:< br /> i----表示号码字符从由至左包括校验码在内的位置序号;< br /> ai----表示第i位置上的号码字符值;< br /> Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。</p>< p>i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1</p>< p>ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1</p>< p>Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1</p>< p>ai&times;Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1</p>< p>根据公式(1)进行计算:</p>< p>&sum;(ai&times;Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189</p>< p>189& divide; 11 = 17 + 2/11</p>< p>&sum;(ai&times;Wi)(mod 11) = 2</p>< p>然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:</p>< p>&sum;(ai&times;WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10< br /> 校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2< br /> 根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。< br />< br /> C#代码:</p>< p><br />& nbsp;&nbsp;private string per15To18(string perIDSrc)< br />& nbsp;&nbsp;{< br />& nbsp;&nbsp;&nbsp;int iS = 0;< br />& nbsp;<br />& nbsp;&nbsp;&nbsp;//加权因子常数< br />& nbsp;&nbsp;&nbsp;int[] iW=new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};<br />& nbsp;&nbsp;&nbsp;//校验码常数< br />& nbsp;&nbsp;&nbsp;string LastCode=&quot;10X98765432&quot;;< br />& nbsp;&nbsp;&nbsp;//新身份证号< br />& nbsp;&nbsp;&nbsp;string perIDNew;< br />& nbsp;<br />& nbsp;&nbsp;&nbsp;perIDNew=perIDSrc.Substring(0,6);<br />& nbsp;&nbsp;&nbsp;//填在第6位及第7位上填上&lsquo;1&rsquo;,&lsquo;9&rsquo;两个数字< br />& nbsp;&nbsp;&nbsp;perIDNew +=& quot;19&quot;;< br />& nbsp;<br />& nbsp;&nbsp;&nbsp;perIDNew += perIDSrc.Substring(6,9);< br />& nbsp;<br />& nbsp;&nbsp;&nbsp;//进行加权求和< br />& nbsp;&nbsp;&nbsp;for( int i=0; i&lt;17; i++)< br />& nbsp;&nbsp;&nbsp;{< br />& nbsp;&nbsp;&nbsp;&nbsp;iS += int.Parse(perIDNew.Substring(i,1)) * iW[i];< br />& nbsp;&nbsp;&nbsp;}< br />& nbsp;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;//取模运算,得到模值< br />& nbsp;&nbsp;&nbsp;int iY = iS%11;< br />& nbsp;&nbsp;&nbsp;//从LastCode中取得以模为索引号的值,加到身份证的最后一位,即为新身份证号。< br />& nbsp;&nbsp;&nbsp;perIDNew += LastCode.Substring(iY,1);</p>< p>&nbsp;&nbsp;&nbsp;return perIDNew;<br />& nbsp;&nbsp;}</p>http://www.downcc.com/tech/3397.htmlPHP编程2011/12/09 11:53:38<p>问题: php文件怎么打开,PHP格式文件用什么编辑?< br />< br /> 回答: 关于php文件怎么打开的问题,我想对于一名站长来说并不陌生,老站长们都明白,从一个菜鸟到老鸟的过程,PHP的学习和了解是必须的,如果你不懂什么是PHP,那么很难混下去。< br />< br /> 那么,php文件到底怎么打开,回答:< br />< br /> 1.PHP文件是一个文本文件,如果您在本地是无法用浏览器读取的,但是您可以使用Dreamweaver、Zend Studio 、eclipse或emeditor等软件打开和编辑,如果您还不知道如何编辑PHP,可以参照烈火网的PHP开发手册学习这个强大的WEB开发语言。< br />< br /> 2.PHP在成功开发以后,可以在PHP环境(您可以直接PHP安装包,然后参照IIS下PHP+mysql的安装教程来搭建PHP环境,亦可以直接使用PHP套件,例如:xampp、APMServ等软件)下浏览。</p>http://www.downcc.com/tech/3349.htmlPHP编程2011/11/14 11:55:43<p>最近兼职当个小程序员,在修改用户中心的时候,发现站内短信功能的薄弱,无法批量删除,没有上一封、下一封的查看,操作起来非常繁琐。</p>< p>于是花了一天的时间研究了一下相关的代码,实现了复选框全选和批量删除,以及查看上一封 下一封。<br /> 复选框全选JS<br /> function CheckAll(value,obj) {<br /> var form=document.getElementsByTagName(&ldquo;form&rdquo;)<br /> for(var i=0;i<br /> for (var j=0;j if(form[i].elements[j].type==&quot;checkbox&quot;){<br /> var e = form[i].elements[j];<br /> if (value==&quot;selectAll&quot;){e.checked=obj.checked}<br /> else{e.checked=!e.checked;}<br /> }<br /> }<br /> }<br /> }<br />< strong>全选<br />< /strong>在全选的框内增加一个onclick事件。< br /> 实现批量删除,需要获取选中框的参数。隐去了其他代码,只显示最主要功能实现的代码。<br />& nbsp;<br /> 执行删除功能的页面<br /> $ID_Dele= implode(&ldquo;&lsquo;,&rsquo;&rdquo;,$_POST['ID_Dele']);<br /> $q=& ldquo;delete from zhidaosoft_message where id in (&lsquo;&rdquo;.$ID_Dele.&rdquo;&lsquo;) and username=&rsquo;&rdquo;.htmlspecialchars($_COOKIE[&quot;username&quot;]).&rdquo;&lsquo;&rdquo;;</p>http://www.downcc.com/tech/3233.htmlPHP编程2011/10/17 20:27:44<p>php文件相信很多电脑老手也不知道吧?今天有绿色资源网网友问了编辑这个问题:&ldquo;php文件怎么打开?&rdquo;,其实大家并非是需要去打开php文件,多数只是因为下载东西,错误的下载到成了网页文件,主要是下载站中的下载连接其实是php脚本文件控制的,有的不支持一些下载工具下载,防止大量占用网站服务器资源,当使用讯雷下载的连接就会失效,也可能是服务器链节地址失效,导致下载到的东西只是也个php脚本文件,根本不是你要查找的相关资料,不信大家可以使用记事本打开,里面全部是php英文语法脚本,解决办法大家可以使用目标另存为下载即可。</p>< p>下面简单介绍下什么是php文件,PHP是一种服务器端HTML-嵌入式脚本描述语言。 其最强大和最重要的特征是其数据库集成层,使用它完成一个含有数据库功能的网页是不可置信的简单。在HTML文件中, PHP脚本程序(语法类似于Perl或者c语言)可以使用特别的PHP标签进行引用, 这样网页制作者也不必完全依赖HTML生成网页了。由于PHP是在服务器端执行的, 客户端是看不到PHP代码的。 PHP可以完成任何CGI脚本可以完成的任务,但它的功能的发挥取决于它和各种数据库的兼容性。 PHP除了可以使用HTTP进行通信,也可以使用IMAP, SNMP, NNTP, POP3协议。</p>< p>下面为大家列出<a href="http://www.downcc.com/">绿色资源网</a>程序中的一个php文件给大家看看:</p>< div style="text-align: center"><img border="0" alt="php文件怎么打开?" width="547" height="443" style="cursor: pointer" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-10/20111017202950754.jpg" /><br /> php文件怎么打开?<br />& nbsp;</div>< div style="text-align: left">php文件怎么打开,其实需要编程软件才可以打开,因为.php文件是一个网页脚本程序, 专业人士可以使用Dreamweaver 网页制作软件或者编程软件都可以打开,并进行编辑,对于多数不需要用到的朋友可以使用记事本打开,方法是将鼠标放在php文件上如上图---鼠标右键---选择打开方式----选择记事本打开即可,如下图:</div>< div style="text-align: center"><img border="0" alt="php文件打开方式 -记事本打开" width="387" height="468" style="cursor: pointer" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-10/20111017202950957.jpg" /></div>< p>打开了之后,效果就是上上图中的英文脚本程序了,一般用户也看不懂,编辑因为接触,脚本程序的含义还是知道的,当你下载的是一个类似于asp或php的链接文件时,最终跳转下载的不是下载地址例如后缀类似于rar的文件时,说明您下载存在问题,其原因是你使用的是下载工具下载,但该网站限制下载工具下载,也可能是网站下载链接地址失效,总之下载到是php文件说明您下载失败了,要打开使用记事本可以查看php文件内容。</p>http://www.downcc.com/tech/2786.html.Net编程2011/05/30 09:42:27<p>先下载.net framework2.0和ASPAJAXExtSetup.msi< br /> 然后安装 即可运行< br /> 如果需要开发AJAX< br /> 则要安装VS和AjaxControlToolkit< br /> 在VS工具箱中新建标签 ....< br />< br /> .Net Framework 3.5 环境下请阅读 v3.5 环境下如何布置 AJAX 环境。< br />< br /> 这里所说的环境是指按服务器端实现方式进行的配置。应该说只要安装了 ASP.NET AJAX Extensions 就可以实现一点 Ajax 了,但是要想利用 AJAX 的更多控件,我们一般都还下载了 ASP.NET AJAX Control Toolkit。< br />< br /> 首先,我们应该配置ASP.NET AJAX 运行与开发环境。< br />< br /> 然后,到 ASP.NET AJAX 官方网站下载 ASP.NET 2.0 AJAX Extensions 1.0 (本地下载)和 ASP.NET AJAX Control Toolkit,这两个文件都不大,总共也只有几兆。< br />< br /> 安装 ASP.NET 2.0 AJAX Extensions 1.0,再安装 ASP.NET AJAX Control Toolkit。ASP.NET 2.0 AJAX Extensions 1.0 安装很简单就不介绍了,关于 ASP.NET AJAX Control Toolkit 的安装请参见安装 AJAX Control Toolkit。< br />< br /> 配置ASP.NET AJAX。< br />< br /> 说明< br /> ◆若只作运行环境不作开发环境,可以不安 ASP.NET AJAX Control Toolkit。< br /> ◆配置完成后可能需要重新启动 IIS。< br />< br /> 1&gt;安装Ajax ASPAJAXExtSetup.msi (在http://ajax.asp.net下载)< br />< br /> 2&gt;安装Ajax模板 ASPAJAXSamples.msi< br />< br /> 3&gt;下载 最新版本 ajaxcontroltoolkit< br /> http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=AtlasControlToolkit< br />< br /> 4&gt;解压到C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\AjaxControlToolkit< br />< br /> 5&gt;打开解决方案\AjaxControlToolkit\AjaxControlToolkit.sln,生成工程TemplateVSI< br />< br /> 6&gt;复制\AjaxControlToolkit\SampleWebSite\Bin\AjaxControlToolkit.dll和\AjaxControlToolkit\SampleWebSite\Bin\AjaxControlToolkit.dll< br /> 到 \AjaxControlToolkit\Binaries\< br />< br /> 7&gt;运行\AjaxControlToolkit\TemplateVSI\bin\AjaxControlExtender.vsi 安装模板(选择C#),仅Web< br />< br /> 8&gt;工具箱点右键添加选项卡AJAX Toolkit,在AJAX Toolkit选项卡里右键选择项,在弹出的对话窗口里面选择.NET Framework< br /> 点浏览 C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\AjaxControlToolkit\Binaries\AjaxControlToolkit.dll< br />< br /> 9&gt;在线预览效果 AjaxControlToolkit 最新版本 ajaxcontroltoolkit< br /> http://asp.net/ajax/ajaxcontroltoolkit/samples/< br />< br /> 配置ASP.NET AJAX完成</p>http://www.downcc.com/tech/2785.html.Net编程2011/05/30 09:38:14<p style="text-indent: 2em"><strong>1.new有几种用法</strong></p>< p style="text-indent: 2em">第一种:new Class();</p>< p style="text-indent: 2em">第二种:覆盖方法</p>< p style="text-indent: 2em">public new XXXX(){}</p>< p style="text-indent: 2em">第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。</p>< p style="text-indent: 2em"><strong>2.如何把一个array复制到arrayList里</strong></p>< p style="text-indent: 2em">foreach( object o in array )arrayList.Add(o);</p>< p style="text-indent: 2em"><strong>3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview]</strong></p>< p style="text-indent: 2em">dataset,datatable,dataview , IList</p>< p style="text-indent: 2em"><strong>4.概述反射和序列化</strong></p>< p style="text-indent: 2em">反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性</p>< p style="text-indent: 2em">序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。</p>< p style="text-indent: 2em"><strong>5.概述o/r mapping 的原理</strong></p>< p style="text-indent: 2em">利用反射,配置 将类于数据库表映射</p>< p style="text-indent: 2em"><strong>6.类成员有( )种可访问形式</strong></p>< p style="text-indent: 2em">可访问形式?不懂。</p>< p style="text-indent: 2em">可访问性:public ,protected ,private,internal</p>< p style="text-indent: 2em"><strong>7.用sealed修饰的类有什么特点</strong></p>< p style="text-indent: 2em">sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。</p>< p style="text-indent: 2em">密封类不能同时为抽象类。</p>< p style="text-indent: 2em">sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。</p>< p style="text-indent: 2em"><strong>8.列举ADO.NET中的五个主要对象,并简单描述</strong></p>< p style="text-indent: 2em">connection,command,dataReader,trans,dataset ...</p>< p style="text-indent: 2em"><strong>9.执行下面代码后:</strong></p>< p style="text-indent: 2em">String strTemp =&quot;abcdefg 某某某&quot;;</p>< p style="text-indent: 2em">Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;</p>< p style="text-indent: 2em">Int j = strTemp.Length;</p>< p style="text-indent: 2em">问:i=(14 ) ;j=(11 )</p>< p style="text-indent: 2em">i=(14 ) ;j=(11 ) 中文两个字节</p>< p style="text-indent: 2em"><strong>10.C#中,string str = null 与 string str =&quot;&quot;,请尽量用文字说明区别。(要点:说明详细的内存空间分配)</strong></p>< p style="text-indent: 2em">string str =&quot;&quot; 分配空间</p>< p style="text-indent: 2em"><strong>11.详述.NET里class和struct的异同!</strong></p>< p style="text-indent: 2em">class:放在 ? struct放在?</p>< p style="text-indent: 2em">struct值传递</p>< p style="text-indent: 2em">类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在&ldquo;在堆栈上&rdquo;或&ldquo;内联&rdquo;。细心的程序员有时可以通过聪明地使用结构来增强性能。</p>< p style="text-indent: 2em"><strong>12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。</strong></p>< p style="text-indent: 2em">远程逻辑调用,remoing接口只能用在.net中</p>< p style="text-indent: 2em"><strong>13.什么是code-behind技术</strong></p>< p style="text-indent: 2em">aspx and cs</p>< p style="text-indent: 2em"><strong>14.概述三层结构体系</strong></p>< p style="text-indent: 2em">web/business/dataaccess</p>< p style="text-indent: 2em"><strong>15.asp.net如何实现MVC模式,举例说明!</strong></p>< p style="text-indent: 2em">web/business/dataaccess</p>< p style="text-indent: 2em">----------------------------------------------------------------------------------------------------------</p>< p style="text-indent: 2em"><strong>1.面向对象的思想主要包括什么?</strong></p>< p style="text-indent: 2em">答:这个题范围太广,不知道说什么.</p>< p style="text-indent: 2em"><strong>2.什么是ASP.net中的用户控件</strong></p>< p style="text-indent: 2em">答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整.</p>< p style="text-indent: 2em"><strong>3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?</strong></p>< p style="text-indent: 2em">答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚.</p>< p style="text-indent: 2em"><strong>4.列举一下你所了解的XML技术及其应用</strong></p>< p style="text-indent: 2em">答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它.</p>< p style="text-indent: 2em"><strong>5.值类型和引用类型的区别?写出C#的样例代码。</strong></p>< p style="text-indent: 2em">答:结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的,这个不用多写了吧.</p>< p style="text-indent: 2em"><strong>6.ADO.net中常用的对象有哪些?分别描述一下。</strong></p>< p style="text-indent: 2em">答:connection command sqladapter dataset datatable dataview等等.写不完了.</p>< p style="text-indent: 2em"><strong>7.如何理解委托?</strong></p>< p style="text-indent: 2em">答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.</p>< p style="text-indent: 2em"><strong>msdn2005中是这样解释的:</strong></p>< p style="text-indent: 2em"><strong>委托具有以下特点:</strong></p>< p style="text-indent: 2em"><strong>委托类似于 C++ 函数指针,但它是类型安全的。</strong></p>< p style="text-indent: 2em"><strong>委托允许将方法作为参数进行传递。</strong></p>< p style="text-indent: 2em"><strong>委托可用于定义回调方法。</strong></p>< p style="text-indent: 2em"><strong>委托可以链接在一起;例如,可以对一个事件调用多个方法。</strong></p>< p style="text-indent: 2em"><strong>方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。</strong></p>< p style="text-indent: 2em"><strong>C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。</strong></p>< p style="text-indent: 2em"><strong>8.C#中的接口和类有什么异同。</strong></p>< p style="text-indent: 2em">答:这个异同可多了,要说清楚还真不容易.</p>< p style="text-indent: 2em"><strong>9.。net中读写数据库需要用到哪些类?他们的作用</strong></p>< p style="text-indent: 2em">答:这个类自已可以写的啊,你是指基类吗?那configuration,sqlconnection,sqlcommand等都要用到.</p>< p style="text-indent: 2em"><strong>10.UDP连接和TCP连接的异同。</strong></p>< p style="text-indent: 2em">答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.</p>< p style="text-indent: 2em"><strong>11.ASP.net的身份验证方式有哪些?分别是什么原理?</strong></p>< p style="text-indent: 2em">答:form认证,windows集成认证等,原理不清楚.</p>< p style="text-indent: 2em"><strong>12.</strong><strong>进程</strong><strong>和线程分别怎么理解?</strong></p>< p style="text-indent: 2em">答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子.</p>< p style="text-indent: 2em"><strong>13.什么是code-Behind技术。</strong></p>< p style="text-indent: 2em">答:代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的.</p>< p style="text-indent: 2em"><strong>14.活动目录的作用。</strong></p>< p style="text-indent: 2em">答:这个不明白.请明白的补充一下.</p>< p style="text-indent: 2em"><strong>15..net中读写XML的类都归属于哪些命名空间?</strong></p>< p style="text-indent: 2em">答:http://www.downcc.com/tech/2784.html.Net编程2011/05/30 09:35:46<p>在VS.net 2003新建Web项目时报错“HTTP/1.1 400 Bad Request”的处理方法</p><p>操作系统:Windows Server 2003</p><p><a href="http://www.downcc.com/soft/12310.html" target="_blank" textvalue="http://www.downcc.com/soft/12310.html">http://www.downcc.com/soft/12310.html</a></p><p>开发工具:VS.net 2003</p><p><a href="http://www.downcc.com/soft/9014.html" target="_blank" textvalue="http://www.downcc.com/soft/9014.html">http://www.downcc.com/soft/9014.html</a></p><p>第一次学习用VS.net 2003开启一个已有的Web项目,就遇到了一个拦路虎,当我尝试打开一个“ASP.NET Web应用程序”时,系统提示“尝试创建 Web 项目或打开位于 URL“http://localhost/WebApplication1”的 Web 项目时,Web 服务器报告了以下错误。“HTTP/1.1 400 Bad Request”,在网上找了很久,,终于找到如下解决办法。</p><p>第一步:将Asp.net在iis中重新注册,运行如下命令: aspnet_regiis -i</p><p>第二步:进入IIS管理器,将“默认网站”-“属性”-“网站”,将“ip地址”改为“(全部未分配)”;点击“WEB服务扩展”,将“ASP.NET v1.1.4322 ”改为“允许”。</p>http://www.downcc.com/tech/2783.html.Net编程2011/05/30 09:10:47<p>通常在IIS6下部署ASP.NET MVC应用程序的时候,都是直接设置把所有请求都交由ASP.NET的ISAPI处理。MVC是基于ASP.NET的,框架默认对于任何请求都会优先检查物理路径是否存在物理文件,如果存在的话就不通过MVC的路由机制,否则才走路由。</p>< p>因此,如果在不考虑控制静态资源权限的情况下,可以设置静态资源不通过ASP.NET的ISAPI,而直接由IIS处理,通过这种方式提升一些性能。本文围绕这个主题,详解部署过程。</p>< p>0.在设计MVC网站的时候,把静态资源统一放在一个文件夹下,建议目录结构使用小写字母</p>< p>1.把web应用程序发布到某个路径下(略)(顺便提一句,MVC2功能上比MVC3弱一些,用到的组件很少,可以直接私有部署System.Web.Mvc;但是MVC3因为功能增加,而且引入了Razor引擎,依赖的组件增多,建议在部署的时候直接安装MVC3)</p>< p>2.创建一个web站点(略)</p>< p>3.右击创建的web站点,选择属性,切换到Home Directory页</p>< p align="center"><img height="400" alt="clip_image001" width="412" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091536652.png" /></p>< p>4.点击Configuration,在Wildcard application maps中,点击Insert,添加C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll,取消Verify that file existsg的勾选。(如果使用MVC2的话,可以到2.0下去找这个dll。这里去掉对静态文件的验证是关键,这使得asp.net处理所有的请求)</p>< p align="center"><img height="402" alt="clip_image001" width="416" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091536968.jpg" /></p>< p>5.点OK</p>< p align="center"><img height="454" alt="clip_image001[6]" width="412" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091537844.png" /></p>< p>6.允许ASP.NET 4.0扩展</p>< p align="center"><img height="294" alt="" width="570" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091537465.jpg" />&nbsp;</p>< p>7.content目录是静态资源放置的目录,设置content目录下请求直接由IIS处理以提高性能。右击content,属性</p>< p align="center"><img height="377" alt="clip_image001[6]" width="405" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091537803.jpg" /></p>< p>8.点击create,再点击configuration,移除Wildcard application maps下的内容。点击OK。这里利用了IIS的一个bug,把目录设置成虚拟目录,删除Wildcard application maps的设置,这样这个虚拟目录的请求就直接由IIS处理了。</p>< p align="center"><img height="443" alt="clip_image001[8]" width="403" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091537304.png" /></p>< p>9. 再点击Remove,把虚拟目录恢复成普通目录。这样只有这个目录下的文件会受到IIS的&ldquo;眷顾&rdquo;</p>< p align="center"><img height="385" alt="clip_image001[10]" width="411" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091537205.png" /></p>< p>10.设置AppPool权限。点击站点使用的AppPool的属性,切换到Identity,选择Local System。这是偷懒的设置方法,以避免出现应用程序本身对系统的访问权限不够</p>< p align="center"><img height="376" alt="clip_image001[14]" width="399" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091538234.png" /></p>< p>11.设置匿名访问权限。右击站点,选择权限。点击Add&hellip;,在弹出的对话框中输入IUSR_XXX(XXX为机器名)。</p>< p align="center"><img height="266" alt="clip_image001[16]" width="494" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091538270.png" /></p>< p>点击OK,便可添加一个Internet Guest Account,保持默认的只读权限即可。</p>< p align="center"><img height="484" alt="clip_image001[18]" width="402" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091538150.png" /></p>< p>12.最后注意,如果是首次安装.NET 4.0,不要忘了注册</p>< p align="center"><img height="160" alt="" width="550" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091538770.jpg" />&nbsp;</p>< p>在深入理解ASP.NET MVC(2)中,讨论过MVC框架的路由机制,其中提到&ldquo;可以通过设置RouteCollection的RouteExistingFiles为true,使得路由不匹配静态文件(注意true是不匹配,这个命名和奇怪)。&rdquo;因此,我们可以这样设置,以使得MVC不对静态文件进行检查,这样又可以提高一点性能。最终请求会像下图那样被serve</p>< p align="center"><img height="183" alt="" width="225" border="0" src="http://pic.pdowncc.com/upload/tech/UploadPic/2011-5/201153091538813.jpg" />&nbsp;</p>http://www.downcc.com/tech/2780.htmlAsp编程2011/05/28 21:09:18<p>前个月朋友接到一个asp的私活,于是就做了。< br />< br /> 技术方面没什么难点,asp虽然以前没怎么写过,可是看看书也就OK了。< br />< br /> 基本全部做完后,出了一个bug。< br />< br />& nbsp; 前期做的时候,登录方式顺手用了ajax来做,登录前先判断在session中是否存在值,如果存在,那么无需登录;如果不存在,那就弹出登录页面登录。&nbsp;</p>< p>&nbsp; 由于我是用的ff浏览器,一直没发现什么问题。上个礼拜提交给用户看的时候,说用IE登录完之后无效,大惊。结果还真的是这样。。很囧&nbsp;</p>< p>&nbsp; 登录代码如下:&nbsp;</p>< div >< div >< div >Java代码</div>< /div>< ol >< li><span><span ><font color="#008200">//从服务器查询是否存在session< /font></span><span>&nbsp;&nbsp;</span></span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j.ajax({& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:</span><span ><font color="#0000ff">&quot;GET&quot;</font></span><span>,& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:</span><span ><font color="#0000ff">&quot;sessioncheck.asp&quot;</font></span><span>,& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:</span><span ><font color="#0000ff">&quot;&quot;</font></span><span>,& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout:&nbsp;</span><span ><font color="#c00000">1000</font></span><span>,& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;function(){& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span ><font color="#0000ff">'sorry,&nbsp;server&nbsp;is&nbsp;busy&nbsp;now!'</font></span><span>);& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:function(comments_data){& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span ><strong><font color="#7f0055">if</font></strong></span><span>(comments_data&nbsp;==&nbsp;</span><span ><font color="#c00000">1</font></span><span>){& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.createDialog(opts);& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j.startOver();& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span ><strong><font color="#7f0055">else</font></strong></span><span>{& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sql&nbsp;=&nbsp;selectSQL(searchkey,stype);& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.location.href&nbsp;=&nbsp;sql;& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li>< /ol>< /div>< pre title="ASP中用ajax方式获得session" pre_index="0" source_url="http://leobluewing.iteye.com/blog/337650" codeable_type="Post" codeable_ style="display: none"> //从服务器查询是否存在session j.ajax({ type:&quot;GET&quot;, url:&quot;sessioncheck.asp&quot;, data:&quot;&quot;, timeout: 1000, error: function(){ alert('sorry, server is busy now!'); }, success:function(comments_data){ if(comments_data == 1){ el.createDialog(opts); j.startOver(); } else{ var sql = selectSQL(searchkey,stype); window.location.href = sql; } } });< br /><br />大致是这样 sessioncheck.asp里面无非就是去查session,代码如下:< /pre>< div >< div >< div >Java代码</div>< /div>< ol >< li><span><span ><strong><font color="#7f0055">if</font></strong></span><span>&nbsp;session(</span><span ><font color="#0000ff">&quot;username&quot;</font></span><span>)&nbsp;=&nbsp;</span><span ><font color="#0000ff">&quot;&quot;</font></span><span>&nbsp;then& nbsp;&nbsp;</span></span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span ><font color="#0000ff">&quot;1&quot;</font></span><span>)& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span ><strong><font color="#7f0055">else</font></strong></span><span>&nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span ><font color="#0000ff">&quot;2&quot;</font></span><span>)& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span ><strong><font color="#7f0055">if</font></strong></span><span>&nbsp;&nbsp;</span></li>< /ol>< /div>< pre title="ASP中用ajax方式获得session" pre_index="1" source_url="http://leobluewing.iteye.com/blog/337650" codeable_type="Post" codeable_ style="display: none"> if session(&quot;username&quot;) =& quot;&quot; then Response.Write(&quot;1&quot;) else Response.Write(&quot;2&quot;) end if< /pre>< p>结果就是用IE这个session(&quot;username&quot;)死活没有,timeout设置了也没用。< br />< br /> 去网上查了半天,发现同样问题的还挺多,最后查到原因:缓存问题。< br />< br /> 异步get获取时,如果url不变,是直接调用的缓存中的信息,然后就导致了一直获得不到session里的值。< br />< br /> 解决方法那很简单了,google& quot;asp 清除缓存&quot; 一大堆。</p>< p>最后是在sessioncheck.asp里添加了一段,如下:</p>< div >< div >< div >Java代码</div>< /div>< ol >< li><span><span>Response.Buffer&nbsp;=True& nbsp;&nbsp;</span></span></li>< li><span>&nbsp;&nbsp;Response.ExpiresAbsolute&nbsp;=Now()&nbsp;-&nbsp;</span><span ><font color="#c00000">1</font></span><span>&nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;Response.Expires=</span><span ><font color="#c00000">0</font></span><span>&nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;Response.CacheControl=</span><span ><font color="#0000ff">&quot;no-cache&quot;</font></span><span>&nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span ><strong><font color="#7f0055">if</font></strong></span><span>&nbsp;session(</span><span ><font color="#0000ff">&quot;username&quot;</font></span><span>)&nbsp;=&nbsp;</span><span ><font color="#0000ff">&quot;&quot;</font></span><span>&nbsp;then& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span ><font color="#0000ff">&quot;1&quot;</font></span><span>)& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span ><strong><font color="#7f0055">else</font></strong></span><span>&nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span ><font color="#0000ff">&quot;2&quot;</font></span><span>)& nbsp;&nbsp;</span></li>< li><span>&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span ><strong><font color="#7f0055">if</font></strong></span><span>&nbsp;&nbsp;</span></li>< /ol>< /div>< pre title="ASP中用ajax方式获得session" pre_index="2" source_url="http://leobluewing.iteye.com/blog/337650" codeable_type="Post" codeable_ style="display: none"> Response.Buffer =True Response.ExpiresAbsolute =Now() - 1http://www.downcc.com/tech/2779.htmlAsp编程2011/05/28 21:03:55<p><span ><font color="#000000">&lt;%< br /> '//hittime 日期型:获得上次访问时间< br /> '//hits 数字型:获得总浏览量< br /> '//hitsday 数字型:获得今天浏览量< br /> '//hitsweeks 数字型:获得本周浏览量< br /> '//hitmonths 数字型:获得本月浏览量< br /> '数据库中 添加这5个字段。< br /> set rs1=server.CreateObject(&quot;adodb.recordset&quot;)< br /> rs1.open& quot;select * from qwbmnewssss where id=26&quot;,conn,1,3< br /> if rs1.eof and rs1.bof then< br /> response.write& quot;erry&quot;< br /> else< br /> hittime = rs1(&quot;hittime&quot;) '获得上次访问时间< br /> dim dayNow,monthNow,weeknow< br /> dayNow = day(date()) '现在几号< br /> monthNow = month(date()) '现在几月< br /> weekNow = weekday(date()) '现在星期几 0为星期天< br /> rs1(&quot;hits&quot;) = rs1(&quot;hits&quot;) + 1 '总浏览次数 + 1< br />< br /> if datediff(&quot;d&quot;,hittime,now()) = 0 then '比较最后访问日期与现在的时间 天数< br /> rs1(&quot;hitsday&quot;) = rs1(&quot;hitsday&quot;) + 1 '今天的浏览量 + 1< br /> else< br /> rs1(&quot;hitsday&quot;) = 1 '今天的浏览量 = 1< br /> end if< br />< br /> if monthNow = month(hittime) then< br /> rs1(&quot;hitmonths&quot;) = rs1(&quot;hitmonths&quot;) + 1 '本月的浏览量 + 1< br /> else< br /> rs1(&quot;hitmonths&quot;) = 1 '本月的浏览量 + 1< br /> end if< br />< br /> if datediff(&quot;d&quot;,hittime,now())& gt; 6 then '在处理星期的期的时候有一个问题,如果上一个时间是星期五,下一次访问是下个星期的星期二,记录还是叠加。< br /> rs1(&quot;hitsweeks&quot;) = 1< br /> else< br /> if weekNow& lt;&gt; 1 then< br /> rs1(&quot;hitsweeks&quot;) = rs1(&quot;hitsweeks&quot;) + 1< br /> else< br /> weekNowss = weekday(hittime) '上次访问的星期几< br /> if weekNow = weekNowss then< br /> rs1(&quot;hitsweeks&quot;) = rs1(&quot;hitsweeks&quot;) + 1< br /> else< br /> rs1(&quot;hitsweeks&quot;) = 1< br /> end if< br /> end if< br /> end if< br />< br /> rs1(&quot;hittime&quot;) = now() '更新最后的访问题意< br /> rs1.update< br /> %&gt;< br /> 时间比较:&lt;%=datediff(&quot;d&quot;,hittime,now())%&gt;&lt;br /&gt;< br /> 当前时间:&lt;%=now()%&gt;&lt;br /&gt;< br /> 最后点击时间:&lt;%=hittime%&gt;&lt;br /&gt;< br /> 当前天:&lt;%=dayNow%&gt;&lt;br /&gt;< br /> 当前月:&lt;%=monthNow%&gt;&lt;br /&gt;< br /> 当前周:&lt;%=weekNow%&gt;&lt;br /&gt;< br />< br /> 总共浏览量:&lt;%=rs1(&quot;hits&quot;)%&gt;&lt;br /&gt;< br /> 今天访问量:&lt;%=rs1(&quot;hitsday&quot;)%&gt;&lt;br /&gt;< br /> 星期访问量:&lt;%=rs1(&quot;hitsweeks&quot;)%&gt;&lt;br /&gt;< br /> 当月访问量:&lt;%=rs1(&quot;hitmonths&quot;)%&gt;&lt;br /&gt;< br />& lt;%< br /> end if< br /> rs1.close< br /> set rs1=nothing< br /> %&gt;< /font></span></p>http://www.downcc.com/tech/2778.htmlAsp编程2011/05/28 21:01:20<p><span ><font color="#000000">'================================================< br /> ' 函数名:ChkMapPath< br /> ' 作 用:相对路径转换为绝对路径< br /> ' 参 数:strPath ----原路径< br /> ' 返回值:绝对路径< br /> '================================================< br /> Function ChkMapPath(ByVal strPath)< br /> Dim fullPath< br /> strPath = Replace(Replace(Trim(strPath),& quot;/&quot;,& quot;\&quot;),& quot;\\&quot;,& quot;\&quot;)< br />< br /> If strPath =& quot;&quot; Then strPath =& quot;.&quot;< br /> If InStr(strPath,&quot;:\&quot;) = 0 Then< br /> fullPath = Server.MapPath(strPath)< br /> Else< br /> strPath = Replace(strPath,&quot;..\&quot;,&quot;&quot;)< br /> fullPath = Trim(strPath)< br /> If Right(fullPath, 1) =& quot;\&quot; Then< br /> fullPath = Left(fullPath, Len(fullPath) - 1)< br /> End If< br /> End If< br /> ChkMapPath = fullPath< br /> End Function</font></span></p>http://www.downcc.com/tech/2406.htmlAsp编程2011/04/08 14:49:03<p>对象不支持此属性或方法: 'Response.CharSet'给客户开发的一个web系统,本来计划是在IIS下运行,无奈客户那边的电脑操作系统IIS无论怎样都安装不了,总不能要求客户为了这个web系统重新安装操作系统吧?所以想到了NetBox。&nbsp;</p>< p>开发的时候都是在IIS下进行调试,然后用NetBox运行,基本上一切正常,客户使用了一段时间后,提出增加一个新的功能,于是用ajax增加了一个新功能,NetBox下运行出错,&nbsp;< br /> 错误提示:&nbsp;< br /> 运行时错误 '800a01b6'&nbsp;&nbsp;< br /> 对象不支持此属性或方法: 'Response.CharSet'&nbsp;&nbsp;< br /> ---------------------------------------------------------------------&nbsp;< br /> (百度一下,还有很多人遇到同样的错误)&nbsp;< br /> Microsoft VBScript runtime error '800a01b6'&nbsp;&nbsp;&nbsp;< br /> Object doesn't support this property or method: 'Response.Charset'&nbsp;&nbsp;&nbsp;</p>< p>检查出错代码:&nbsp;< br /> Response.CharSet&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;& quot;GB2312&quot;&nbsp;&nbsp;</p>< p>这行代码主要是为了解决ajax用get获得数据时,中文乱码的问题。&nbsp;< br /> 删除这行代码后netbox正常运行,但是ajax返回的中文数据成了乱码。< br /> 说明 NetBox不支持 Response.CharSet 。</p>< p>打开netbox的使用手册,依次展开:< br /> 对象参考& rarr; Response 对象& rarr; Response 方法< br /> AddHeader 方法&nbsp;< br /> AddHeader 方法用指定的值添加 HTML 标题。该方法常常向响应添加新的 HTTP 标题&nbsp;< br /> 语法&nbsp;< br /> Response.AddHeader name, value&nbsp;< br /> 参数&nbsp;< br /> name&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp; 新的标题变量的名称&nbsp;< br /> value&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp; 存储在新的标题变量中的初始值&nbsp;&nbsp;< br /> 注释&nbsp;< br /> 为避免命名不明确,name 中不能包含任何下划线字符 (_)。ServerVariables 集合将标题中的下划线字符解释为反斜杠。例如,下面的脚本使服务器查找一个名为 MY-HEADER 的标题名。&nbsp;</p>< p>&nbsp;< br /> 示例&nbsp;< br /> 下面这个示例使用 AddHeader 方法要求客户端使用 BASIC 验证。&nbsp;</p>< p>&nbsp;< br /> 注意 前面的脚本仅通知客户端浏览器使用哪个验证。若您在 Web 应用程序中使用该脚本,则一定要启用 Web 服务器的 BASIC 验证。&nbsp;</p>< p>于是将&nbsp;< br /> Response.CharSet&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;& quot;GB2312&quot;&nbsp;&nbsp;&nbsp;< br /> 替换成:< br /> Response.Addheader& quot;Content-Type&quot;,&quot;text/html; charset=gb2312&quot;</p>< p>NetBox环境下ajax用get获取数据,中文乱码的问题解决!</p>http://www.downcc.com/tech/2398.html.Net编程2011/04/01 23:25:32<p>当一个客户端页面访问IIS试图获取一些信息的时候,发生了什么事情?一个请求在通过了HTTP管道后又发生了什么?本文主要是描述这两个过程,即IIS处理asp.net请求和asp.net的页面生命周期。欢迎大家积极拍砖,共同学习,共同进步。<br />< br /> 首先我们要弄清楚两个非常重要的概念:<br />< br /> 1, worker process(w3wp.exe). worker process管理所有的来自客户端的请求并给出响应。它是IIS下asp.net应用程序的核心。<br />< br /> 2, application pool. 它是worker process的容器,IIS5及之前的IIS版本均没有application pool的概念。每一个application pool对应着一个worker process,在IIS Metabase中维护着Application Pool和worker process的Mapping。这就避免了IIS5中出现的worker process(IIS5中是aspnet_wp.exe,同一时间只能运行一个该进程)崩溃,application全崩溃的局面。<br />< br /> 客户端向IIS发出一个资源请求后发生了如下事情:<br />< br /> 1, server接受该请求<br />< br /> IIS6通过内核模式(Kernel mode)中的HTTP.SYS来分发各个Request到application pool。 这并不是随机的过程,在application pool创建的时候就已经注册到了HTTP.SYS,所以当请求来到时HTTP.SYS会直接发送到相应的application pool。 接下来在IIS的用户模式(User mode)中,Web Admin Services (WAS) 做了从HTTP.SYS中得到Request并分发到application pool的工作。application pool直接把request传递给worker process。<br />< br /> 2, 请求传递到worker process后,worker process初始化加载ASP.NET ISAPI(Internet Server Application Program Interface),ASP.NET ISAPI进而加载CLR创建托管环境。<br />< br /> (注:ISAPI只是一个接口,起到一个代理的作用,主要能力就是根据Request URL的后缀来寻找该后缀的处理程序)<br />< br /> ASP.NET ISAPI定义在aspnet_isapi.dll中,它本身运行在一个非托管的环境中。ASP.NET ISAPI开始一个HttpRuntime, HttpRuntime调用ProcessRequest方法来开始处理请求。ProcessRequest根据ISAPI传进来的iWRType 来创建不同的HttpWorkerRequest,从而屏蔽了不同IIS的差异。接下来ProcessRequest方法创建了HttpContext,我们使用HTTPContext.Current来访问它。在HttpRuntime使用HttpApplicationFactory创建了HttpApplication对象(IHttpHandler)以后,所有的请求都会在通过httpmodule后找到相应的Httphandler进行处理。在HttpApplicationFactory创建HttpApplication之前,会查找config(web.config和Machine.config)文件中注册的所有的HttpModule,并根据配置信息加载相应的Assembly,通过Reflection创建对应的HttpModule,并将这些Module加到HttpApplication 的_moduleCollection Filed中。我们对一个Application的请求最终会落到一个HttpApplication对象上。当一个请求到来时,ASP.NET会在Httplication Pool中查找未被使用的HttpApplication对象。<br />< br /> 3, 请求通过HTTP管道后,每个请求都发向相关的各自的httphandler,IIS请求处理过程结束。<br />< br /> HttpHandler是HTTP管道的终点,它为每个request生成输出。System.Web.UI.Page就是这样一个典型的Httphandler,当我们请求一个aspx页面,这个HttpHandler就生成html发送回客户端。看Page类的签名:<br />< br /> public class Page : TemplateControl, IHttpHandler<br />< br /> {<br />< br /> }<br />< br /> 可以看到,Page类就是一个HttpHandler。<br />< br /> 综上整个过程就是:当客户端向服务器发送资源请求时,请求首先到达IIS的HTTP.SYS。然后HTTP.SYS发送请求道对应的Application Pool。 然后Application Pool发送请求到Worker Process(W3WP.exe)中加载ISAPI Extension,ISAPI创建一个HttpRuntime对象来通过HttpModule和HttpHandler处理请求。 然后页面生命周期就开始了。<br />< br /> 4, 页面生命周期开始<br />< br /> 页面生命周期的主要阶段包括:<br />< br /> 页面初始化(Init): 服务器创建服务器控件的实例<br />< br /> 加载(load): 控件实例被加载到它定义的页面对象中<br />< br /> 预输出:(PreRender) 对控件的更改被更新,准备输出。<br />< br /> 保存(SaveViewState): 控件的状态信息被保存。<br />< br /> 输出页面(Render):服务器为控件创建html标记。<br />< br /> 处理(Dispose): 主要做的工作就是dispose, 关闭数据库连接,文件资源的释放等。<br />< br /> 卸载(Unload):销毁服务器控件的实例<br />< br /> 页面生命周期的主要事件:<br />< br /> PreInit:<br />< br /> 1.检查IsPostBack 属性<br />< br /> 2.动态设置Master Page<br />< br /> 3.动态设置Theme<br />< br /> 4.设置控件的默认值(UniqueId等)<br />< br /> 5.重新创建动态控件(初始化控件),初始化控件的值<br />< br /> Init: 这个事件发生在所有的控件被初始化,所有的皮肤设置被应用以后。它用来读取或者初始化控件属性。它能够用来注册一些aspx页面中没有指出的控件的事件。<br />< br /> InitComplete: Use this event for processing tasks that require all initialization to be complete.<br />< br /> PreLoad: 加载页面的ViewState和所有的控件,然后处理所有的包含在Request实例中的postback数据。<br />< br /> Load: 这个事件可能是大家最熟悉的了。需要注意的是,Page对象会递归的调用子控件的onload事件直到页面和所有的子控件被加载完成。这个事件主要用来设置控件属性的值,建立数据库连接(通常不这么做)。<br />< br /> Control events: 这个就不多说了,主要是处理控件的事件,例如click。这也就让我们明白了每次我们click一个Button的时候,实际上是要先去执行load事件然后才执行click事件的,一般我们用!IsPostBack来判断一下从而避免执行不必要的加载逻辑。<br />< br /> LoadComplete: 页面所有的控件都被加载以后执行,暂时没有想到用来干什么。。。<br />< br /> PreRender: 在HTML被生成之前这是最后一个事件。每一个页面中的控件都有PreRender的过程。在这里对将要输出的HTML结果进行最后一次修改。<br />< br /> SaveStateComplete: 在这个时间发生之前,已经保存了所有控件和页面的,任何对page或者控件的改动都不会产生左右。暂时没想到用来干啥。<br />< br /> Render: 它不是一个事件而是一个方法。工作就是把HTML写回客户端浏览器。<br />< br /> UnLoad: 页面中的每一个控件都会发生这件事。在控件中,使用这个事件来做清理工作,例如关闭数据库连接等。对与页面本身也是做清理工作,例如关闭打开的文件和数据库连接,或者结束日志或者其它指定的工作。<br />< br /> 需要说明的是,每次Request都会创建一个全新的Page类的实例,所以在页面中的自己定义的字段是不能在两次request中传递值的,需要使用viewstate来存储。<br />< br /> 5, HttpHandler根据页面生命周期中事件的处理把结果发回IIS,IIS再把结果发回客户端浏览器。<br />< br /> 值得注意的是,在这个过程中请求会再次通过HttpModule(注册一个EndRequest事件)。<br />< br /> 至此,整个Request结束。</p>http://www.downcc.com/tech/2397.html.Net编程2011/04/01 23:24:17<p>在IIS6中同时启用了ASP.NET 2.0 和 ASP.NET 4.0 后,网站程序可能会出现如下错误:&ldquo; System.Web.HttpException: Path& lsquo;//eurl.axd/&lsquo; was not found.& rdquo;<br />< br /> 错误发生的原因是当ASP.NET检测到Web站点配置为使用ASP.NET 4.0,本地ASP.NET 4.0 的组件会传递一个不能扩展的 URL到ASP.NET的管理程序作进一步处理。但是,如果一个低于ASP.NET 4.0 的网站配置为使用ASP.NET 2.0,处理这样不能扩展的 URL 时,URL的修改结果中会包含字符串&ldquo;eurl.axd&rdquo;,修改后的URL会被发送到 ASP.NET 2.0应用程序。<br />< br /> ASP.NET 2.0中是不能识别&ldquo;eurl.axd&rdquo;的。因此ASP.NET 2.0会尝试查找一个文件名为&ldquo;eurl.axd&rdquo;的文件并执行它。因为没有这样的文件,所以会请求失败,Http异常并抛出带有字符串&ldquo;eurl.axd&rdquo;的错误。<br />< br />< span style="font-weight: bold">有三种方法可以解决这样的问题:</span><br />< br /> 1.如果网站程序不需要ASP.NET 4&lrm;.0 的支持,那么可以直接配置网站使用ASP.NET 2.0。<br />< br /> 2.如果网站程序需要ASP.NET 4&lrm;.0的支持,就需要将该网站下使用ASP.NET 2.0的虚拟目录移动到其他网站。<br />< br /> 3.如果上面两种方法都不适用于你的实际情况,那么就只能用这种方法了:<br />< br /> 打开注册表找到&ldquo;HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\ASP.NET\\4.0.30319.0&rdquo;,添加键值名为&ldquo;EnableExtensionlessUrls&rdquo; 类型为&ldquo;DWORD&rdquo;的键值,并设置值为&ldquo;0&rdquo;。然后在cmd中运行&ldquo;IISRESET&rdquo;,重启IIS以读取注册表修改后的内容。注:此项修改就是关闭ASP.NET 4&lrm;.0对无扩展URL的处理,若将此项键值设为&ldquo;1&rdquo;则开启。</p>http://www.downcc.com/tech/2282.htmlPHP编程2011/03/14 19:14:11<p>随着乔布斯的回归,iPad2的发布,看来移动端的开发话题越来越火热了。在此列出一些能够在iOS的最大竞争者&mdash;&mdash;安卓(Android)系统的检测方法。</p>< p><strong>JavaScript判断方法</strong></p>< p>搜索user agent字符串中的Android单词是最省事儿的方法:</p>< pre><ol ><li ><span><span ><strong><font color="#006699">if</font></strong></span><span>(navigator.userAgent.match(/Android/i))&nbsp;{& nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;</span><span ><font color="#008200">//&nbsp;Do&nbsp;something!< /font></span><span>&nbsp;</span></li><li ><span>&nbsp;&nbsp;&nbsp;</span><span ><font color="#008200">//&nbsp;Redirect&nbsp;to&nbsp;Android-site?< /font></span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;window.location&nbsp;=&nbsp;</span><span ><font color="#0000ff">'http://android.davidwalsh.name'</font></span><span>;& nbsp;</span></li><li ><span>&nbsp;}&nbsp;</span></li></ol></pre>< p><strong>PHP判断方法</strong></p>< p>同样,我们可以在PHP中使用strstr方法搜索user agent中是否有Android:</p>< pre><ol ><li ><span><span ><strong><font color="#006699">if</font></strong></span><span>(</span><span >strstr</span><span>(</span><span ><font color="#dd0000"><p>随着乔布斯的回归,iPad2的发布,看来移动端的开发话题越来越火热了。在此列出一些能够在iOS的最大竞争者&mdash;&mdash;安卓(Android)系统的检测方法。</p>< p><strong>JavaScript判断方法</strong></p>< p>搜索user agent字符串中的Android单词是最省事儿的方法:</p>< pre><ol ><li ><span><span ><strong><font color="#006699">if</font></strong></span><span>(navigator.userAgent.match(/Android/i))&nbsp;{& nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;</span><span ><font color="#008200">//&nbsp;Do&nbsp;something!< /font></span><span>&nbsp;</span></li><li ><span>&nbsp;&nbsp;&nbsp;</span><span ><font color="#008200">//&nbsp;Redirect&nbsp;to&nbsp;Android-site?< /font></span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;window.location&nbsp;=&nbsp;</span><span ><font color="#0000ff">'http://android.davidwalsh.name'</font></span><span>;& nbsp;</span></li><li ><span>&nbsp;}&nbsp;</span></li></ol></pre>< p><strong>PHP判断方法</strong></p>< p>同样,我们可以在PHP中使用strstr方法搜索user agent中是否有Android:</p>< pre> ___FCKpd___1</pre>< p>另外,可以通过.htaccess来判断</p>< p>我们可以使用.htaccess来判断和响应安卓设备!</p>< pre><ol ><li ><span><span>RewriteCond&nbsp;%{HTTP_USER_AGENT}&nbsp;^.*Android.*$& nbsp;</span></span></li><li><span>&nbsp;RewriteRule&nbsp;^(.*)___FCKpd___2nbsp;http://android.davidwalsh.name&nbsp;[</span><span ><font color="#ff0000">R</font></span><span>=</span><span ><font color="#0000ff">301</font></span><span>]&nbsp;</span></li></ol></pre>< p>这样你就掌握了全部三种安卓设备的检测方法。<br />< br /> 原文链接:http://article.yeeyan.org/view/56089/176760</p> SERVER</font></span><span>[</span><span ><font color="#0000ff">'HTTP_USER_AGENT'</font></span><span>],</span><span ><font color="#0000ff">'Android'</font></span><span>))&nbsp;{& nbsp;</span></span></li>< li><span>&nbsp;&nbsp;&nbsp;header(</span><span ><font color="#0000ff">'Location:&nbsp;http://android.davidwalsh.name'</font></span><span>);& nbsp;</span></li>< li ><span>&nbsp;&nbsp;&nbsp;</span><span >exit</span><span>();& nbsp;</span></li>< li><span>&nbsp;}&nbsp;</span></li>< /ol>< /pre>< p>另外,可以通过.htaccess来判断</p>< p>我们可以使用.htaccess来判断和响应安卓设备!</p>< pre> ___FCKpd___2</pre>< p>这样你就掌握了全部三种安卓设备的检测方法。<br />< br /> 原文链接:http://article.yeeyan.org/view/56089/176760</p>http://www.downcc.com/tech/2260.htmlPHP编程2011/03/10 19:55:20<p>function deldir($dir) {<br />& nbsp; $dh=opendir($dir);<br />& nbsp; while ($file=readdir($dh)) {<br />& nbsp;& nbsp; if($file!=&quot;.&quot;& amp;&amp; $file!=&quot;..&quot;) {<br />& nbsp;& nbsp;& nbsp; $fullpath=$dir.&quot;/&quot;.$file;<br />& nbsp;& nbsp;& nbsp; if(!is_dir($fullpath)) {<br />& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; unlink($fullpath);<br />& nbsp;& nbsp;& nbsp; } else {<br />& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; deldir($fullpath);<br />& nbsp;& nbsp;& nbsp; }<br />& nbsp;& nbsp; }<br />& nbsp; }<br />< br />& nbsp; closedir($dh);<br />& nbsp;< br />& nbsp; if(rmdir($dir)) {<br />& nbsp;& nbsp; return true;<br />& nbsp; } else {<br />& nbsp;& nbsp; return false;<br />& nbsp; }<br /> }</p>http://www.downcc.com/tech/2259.htmlPHP编程2011/03/10 19:52:51http://www.downcc.com/tech/2258.htmlPHP编程2011/03/10 19:34:51<p>函数header作用:&nbsp;&nbsp;<br />& nbsp;& nbsp;页面跳转<br />< br /> http头信息<br />& nbsp;& nbsp;头信息的作用很多,最主要的有下面几个:<br /> 1、跳转<br />& nbsp;& nbsp;当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转。但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。<br />& nbsp;& nbsp;例:header(&quot;Location:< a href="http://www.downcc.com/">http://www.downcc.com/</a>&quot;);<br />< br /> 2、指定网页的内容<br />& nbsp;& nbsp;同样一个XML文件,如果头信息中指定:Content-type: application/xml 的话,浏览器会将其按照XML文件格式解析。但是,如果头信息中是:Content-type: text/xml 的话,浏览器就会将其看作存文本解析。(浏览器不是按照扩展名解析文件的)<br />& nbsp;& nbsp;例:header('Content-type: application/pdf');<br />< br /> 3、附件<br />& nbsp;& nbsp;不知道大家有没有注意,有些时候在一些网站下载东西,点下载连接以后,结果浏览器将这个附件当成网页打开了,里面显示的都是乱码,这个问题也和头信息有关。有时候浏览器根据Content-type 来判断是打开还是保存,这样有时就会判断错误(主要是网站设计者忘记写Content-type)。其实,还有一个可以来指定该内容为附件、需要保存,这个就是:Content-Disposition: attachment; filename=&quot;xxxxx&quot;<br />& nbsp;& nbsp;例:header('Content-Disposition: attachment; filename=&quot;downloaded.pdf&quot;');<br />& nbsp;& nbsp;&nbsp;& nbsp;//打开文件,并输出<br />& nbsp;& nbsp;&nbsp;& nbsp;readfile('original.pdf');<br />< br /> HTTP协议状态码< br /> 1&times;&times;  保留&nbsp;&nbsp;<br /> 2&times;&times;  表示请求成功地接收&nbsp;&nbsp;<br /> 3&times;&times;  为完成请求客户需进一步细化请求&nbsp;&nbsp;<br /> 4&times;&times;  客户错误&nbsp;&nbsp;<br /> 5&times;&times;  服务器错误&nbsp;&nbsp;<br />< br /> 语法:<br />& nbsp;& nbsp;header(string,replace,http_response_code)<br /> 参数<br />& nbsp;& nbsp;string:必需。规定要发送的报头字符串。<br />& nbsp;& nbsp;replace:可选。指示该报头是否替换之前的报头,或添加第二个报头。默认是 true(替换)。false(允许相同类型的多个报头)。<br />& nbsp;& nbsp;http_response_code:可选。把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用)<br />< br /> 例1:<br />& nbsp;& nbsp;重定向网页</p>< div>< div >< ol>< li>&nbsp;& nbsp;&lt;?php< br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp;header(&quot;Location:< a href="http://www.downcc.com/">http://www.downcc.com/</a>&quot;);<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp;exit;<br />& nbsp;</li>< li>&nbsp;& nbsp;?&gt;</li>< /ol>< /div>< /div>< p>例2:<br />& nbsp;& nbsp;强制用户每次访问这个页面时获取最新资料,而不是使用存在客户端的缓存。</p>< div>< div >< ol>< li>&nbsp;& nbsp;&lt;?php&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; //告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可。&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header(&quot;Expires:Mon,26 Jul 1970 05:00:00 GMT&quot;);&nbsp;&nbsp;<br />& nbsp;</li>< li><br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; //告诉浏览器此页面的最后更新日期(用格林威治时间表示)也就是当天,目的就是强迫浏览器获取最新资料&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header(&quot;Last-Modified:&quot;.gmdate(&quot;D,d M Y H:i:s&quot;).&quot;GMT&quot;);&nbsp;&nbsp;<br />& nbsp;</li>< li><br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; //告诉客户端浏览器不使用缓存&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header(&quot;Cache-Control:&nbsp;& nbsp; no-cache,&nbsp;& nbsp; must-revalidate&quot;);&nbsp;&nbsp;<br />& nbsp;</li>< li><br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; //参数(与以前的服务器兼容),即兼容HTTP1.0协议&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header(&quot;Pragma:&nbsp;& nbsp; no-cache&quot;);< br />& nbsp;</li>< li>&nbsp;&nbsp;?&gt;&nbsp;&nbsp;</li>< /ol>< /div>< /div>< p>例3:<br />& nbsp;& nbsp;输出状态值到浏览器,主要用于访问权限控制</p>< div>< div >< ol>< li>&nbsp;& nbsp;&lt;?php&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header('HTTP/1.1 401 Unauthorized');&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header('status: 401 Unauthorized');&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;?&gt;&nbsp;&nbsp;</li>< /ol>< /div>< /div>< p>例4:<br />& nbsp;& nbsp;要限制一个用户不能访问该页,则可设置状态为404,如下所示,这样浏览器就显示为即该页不存在</p>< div>< div >< ol>< li>&nbsp;& nbsp;&lt;?php&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header('HTTP/1.1&nbsp;& nbsp; 404&nbsp;& nbsp; Not Found');&nbsp;&nbsp;<br />& nbsp;</li>< li>&nbsp;& nbsp;&nbsp;& nbsp; header(&quot;status:&nbsp;& nbsp; 404&nbsp;& nbsp; Not Found&quot;); //这种写法错误<br />& nbsp;</li>< li>&nbsp;& nbsp;?&gt;</li>< /ol>< /div>< /div>< p>例5:<br />& nbsp;& nbsp;隐藏文件的位置<br />& nbsp;& nbsp;html标签& lt;A href='http://hostname/*.mp3'&gt;&lt;/a&gt;就可以实现普通文件下载。如果为了保密文件,就不能把文件链接告诉别人,可以用header函数实现文件下载。</p>< div ><blockquote>&nbsp;&nbsp;header(&quot;Content-type: audio/mpeg&quot;);<br />& nbsp;& nbsp;header(&quot;Content-Disposition: attachment; filename=filenale&quot;);<br />& nbsp;& nbsp;header(&quot;Content-Description: PHP3 Generated Data&quot;);</blockquote></div>< p>例6:<br />& nbsp;& nbsp;header函数前输入内容<br />< br />& nbsp;& nbsp; 一般来说在header函数前不能输出html内容,类似的还有setcookie() 和 session 函数,这些函数需要在输出流中增加消息头部信息。如果在header()执行之前有echo等语句,当后面遇到header()时,就会报出& ldquo;Warning: Cannot modify header information - headers already sent by ....&rdquo;错误。就是说在这些函数的前面不能有任何文字、空行、回车等,而且最好在header()函数后加上exit()函数。例如下面的错误写法,在两个php代码段之间有一个空行:</p>< div>< div >< ol>< li>&lt;?php<br />& nbsp;</li>< li>//some code here<br />& nbsp;</li>< li>?&gt;<br />& nbsp;</li>< li>//这里应该是一个空行<br />& nbsp;</li>< li>&lt;?php<br />& nbsp;</li>< li>&nbsp;& nbsp; header(&quot;http/1.1 403 Forbidden&quot;);<br />& nbsp;</li>< li>&nbsp;& nbsp; exit();<br />& nbsp;</li>< li>?&gt;</li>< /ol>< /div>< /div>< p><strong>原因:</strong><br />& nbsp;& nbsp;PHP脚本开始执行 时,它可以同时发送http消息头部(标题)信息和主体信息. http消息头部(来自 header() 或SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中. 这样就可以允许你修改标题信息,包括缺省的标题(例如Content-Type 标题).但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print()调用),那么PHP就必须先发送完所有的Header,然后终止 HTTPheader.而后继续发送主体数据.从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。<br />< br />< strong>解决办法:</strong><br /> 修改php.ini打开缓存(output_buffering),<font color="#ff0000">将output_buffering=0修改成output_buffering=4096</font><br /> 或者在程序中使用缓存函数ob_start(),ob_end_flush() 等。原理是:output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTPheader。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP4.0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为 header实际上并没有发送。当全部脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。</p>http://www.downcc.com/tech/2253.htmlAsp编程2011/03/10 18:58:18<p>&lt;%<br /> '******************************<br /> '函数:UrlOK(strURL)<br /> '参数:strURL,待验证的网址<br /> '作者:阿里西西<br /> '日期:2007/7/13<br /> '描述:验证输入网址是否有效并可以访问<br /> '示例:&lt;%=UrlOK(&quot;http://www.downcc.com&quot;)%&gt;<br /> '******************************<br /> Function UrlOK(strURL)<br /> On Error Resume Next<br /> If strURL&lt;&gt;&quot;&quot; Then<br /> Set objHTTP = CreateObject(&quot;MSXML2.XMLHTTP&quot;)<br /> objHTTP.Open& quot;GET&quot;, strURL, FALSE<br /> objHTTP.Send<br /> If instr(objHTTP.statusText,&quot;OK&quot;) Then<br /> UrlOK =& quot;有效&quot;<br /> Else<br /> UrlOK =& quot;无效&quot;<br /> End if<br /> Else<br /> UrlOK =& quot;错误:您没有输入网址!&quot;<br /> End If<br /> End Function<br /> %&gt;</p>< p>&lt;%=UrlOK(&quot;http://www.downcc.com&quot;)%&gt;<br /> 测试通过!</p>< p><wbr></wbr></p>< p><br /> 正则验证输入网址是否合法的URL<br />& lt;%<br /> '******************************<br /> '函数:checkexp(patrn,strng)<br /> '参数:patrn 正则表达式;strng 验证字符串<br /> '作者:阿里西西<br /> '日期:2007/7/13<br /> '描述:正则验证输入网址是否合法的URL<br /> '示例:&lt;%=checkexp(patrn,strng)%&gt;<br /> '******************************<br /> function checkexp(patrn,strng)<br /> dim regex,match<br /> set regex = new regexp ' 建立正则表达式。<br /> regex.pattern = patrn ' 设置模式。<br /> regex.ignorecase = true ' 设置是否区分字符大小写。<br /> regex.global = true ' 设置全局可用性。<br /> matches = regex.test(strng)<br /> checkexp = matches<br /> end function</p>< p>%&gt;</p>http://www.downcc.com/tech/2252.htmlAsp编程2011/03/10 18:49:17<p>formatNumber(num,2,-1)<br /> 2;表示两位小数<br /> -1:表示是否显示小数前的数字0</p>< p>请参阅&nbsp;&nbsp;<br /> FormatCurrency&nbsp;&nbsp; 函数&nbsp;&nbsp; |&nbsp;&nbsp; FormatDateTime&nbsp;&nbsp; 函数&nbsp;&nbsp; |&nbsp;&nbsp; FormatPercent&nbsp;&nbsp; 函数&nbsp;&nbsp;<br /> 要求&nbsp;&nbsp;<br /> 版本2&nbsp;&nbsp;<br /> 返回表达式,此表达式已被格式化为数值。&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> FormatNumber(&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expression&nbsp;&nbsp; [,NumDigitsAfterDecimal&nbsp;&nbsp; [,IncludeLeadingDigit&nbsp;&nbsp; [,UseParensForNegativeNumbers&nbsp;&nbsp; [,GroupDigits]]]]&nbsp;&nbsp;<br /> )&nbsp;&nbsp;<br /> Arguments&nbsp;&nbsp;<br /> Expression&nbsp;&nbsp;&nbsp;&nbsp;<br /> 必选项。要被格式化的表达式。&nbsp;&nbsp;&nbsp;&nbsp;<br /> NumDigitsAfterDecimal&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。指示小数点右侧显示位数的数值。默认值为&nbsp;&nbsp; -1,指示使用的是计算机的区域设置。&nbsp;&nbsp;&nbsp;&nbsp;<br /> IncludeLeadingDigit&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。三态常数,指示是否显示小数值小数点前面的零。有关数值,请参阅&ldquo;设置&rdquo;部分。&nbsp;&nbsp;&nbsp;&nbsp;<br /> UseParensForNegativeNumbers&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。三态常数,指示是否将负值置于括号中。有关数值,请参阅&ldquo;设置&rdquo;部分。&nbsp;&nbsp;&nbsp;&nbsp;<br /> GroupDigits&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。三态常数,指示是否使用计算机区域设置中指定的数字分组符号将数字分组。有关数值,请参阅&ldquo;设置&rdquo;部分。&nbsp;&nbsp;&nbsp;&nbsp;<br /> 设置&nbsp;&nbsp;<br /> IncludeLeadingDigit、UseParensForNegativeNumbers&nbsp;&nbsp; 和&nbsp;&nbsp; GroupDigits&nbsp;&nbsp; 参数可以有以下值:&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 常数&nbsp;&nbsp; 值&nbsp;&nbsp; 描述&nbsp;&nbsp;&nbsp;&nbsp;<br /> TristateTrue&nbsp;&nbsp; -1&nbsp;&nbsp; True&nbsp;&nbsp;&nbsp;&nbsp;<br /> TristateFalse&nbsp;&nbsp; 0&nbsp;&nbsp; False&nbsp;&nbsp;&nbsp;&nbsp;<br /> TristateUseDefault&nbsp;&nbsp; -2&nbsp;&nbsp; 使用计算机区域设置中的设置。&nbsp;&nbsp;&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 说明&nbsp;&nbsp;<br /> 当省略一个或多个可选项参数时,由计算机区域设置提供被省略参数的值。&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 注意&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有设置信息均取自区域设置的&ldquo;数字&rdquo;附签。&nbsp;&nbsp;<br /> 下面例子利用&nbsp;&nbsp; FormatNumber&nbsp;&nbsp; 函数把数值格式化为带四位小数点的数:&nbsp;&nbsp;&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> Function&nbsp;&nbsp; FormatNumberDemo&nbsp;&nbsp;&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim&nbsp;&nbsp; MyAngle,&nbsp;&nbsp; MySecant,&nbsp;&nbsp; MyNumber&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyAngle&nbsp;&nbsp; =&nbsp;&nbsp; 1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp; 用弧度定义角。&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MySecant&nbsp;&nbsp; =&nbsp;&nbsp; 1&nbsp;&nbsp; /&nbsp;&nbsp; Cos(MyAngle)&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp; 计算正割值。&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FormatNumberDemo&nbsp;&nbsp; =&nbsp;&nbsp; FormatNumber(MySecant,4)&nbsp;&nbsp; '&nbsp;&nbsp; 把&nbsp;&nbsp; MySecant&nbsp;&nbsp; 格式化为带四位小数点的数。&nbsp;&nbsp;<br /> VBScript有两个用于格式化数字的负数。用函数Formatnumber(),你可以指定小数点后的显示位数,是否显示前导的零,显示负数时是否使用空格,和是否使用分隔符等。下面是一些例子及其返回值:<br />& lt;%=Formatnumber(6665.8999)%&gt;<br /> 6,665.90<br />& lt;%=Formatnumber(&ldquo;6665.8999&rdquo;)%&gt;<br /> 6,665.90<br />& lt;%=Formatnumber(6665.8999,3)%&gt;<br /> 6,665.900<br />& lt;%=Formatnumber(-6665.8999,3,-1,-1,0)%&gt;<br /> (6665.900)<br /> 注意第二个例子用了一个字符串,二不是数字。当一个字符串可以被解释为一个数字时,你可以用该字符串作为函数Formatnumber()的参数。如果该字符串不能被解释为数字,则会返回错误。<br /> 最后一个例子用到了函数Formatnumber()的所有参数:<br /> 第一个参数(-6665.8999)指定了要进行格式化的数字。<br /> 第二个参数(3)指定了小数点后显示的位数。<br /> 第三个参数(-1)指定了是否显示前导的零。<br /> 第四个参数(-1)指定是否对负数使用括号。<br /> 最后一个参数(0)指定是否显示分隔符。<br /> 注意<br /> 许多VBScript函数使用三态常量。函数Formatnumber()的第三,第四,第五个参数可以接受三态常量或它们的值。下面列出了三态常量:<br /> TristateTrue -1 True<br /> TristateFalse 0 False<br /> TristateUseDefault -2 使用区域设置<br /> 你也可以指定这些格式的某个特定属性依赖于Windows控制面板中的区域设置。</p>< p>如果你需要格式化百分数,应使用函数Formatpercent():<br />& lt;%=Formatpercent(12)%&gt;<br /> 1,200.00%<br />& lt;%=Formatpercent(&ldquo;12&rdquo;)%&gt;<br /> 1,200.00%<br /> 这个函数把它的第一个参数乘以100,并在结果后面追加一个百分号。函数Formatpercent()也可以接受许多附加参数,以改变输出格式。<br /> FormatPercent&nbsp;&nbsp; 函数&nbsp;&nbsp;<br /> 请参阅&nbsp;&nbsp;<br /> FormatCurrency&nbsp;&nbsp; 函数&nbsp;&nbsp; |&nbsp;&nbsp; FormatDateTime&nbsp;&nbsp; 函数&nbsp;&nbsp; |&nbsp;&nbsp; FormatNumber&nbsp;&nbsp; 函数&nbsp;&nbsp;<br /> 要求&nbsp;&nbsp;<br /> 版本2&nbsp;&nbsp;<br /> 返回表达式,此表达式已被格式化为尾随有&nbsp;&nbsp; %&nbsp;&nbsp; 符号的百分比(乘以&nbsp;&nbsp; 100&nbsp;&nbsp; )。&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> FormatPercent(expression[,NumDigitsAfterDecimal&nbsp;&nbsp; [,IncludeLeadingDigit&nbsp;&nbsp; [,UseParensForNegativeNumbers&nbsp;&nbsp; [,GroupDigits]]]])&nbsp;&nbsp;<br /> FormatPercent&nbsp;&nbsp; 函数的语法有以下参数:&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 参数&nbsp;&nbsp;<br /> Expression&nbsp;&nbsp;&nbsp;&nbsp;<br /> 必选项。要被格式化的表达式。&nbsp;&nbsp;&nbsp;&nbsp;<br /> NumDigitsAfterDecimal&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。指示小数点右侧显示位数的数值。默认值为&nbsp;&nbsp; -1,指示使用的是计算机的区域设置。&nbsp;&nbsp;&nbsp;&nbsp;<br /> IncludeLeadingDigit&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。三态常数,指示是否显示小数值小数点前面的零。有关数值,请参阅&ldquo;设置&rdquo;部分。&nbsp;&nbsp;&nbsp;&nbsp;<br /> UseParensForNegativeNumbers&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。三态常数,指示是否将负值置于括号中。有关数值,请参阅&ldquo;设置&rdquo;部分。&nbsp;&nbsp;&nbsp;&nbsp;<br /> GroupDigits&nbsp;&nbsp;&nbsp;&nbsp;<br /> 可选项。三态常数,指示是否使用计算机区域设置中指定的数字分组符号将数字分组。有关数值,请参阅&ldquo;设置&rdquo;部分。&nbsp;&nbsp;&nbsp;&nbsp;<br /> 设置&nbsp;&nbsp;<br /> IncludeLeadingDigit、UseParensForNegativeNumbers&nbsp;&nbsp; 和&nbsp;&nbsp; GroupDigits&nbsp;&nbsp; 参数可以有以下值:&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 常数&nbsp;&nbsp; 值&nbsp;&nbsp; 描述&nbsp;&nbsp;&nbsp;&nbsp;<br /> TristateTrue&nbsp;&nbsp; -1&nbsp;&nbsp; True&nbsp;&nbsp;&nbsp;&nbsp;<br /> TristateFalse&nbsp;&nbsp; 0&nbsp;&nbsp; False&nbsp;&nbsp;&nbsp;&nbsp;<br /> TristateUseDefault&nbsp;&nbsp; -2&nbsp;&nbsp; 使用计算机区域设置中的设置。&nbsp;&nbsp;&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 说明&nbsp;&nbsp;<br /> 当省略一个或多个可选项参数时,由计算机区域设置提供被省略参数的值。&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> 注意&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有设置信息均取自区域设置的&ldquo;数字&rdquo;附签。&nbsp;&nbsp;<br /> 下面例子利用&nbsp;&nbsp; FormatPercent&nbsp;&nbsp; 函数把表达式格式化为百分数:&nbsp;&nbsp;&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> Dim&nbsp;&nbsp; MyPercent&nbsp;&nbsp;<br /> MyPercent&nbsp;&nbsp; =&nbsp;&nbsp; FormatPercent(2/32)&nbsp;&nbsp; 'MyPercent&nbsp;&nbsp; 包含&nbsp;&nbsp; 6.25%。&nbsp;&nbsp;<br /> //////////////////////////////////&nbsp;&nbsp;<br /> 函数******************************&nbsp;&nbsp;<br /> FormatDateTime(Date[,&nbsp;&nbsp; NamedFormat])&nbsp;&nbsp;<br />& nbsp;&nbsp;&nbsp;<br /> //////////////////////////////////&nbsp;&nbsp;<br /> NamedFormat的取值:******************************&nbsp;&nbsp;<br /> 常数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsphttp://www.downcc.com/tech/2251.html.Net编程2011/03/10 18:46:29<p>Request.ServerVariables(&quot;Url&quot;)<br /> 返回服务器地址</p>< p>Request.ServerVariables(&quot;Path_Info&quot;)<br /> 客户端提供的路径信息</p>< p>Request.ServerVariables(&quot;Appl_Physical_Path&quot;)<br /> 与应用程序元数据库路径相应的物理路径</p>< p>Request.ServerVariables(&quot;Path_Translated&quot;)<br /> 通过由虚拟至物理的映射后得到的路径<br /> Request.ServerVariables(&quot;Script_Name&quot;)<br /> 执行脚本的名称</p>< p>Request.ServerVariables(&quot;Query_String&quot;)<br /> 查询字符串內容</p>< p>Request.ServerVariables(&quot;Http_Referer&quot;)<br /> 请求的字符串內容</p>< p>Request.ServerVariables(&quot;Server_Port&quot;)<br /> 接受请求的服务器端口号</p>< p>Request.ServerVariables(&quot;Remote_Addr&quot;)<br /> 发出请求的远程主机的IP地址</p>< p>Request.ServerVariables(&quot;Remote_Host&quot;)<br /> 发出请求的远程主机名称</p>< p>Request.ServerVariables(&quot;Local_Addr&quot;)<br /> 返回接受请求的服务器地址</p>< p>Request.ServerVariables(&quot;Http_Host&quot;)<br /> 返回服务器地址</p>< p>Request.ServerVariables(&quot;Server_Name&quot;)<br /> 服务器的主机名、DNS地址或IP地址</p>< p>Request.ServerVariables(&quot;Request_Method&quot;)<br /> 提出请求的方法比如GET、HEAD、POST等等</p>< p>Request.ServerVariables(&quot;Server_Port_Secure&quot;)<br /> 如果接受请求的服务器端口为安全端口时,则为1,否则为0</p>< p>Request.ServerVariables(&quot;Server_Protocol&quot;)<br /> 服务器使用的协议的名称和版本</p>< p>Request.ServerVariables(&quot;Server_Software&quot;)<br /> 应答请求并运行网关的服务器软件的名称和版本</p>< p>Request.ServerVariables(&quot;All_Http&quot;)<br /> 客户端发送的所有HTTP标头,前缀HTTP_</p>< p>Request.ServerVariables(&quot;All_Raw&quot;)<br /> 客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_</p>< p>Request.ServerVariables(&quot;Appl_MD_Path&quot;)<br /> 应用程序的元数据库路径</p>< p>Request.ServerVariables(&quot;Content_Length&quot;)<br /> 客户端发出內容的长度</p>< p>Request.ServerVariables(&quot;Https&quot;)<br /> 如果请求穿过安全通道(SSL),则返回ON如果请求来自非安全通道,则返回OFF</p>< p>Request.ServerVariables(&quot;Instance_ID&quot;)<br /> IIS实例的ID号</p>< p>Request.ServerVariables(&quot;Instance_Meta_Path&quot;)<br /> 响应请求的IIS实例的元数据库路径</p>< p>Request.ServerVariables(&quot;Http_Accept_Encoding&quot;)<br /> 返回內容如:gzip,deflate</p>< p>Request.ServerVariables(&quot;Http_Accept_Language&quot;)<br /> 返回內容如:en-us</p>< p>Request.ServerVariables(&quot;Http_Connection&quot;)<br /> 返回內容:Keep-Alive</p>< p>Request.ServerVariables(&quot;Http_Cookie&quot;)</p>< p>Request.ServerVariables(&quot;Http_User_Agent&quot;)<br /> 返回內容:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)</p>< p>Request.ServerVariables(&quot;Https_Keysize&quot;)<br /> 安全套接字层连接关键字的位数,如128</p>< p>Request.ServerVariables(&quot;Https_Secretkeysize&quot;)<br /> 服务器验证私人关键字的位数如1024</p>< p>Request.ServerVariables(&quot;Https_Server_Issuer&quot;)<br /> 服务器证书的发行者字段</p>< p>Request.ServerVariables(&quot;Https_Server_Subject&quot;)<br /> 服务器证书的主题字段</p>< p>Request.ServerVariables(&quot;Auth_Password&quot;)<br /> 当使用基本验证模式时,客户在密码对话框中输入的密码</p>< p>Request.ServerVariables(&quot;Auth_Type&quot;)<br /> 是用户访问受保护的脚本时,服务器用於检验用户的验证方法</p>< p>Request.ServerVariables(&quot;Auth_User&quot;)<br /> 代证的用户名</p>< p>Request.ServerVariables(&quot;Cert_Cookie&quot;)<br /> 唯一的客户证书ID号</p>< p>Request.ServerVariables(&quot;Cert_Flag&quot;)<br /> 客户证书标誌,如有客户端证书,则bit0为0如果客户端证书验证无效,bit1被设置为1</p>< p>Request.ServerVariables(&quot;Cert_Issuer&quot;)<br /> 用户证书中的发行者字段</p>< p>Request.ServerVariables(&quot;Cert_Keysize&quot;)<br /> 安全套接字层连接关键字的位数,如128</p>< p>Request.ServerVariables(&quot;Cert_Secretkeysize&quot;)<br /> 服务器验证私人关键字的位数如1024</p>< p>Request.ServerVariables(&quot;Cert_Serialnumber&quot;)<br /> 客户证书的序列号字段</p>< p>Request.ServerVariables(&quot;Cert_Server_Issuer&quot;)<br /> 服务器证书的发行者字段</p>< p>Request.ServerVariables(&quot;Cert_Server_Subject&quot;)<br /> 服务器证书的主题字段</p>< p>Request.ServerVariables(&quot;Cert_Subject&quot;)<br /> 客户端证书的主题字段</p>< p>Request.ServerVariables(&quot;Content_Type&quot;)<br /> 客户发送的form內容或HTTPPUT的数据类型</p>http://www.downcc.com/tech/2250.htmlAsp编程2011/03/10 18:41:18<p>1.如何写入cookies?<br /> response.cookies(&quot;字段名&quot;)=变量或字符串,例如:<br /> response.cookies(&quot;name2&quot;)=&quot;dingdang&quot;</p>< p>2.如何设置cookies时间?<br /> response.cookies(&quot;字段名&quot;).expires=时间函数+n,例如:<br /> response.cookies(&quot;name2&quot;).expires=date+1,表示cookies保存1天,再比如:<br /> response.cookies(&quot;name2&quot;).expires=hour+8,表示cookies保存8小时。</p>< p>3.在以往的asp教程中,很少有介绍cookies退出的方法。在&ldquo;退出&rdquo;这个asp页中可以这样写:<br /> response.cookies(&quot;字段名&quot;)=&quot;&quot;<br /> 之后,在客户端的浏览器就清除了cookies,并且cookies文件会消失。注意有多少个字段,就要写多少句来清除。</p>< p>4.如何读取cookies?<br /> 变量名=request.cookies(&quot;字段名&quot;),例如:<br /> name2=request.cookies(&quot;name2&quot;)<br /> 如果网页中写入&lt;%=name2%&gt;这句,则会显示&ldquo;dingdang&rdquo;。<br /> 也可以这样直接读取cookies,&lt;%=request.cookies(&quot;name2&quot;)%&gt;</p>< p>cookies是属于session对象的一种。但有不同,cookies不会占服务器资源;而&ldquo;session&rdquo;则会占用服务器资源。所以,尽量不要使用session,而使用cookies</p>http://www.downcc.com/tech/1118.htmlAsp编程2010/05/11 16:03:04<p>有一个客户要求后台生成大数据量(每次生成几万条)的会员卡号及密码,金额等。生成的会员卡号及密码要印制在卡上对会员发放。生成大量数据在库中,印制卡片的厂家要拿到数据进行印制怎么办呢?</p>< p>于是我想到用代码将access中的数据生成Excel表格导出。打印这样不就可以了吗?在网上查找相关资料可都不尽如我意,就自己动手写了这个程序。现放出来供大家分享!</p>< p>下面为代码:</p>< p>< table cellspacing="0" cellpadding="6" border="0">< tbody>< tr>< td bgcolor="#ddedfb">以下为引用的内容:<br />< p>&lt;!--#include file=&quot;../conn.asp&quot;--&gt;<br />& lt;%<br /> if session(&quot;china_admin&quot;)=&quot;&quot; then response.redirect& quot;login.asp&quot;<br /> dbpath=&quot;../&quot;<br /> dblink<br /> dim filename,fs,myfile,x,m,n,o,link<br /> Set fs = server.CreateObject(&quot;scripting.filesystemobject&quot;)</p>< p>Set rs = Server.CreateObject(&quot;ADODB.Recordset&quot;)<br /> session(&quot;sql&quot;) =& quot;select * from china_car&quot;<br /> rs.Open session(&quot;sql&quot;),conn,1,1<br /> n=1</p>< p>'==================================================================<br /> '==============================================================建立excel文件系统<br /> filename = Server.MapPath(&quot;car/CarTable&quot;&amp;n&amp;&quot;.xls&quot;) '这个是为了方便,新建一个CAR的文件夹,这个可以自己设啦<br /> if fs.FileExists(filename) then'如果文件存在,覆盖它。<br /> fs.DeleteFile(filename)<br /> end if<br /> set myfile = fs.CreateTextFile(filename,true)</p>< p>'========================================================================</p>< p>dim strLine,responsestr<br /> strLine=&quot;&quot;</p>< p>dim work,j,i<br /> str=&quot;序号|卡号|密码|积分数|金额&quot;  '这个根据你的access数据表字段设置。<br /> work=split(str,&quot;|&quot;)<br /> j=ubound(work)<br /> i=0<br /> o=0<br /> do while not i&gt;j<br /> strLine= strLine& amp; work(i)& amp; chr(9)< br /> i=i+1<br /> loop</p>< p>myfile.writeline strLine<br /> Do while Not rs.EOF<br /> o=o+1<br /> m=20000</p>< p><br /> strLine=&quot;&quot;</p>< p>for each x in rs.Fields<br /> strLine= strLine& amp; x.value& amp; chr(9)<br /> if o&gt;=m*n then<br /> n=n+1<br /> filename = Server.MapPath(&quot;car/CarTable&quot;&amp;n&amp;&quot;.xls&quot;) '这个可以自己设啦<br /> if fs.FileExists(filename) then'如果文件存在,覆盖它。<br /> fs.DeleteFile(filename)<br /> end if<br /> set myfile = fs.CreateTextFile(filename,true)<br /> end if<br /> next</p>< p>myfile.writeline strLine</p>< p>rs.MoveNext<br /> loop</p>< p>rs.Close<br /> set rs = nothing<br /> conn.close<br /> set conn = nothing<br /> set myfile = nothing<br /> Set fs=Nothing<br /> ExcelPath=&quot;car/CarTable&quot;&amp;n&amp;&quot;.xls&quot;<br /> response.Write& quot;导出成功  &quot;<br /> response.write(&quot;&lt;a href='&quot;& amp; server.URLEncode(ExcelPath)& amp;& quot;'&gt;&lt;font=red&gt;下载&lt;/font&gt;&lt;/a&gt;&quot;)</p>< p>%&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>http://www.downcc.com/tech/872.htmlXml编程2010/02/16 19:13:02<p>把下面代码保存为Asp_XML.asp运行即可:&nbsp;&nbsp;&nbsp;< br />& lt;%&nbsp;&nbsp;&nbsp;&nbsp;< br /> Const&nbsp;IsSql&nbsp;=&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&rsquo;定义数据库类型为SQL&nbsp;Server&nbsp;&nbsp;&nbsp;< br /> Call&nbsp;OpenConn(Conn)&nbsp;&rsquo;打开数据库连接&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;< br /> Dim&nbsp;Rs,Sql&nbsp;&nbsp;&nbsp;< br /> Set&nbsp;Rs&nbsp;=&nbsp;Server.CreateObject(&quot;ADODB.RecordSet&quot;)&nbsp;&nbsp;&nbsp;< br /> Sql&nbsp;=&nbsp;&quot;SELECT&nbsp;*&nbsp;FROM&nbsp;Products&nbsp;ORDER&nbsp;BY&nbsp;ProductName&quot;&nbsp;&nbsp;&nbsp;< br /> Rs.Open&nbsp;Sql,Conn,1,1&nbsp;&rsquo;以只读方式查询数据记录&nbsp;&nbsp;&nbsp;< br /> If&nbsp;Rs.Eof&nbsp;Then&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Response.Write&nbsp;&quot;Sorry,no&nbsp;record!&quot;&nbsp;&rsquo;如果没有记录&nbsp;&nbsp;&nbsp;< br /> Else&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;objXMLDOM,&nbsp;objRootNode,&nbsp;objNode&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objXMLDOM&nbsp;=&nbsp;Server.CreateObject(&quot;MSXML2.DOMDocument&quot;)&nbsp;&rsquo;创建XML文档对象&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objRootNode&nbsp;=&nbsp;objXMLDOM.createElement(&quot;xml&quot;)&nbsp;&rsquo;创建根节点&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;objXMLDOM.documentElement&nbsp;=&nbsp;objRootNode&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;While&nbsp;Not&nbsp;Rs.Eof&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&rsquo;循环出所有记录&nbsp;&nbsp;&nbsp;< br />& rsquo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write&nbsp;Rs(&quot;ProductName&quot;)&nbsp;&amp;&quot;&lt;br&gt;&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objRowNode&nbsp;=&nbsp;objXMLDOM.createElement(&quot;row&quot;)&nbsp;&rsquo;创建父节点&nbsp;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objNode&nbsp;=&nbsp;objXMLDOM.createElement(&quot;ProductName&quot;)&nbsp;&rsquo;创建子节点&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objNode.text&nbsp;=&nbsp;Rs(&quot;ProductName&quot;)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objRowNode.appendChild(objNode)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objNode&nbsp;=&nbsp;objXMLDOM.createElement(&quot;UnitPrice&quot;)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objNode.text&nbsp;=&nbsp;Rs(&quot;UnitPrice&quot;)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objRowNode.appendChild(objNode)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objNode&nbsp;=&nbsp;objXMLDOM.createElement(&quot;UnitsInStock&quot;)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objNode.text&nbsp;=&nbsp;Rs(&quot;UnitsInStock&quot;)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objRowNode.appendChild(objNode)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objRootNode.appendChild(objRowNode)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Rs.MoveNext:Loop&nbsp;&rsquo;循环结束&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;objXMLDOM.Save&nbsp;&quot;D:\MyXMLDoc.xml&quot;&nbsp;&rsquo;写入XML文件&nbsp;可以用变量让用户在页面上自定义文件名&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Response.Write&nbsp;&quot;&lt;script&gt;alert(&rsquo;恭喜,写入XML文件成功!&rsquo;);&lt;/script&gt;&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objNode&nbsp;=&nbsp;Nothing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&rsquo;销毁对象&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objRowNode&nbsp;=&nbsp;Nothing&nbsp;&nbsp;&rsquo;销毁对象&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;objRootNode&nbsp;=&nbsp;Nothing&nbsp;&rsquo;销毁对象&nbsp;&nbsp;&nbsp;< br /> End&nbsp;If&nbsp;&nbsp;&nbsp;< br /> Rs.Close&nbsp;&nbsp;&nbsp;< br /> Set&nbsp;Rs&nbsp;=&nbsp;Nothing&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;< br /> Call&nbsp;CloseConn()&nbsp;&rsquo;关闭数据库连接&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;< br /> Function&nbsp;OpenConn(Conn)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&rsquo;打开数据库连接&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;ConnStr&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;IsSql&nbsp;=&nbsp;1&nbsp;Then&nbsp;&rsquo;如果是SQL&nbsp;Server数据库&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&rsquo;SQL&nbsp;Server数据库连接参数:用户名、用户密码、数据库名、连接名(本地用local,外地用IP)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;SqlUsername,SqlPassword,SqlDatabaseName,SqlLocalName&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlUsername&nbsp;=&nbsp;&quot;sa&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlPassword&nbsp;=&nbsp;&quot;&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDatabaseName&nbsp;=&nbsp;&quot;Northwind&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlLocalName&nbsp;=&nbsp;&quot;(local)&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnStr&nbsp;=&nbsp;&quot;Provider&nbsp;=&nbsp;Sqloledb;&nbsp;User&nbsp;ID&nbsp;=&nbsp;&quot;&nbsp;&amp;&nbsp;SqlUsername&nbsp;&amp;&nbsp;&quot;;&nbsp;Password&nbsp;=&nbsp;&quot;&nbsp;&amp;&nbsp;SqlPassword&nbsp;&amp;&nbsp;&quot;;&nbsp;<br /> Initial&nbsp;Catalog&nbsp;=&nbsp;&quot;&nbsp;&amp;&nbsp;SqlDatabaseName&nbsp;&amp;&nbsp;&quot;;&nbsp;Data&nbsp;Source&nbsp;=&nbsp;&quot;&nbsp;&amp;&nbsp;SqlLocalName&nbsp;&amp;&nbsp;&quot;;&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Else&nbsp;&nbsp;&rsquo;如果是Access数据库&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;Db&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&rsquo;第一次使用请修改本处数据库地址并相应修改数据库名称,如将Dicky.mdb修改为Dicky.asp(防止恶意下载Access数据库)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Db&nbsp;=&nbsp;&quot;Dicky.mdb&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnStr&nbsp;=&nbsp;&quot;Provider&nbsp;=&nbsp;Microsoft.Jet.OLEDB.4.0;Data&nbsp;Source&nbsp;=&nbsp;&quot;&nbsp;&amp;&nbsp;Server.MapPath(Db)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;Error&nbsp;Resume&nbsp;Next&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;Conn&nbsp;=&nbsp;Server.CreateObject(&quot;ADODB.Connection&quot;)&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Conn.Open&nbsp;ConnStr&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Err&nbsp;Then&nbsp;&nbsp;&nbsp;< br />& rsquo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Err.Clear&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;Conn&nbsp;=&nbsp;Nothing&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write&nbsp;&quot;数据库连接出错,请检查连接字串。&quot;&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.End&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;Rs&nbsp;=&nbsp;Server.CreateObject(&quot;Adodb.RecordSet&quot;)&nbsp;&nbsp;&nbsp;< br /> End&nbsp;Function&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;< br /> Function&nbsp;CloseConn()&nbsp;&nbsp;&rsquo;关闭数据库连接&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Conn.Close&nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;Conn&nbsp;=&nbsp;Nothing&nbsp;&http://www.downcc.com/tech/871.htmlXml编程2010/02/16 19:11:44<p>getfile.asp<br />& lt;%<br /> ''利用xmlhttp组件获取远程文件保存到当前空间<br /> ''此是网站建设中的一个实例,远程获取一个网页内容并筛选出相关的天气数据,当然可以跳过文件本地存储再获取数据<br /> ''参考了xoyu的函数,在此感谢<br /> fileurl=&quot;http://www.hbqx.gov.cn/other/tqyb/inc_city_hb.asp&quot;<br /> dotloc=InStrRev(fileurl,&quot;.&quot;)<br /> filepath=&quot;thistest&quot;&amp;mid(fileurl,dotloc) ''建立同类型文件名<br /> ''filepath=&quot;thistest.htm&quot;<br />< br /> call saveRemoteFile(filepath,fileurl)<br />< br /> sub SaveRemoteFile(LocalFileName,RemoteFileUrl)<br /> dim Ads,Retrieval,GetRemoteData<br /> Set Retrieval = Server.CreateObject(&quot;Microsoft.XMLHTTP&quot;)<br /> With Retrieval<br /> .Open& quot;Get&quot;, RemoteFileUrl, False,& quot;&quot;,& quot;&quot;<br /> .Send<br /> GetRemoteData = .ResponseBody<br /> '' GetDetail = .ResponseText ''对文本型文件可直接获取内容,但不能支持中文,不知道如何解决<br /> End With<br />< br /> Set Retrieval = Nothing<br /> ''RESPONSE.WRITE GetDetail<br />< br /> Set Ads = Server.CreateObject(&quot;Adodb.Stream&quot;) ''生成对应文件<br /> With Ads<br /> .Type = 1<br /> .Open<br /> .Write GetRemoteData<br /> .SaveToFile server.MapPath(LocalFileName),2<br /> .Cancel()<br /> .Close()<br /> End With<br /> Set Ads=nothing<br /> end sub<br />< br /> ''以上完成远程存储文件,以下只适用于对文本型文件的操作<br /> set fso=server.createobject(&quot;scripting.filesystemobject&quot;) ''读取文件内容<br /> set fileout=fso.opentextfile(server.mappath(filepath),1)<br /> content=fileout.readall<br /> set fileout=nothing<br /> set fso=nothing<br /> ''response.write content<br />< br /> contentarr=split(content,&quot;&lt;td&quot;) ''根据内容进行筛选<br /> for i=1 to ubound(contentarr)<br /> if instr(contentarr(i),&quot;恩施&quot;) then thisloc=i<br /> next<br /> dim xu(5)<br /> for j=0 to 4<br /> con1=contentarr(thisloc+j)<br /> start1=instr(con1,&quot;&gt;&quot;)<br /> con1=right(con1,len(con1)-start1)<br /> stop1=instr(con1,&quot;&lt;&quot;)<br /> con1=left(con1,stop1-1)<br /> str=str&amp;contentarr(thisloc+j)<br /> xu(j)=trim(con1)<br /> next<br /> if xu(1)&lt;&gt;&quot;&quot; then<br /> response.write& quot;document.write('恩施州未来24小时天气预报:&quot;&amp;xu(1)&amp;&quot;,最低温度&quot;&amp;xu(2)&amp;&quot;摄氏度,最高温度&quot;&amp;xu(3)&amp;&quot;摄氏度,风向:&quot;&amp;xu(4)&amp;&quot;.--武汉中心气象台发布');&quot;<br /> else<br /> response.write& quot;document.write('暂未发布');&quot;<br /> end if<br /> ''response.write server.htmlencode(str)<br /> %&gt;<br />< br /> 在另一个htm页中引用显示获取内容<br />& lt;script src=&quot;getfile.asp&quot;&gt;&lt;/script&gt;</p>http://www.downcc.com/tech/870.htmlXml编程2010/02/16 19:08:35<p>我们在编写ASP代码的时候,大家都知道可以通过post或者get获得form表单的数据,那么我们如何直接获得其他页面上的数据呢?这就要借助xmlhttp协议了。xmlhttp是xmldom技术的一部分。<br />< br /> 下面的代码就是一个很简单的例子,我们利用xmlhttp技术,把http://www.codetoad.com/站点首页的代码以xml的形式完全获取,并且在页面中输出。<br />< br />& lt;%<br /> Dim objXMLHTTP, xml<br /> Set xml = Server.CreateObject(&quot;Microsoft.XMLHTTP&quot;)<br />< br /> xml.Open& quot;GET&quot;,& quot;http://www.codetoad.com/&quot;, False<br /> ' Pull the data from the web page<br /> xml.Send<br />< br /> Response.write& quot;Here's the html we now have in our xml object&quot;<br /> Response.write& quot;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&quot;<br /> Response.Write& quot;&lt;xmp&gt;&quot;<br /> Response.Write xml.responseText<br /> Response.Write& quot;&lt;/xmp&gt;&quot;<br /> Response.write& quot;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&quot;<br /> Response.write& quot; Now here's how the page looks:&lt;BR&gt;&lt;BR&gt;&quot;<br /> Response.Write xml.responseText<br />< br /> Set xml = Nothing<br /> %&gt;<br />< br />< br /> 下面是另一个实例<br />< br />& lt;%<br /> dim objHTTP , objXML , objXSL<br /> set objHTTP = Server.CreateObject(&quot;Microsoft.XMLHTTP&quot;)<br /> objHTTP.open& quot;GET&quot;,& quot;http://p.moreover.com/cgi-local/page?c=Pop%20music%20reviews&amp;o=xml&quot;, false<br /> objHTTP.send<br /> set objXML = objHTTP.responseXML<br /> set objXSL=Server.CreateObject(&quot;microsoft.xmldom&quot;)<br /> objXSL.async=false<br />< br /> objXSL.load(Server.MapPath(&quot;style.xsl&quot;))<br />< br /> if (objXSL.parseError.errorCode = 0) then<br /> Response.Write(objXML.transformnode(objXSL))<br /> else<br /> Response.Write& quot;Error:& quot;& amp; objXSL.parseError.reason& amp;& quot; URL:&quot;& amp; objXSL.url<br /> end if<br />< br /> Set objHTTP = Nothing<br /> Set objXML = Nothing<br /> Set objXSL = Nothing<br /> %&gt;<br />< br /> style.xsl:<br />& lt;xsl:stylesheet xmlns:xsl=&quot;http://www.w3.org/TR/WD-xsl&quot;&gt;<br />& lt;xsl:template match=&quot;/&quot;&gt;<br />< br />& lt;html&gt;<br />& lt;head&gt;<br />& lt;TITLE&gt;moreover...&lt;/TITLE&gt;<br />& lt;/head&gt;<br />& lt;body BGCOLOR=&quot;ffffff&quot;&gt;<br />< br />< br />& lt;DIV ALIGN=&quot;center&quot;&gt;<br />& lt;TABLE BGCOLOR=&quot;ffffff&quot; BORDER=&quot;0&quot; CELLPADDING=&quot;4&quot; CELLSPACING=&quot;0&quot; WIDTH=&quot;100%&quot;&gt;<br />< br />& lt;xsl:for-each select=&quot;moreovernews/article&quot;&gt;<br />< br />& lt;TR VALIGN=&quot;middle&quot;&gt;<br />& lt;TD ALIGN=&quot;left&quot; BGCOLOR=&quot;ffffff&quot;&gt;<br />< br />< br />& lt;xsl:attribute name=&quot;HREF&quot;&gt;<br />& lt;xsl:value-of select=&quot;url&quot;/&gt;<br />& lt;/xsl:attribute&gt;<br />& lt;xsl:attribute name=&quot;TARGET&quot;&gt;<br /> _blank<br />& lt;/xsl:attribute&gt;<br />< br />& lt;xsl:value-of select=&quot;headline_text&quot;/&gt;<br />< br />< br />& lt;xsl:attribute name=&quot;HREF&quot;&gt;<br />& lt;xsl:value-of select=&quot;document_url&quot;/&gt;<br />& lt;/xsl:attribute&gt;<br />& lt;xsl:attribute name=&quot;TARGET&quot;&gt;<br /> _blank<br />& lt;/xsl:attribute&gt;<br />< br />& lt;xsl:value-of select=&quot;source&quot;/&gt;<br />< br />< br />< br />& lt;xsl:attribute name=&quot;HREF&quot;&gt;<br />& lt;xsl:value-of select=&quot;access_registration&quot;/&gt;<br />& lt;/xsl:attribute&gt;<br />& lt;xsl:attribute name=&quot;TARGET&quot;&gt;<br /> _blank<br />& lt;/xsl:attribute&gt;<br />< br />& lt;xsl:value-of select=&quot;access_status&quot;/&gt;<br />< br />< br />< br />& lt;xsl:value-of select=&quot;harvest_time&quot;/&gt; GMT<br />< br />& lt;/TD&gt;<br />& lt;/TR&gt;<br />< br />& lt;/xsl:for-each&gt;<br />< br />< br />& lt;/TABLE&gt;<br />& lt;/DIV&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;<br />& lt;/xsl:template&gt;<br />& lt;/xsl:stylesheet&gt;</p>http://www.downcc.com/tech/869.htmlXml编程2010/02/16 19:05:37<p>吸取HTML松散格式带来的经验教训,XML一开始就坚持实行&quot;良好的格式&quot;。< br /> 我们先看HTML的一些语句,这些语句在HTML中随处可见:< br /> 1.&lt;p&gt;sample< br /> 2.&lt;b&gt;&lt;i&gt;sample&lt;/b&gt;&lt;/i&gt;< br /> 3.&lt;td&gt;sample&lt;/TD&gt;< br /> 4.&lt;font&nbsp;color=red&gt;samplar&lt;/font&gt;< br /> 在XML文档中,上述几种语句的语法都是错误的。因为:< br /> 1.所有的标记都必须要有一个相应的结束标记;< br /> 2.所有的XML标记都必须合理嵌套;< br /> 3.所有XML标记都区分大小写;< br /> 4.所有标记的属性必须用&quot;&quot;括起来;< br /> 所以上列语句在XML中正确的写法是< br /> 1.&lt;p&gt;sample&lt;/p&gt;< br /> 2.&lt;b&gt;&lt;i&gt;sample&lt;/i&gt;&lt;/b&gt;< br /> 3.&lt;td&gt;sample&lt;/td&gt;< br /> 4.&lt;font&nbsp;color=&quot;red&quot;&gt;samplar&lt;/font&gt;< br />   另外,XML标记必须遵循下面的命名规则:< br /> 1.名字中可以包含字母、数字以及其它字母;< br /> 2.名字不能以数字或&quot;_&quot;&nbsp;(下划线)&nbsp;开头;< br /> 3.名字不能以字母&nbsp;xml&nbsp;(或&nbsp;XML&nbsp;或&nbsp;Xml&nbsp;..)&nbsp;开头;< br /> 4.名字中不能包含空格。< br />< br /> 在XML文档中任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将&lt;email&gt;改为&lt;Email&gt;,然后用IE5直接打开myfile.xml,会得到一个出错信息页面:< br />< br />& lt;?xml&nbsp;version=&quot;1.0&quot;&nbsp;encoding=&quot;GB2312&quot;?&gt;< br />& lt;myfile&gt;< br />& lt;title&gt;XML轻松学习手册&lt;/title&gt;< br />& lt;author&gt;ajie&lt;/author&gt;< br />& lt;Email&gt;ajie@aolhoo.com&lt;/email&gt;< br />& lt;date&gt;20010115&lt;/date&gt;< br />& lt;/myfile&gt;&nbsp;</p>http://www.downcc.com/tech/868.htmlXml编程2010/02/16 18:59:35<p>  我们暂且使用&ldquo;记事本&rdquo;来创建我们的XML文件吧。先看一个XML文件:</p>< p>  例1</p>< p>  〈?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot; ?〉< br />   〈参考资料〉< br />    〈书籍〉< br />    〈名称〉XML入门精解〈/名称〉< br />    〈作者〉张三〈/作者〉< br />    〈价格 货币单位=&quot;人民币&quot;〉20.00〈/价格〉< br />    〈/书籍〉< br />    〈书籍〉< br />    〈名称〉XML语法〈/名称〉< br />    〈!--此书即将出版--〉< br />    〈作者〉李四〈/作者〉< br />    〈价格 货币单位=&quot;人民币&quot;〉18.00〈/价格〉< br />    〈/书籍〉< br />   〈/参考资料〉</p>< p>  这是一个典型的XML文件,编辑好后保存为一个以.xml为后缀的文件。我们可以将此文件分为文件序言(Prolog)和文件主体两个大的部分。在此文件中的第一行即是文件序言。该行是一个XML文件必须要声明的东西,而且也必须位于XML文件的第一行,它主要是告诉XML解析器如何工作。其中,version是标明此XML文件所用的标准的版本号,必须要有;encoding指明了此XML文件中所使用的字符类型,可以省略,在你省略此声明的时候,后面的字符码必须是Unicode字符码(建议不要省略)。因为我们在这个例子中使用的是GB2312字符码,所以encoding这个声明也不能省略。在文件序言部分还有一些声明语句,我们在后面给予介绍。</p>< p>  文件的其余部分都是属于文件主体,XML文件的内容信息存放在此。我们可以看到,文件主体是由开始的〈参考资料〉和结束的〈/参考资料〉控制标记组成,这个称为XML文件的&ldquo;根元素&rdquo;;〈书籍〉是作为直属于根元素下的&ldquo;子元素&rdquo;;在〈书籍〉下又有〈名称〉、〈作者〉、〈价格〉这些子元素。货币单位是〈价格〉元素中的一个&ldquo;属性&rdquo;,&ldquo;人民币&rdquo;则是&ldquo;属性值&rdquo;。</p>< p>  〈!--此书即将出版--〉这一句同HTML一样,是注释,在XML文件里,注释部分是放在&ldquo;〈!--&rdquo;与&ldquo;--〉&rdquo;标记之间的部分。</p>< p>  大家可以看到,XML文件是相当简单的。同HTML一样,XML文件也是由一系列的标记组成,不过,XML文件中的标记是我们自定义的标记,具有明确的含义,我们可以对标记中的内容的含义作出说明。对XML文件有了初步的印象之后,我们就来详细地谈一谈XML文件的语法。在讲语法之前,我们必须要了解一个重要的概念,就是XML解析器(XML Parse)。</p>< p>  1.XML解析器</p>< p>  解析器的主要功能就是检查XML文件是否有结构上的错误,剥离XML文件中的标记,读出正确的内容,以交给下一步的应用程序处理。XML是一种用来结构化文件信息的标记语言,XML规范中对于如何标记文件的结构性有一个详细的法则,解析器就是根据这些法则写出来的软件(多用Java写成)。同HTML一样,在浏览器中,必须有HTML的解析器,这样浏览器才能够&ldquo;读懂&rdquo;各种用HTML标记所组成的网页,将它们显示在我们面前。如果有浏览器的HTML解析器读不懂的标记,将会返回给我们错误信息。</p>< p>  由于现在的HTML标记实际上相当混乱,存在大量不规范的标记(有的网页用IE能正常显示,而用Netscape Navigator则不行),所以从一开始,XML的设计者就严格规定了XML的语法和结构,我们编写的XML文件必须遵循这些规定,否则XML解析器将毫不留情地给你显示错误信息。</p>< p>  有两种XML文件,一种是Well-Formed XML文件,一种是Validating XML文件。</p>< p>  如果一个XML文件满足XML规范中的某些相关法则,且没有使用DTD(文件格式定义&mdash;&mdash;后详述)时,可称这份文件是Well-Formed。而如果一个XML文件是Well-Formed,且正确地使用了DTD,DTD中的语法又是正确的,那么这个文件就是Validating。对应两种XML文件,有两种XML解析器,一种是Well-Formed 解析器,一种是Validating解析器。IE 5中就内含Validating解析器,Validating解析器也可用来解析Well-Formed XML文件。</p>< p>  检查它是否满足了Well-Formed的条件。我们可以将刚才编辑的第一个XML 文件用IE 5以上版本的浏览器打开。</p>< p>  大家可能要问为什么在浏览器中的显示和我的源文件一样?没错,因为对于XML文件,我们鼋龉匦乃 的内容,而它的显示形式是交给CSS或XSL来完成的。这里,我们并没有给这个XML文件定义它的CSS或XSL文件,所以它按照原来的形式来显示。实际上,对于电子数据交换,仅仅需要一个XML文件即可,如果要将它以某种形式显示出来,我们就必须编辑CSS或XSL文件(这个问题会在以后讨论)。</p>< p>  2.Well-Formed的XML文件</p>< p> 我们知道,XML必须是Well-Formed的,才能够被解析器正确地解析出来,显示在浏览器中。那么什么是Well-Formed的XML文件呢?主要有下面几个准则,我们在创建XML文件的时候,必须满足它们。</p>< p> 首先,XML文件的第一行必须是声明该文件是XML文件以及它所使用的XML规范版本。在文件的前面不能够有其它元素或者注释。</p>< p> 第二,在XML文件中有且只能够有一个根元素。我们的第一个例子中,〈参考资料〉... 〈/参考资料〉就是此XML文件的根元素。</p>< p> 第三,在XML文件中的标记必须正确地关闭,也就是说,在XML文件中,控制标记必 须有与之对应的结束标记。如:〈名称〉标记必须有对应的〈/名称〉结束标记,不像HTML,某些标记的结束标记可有可无。如果在XML文件中遇到自成一个单元的标记,就是类似于HTML 中的〈img src=.....〉的这些没有结束标记的时候,XML把它称为&ldquo;空元素&rdquo;,必须用这样的写法:〈空元素名/〉,如果元素中含有属性时写法则为:〈空元素名 属性名=&ldquo;属性值&rdquo;/〉。</p>< p> 第四,标记之间不得交叉。在以前的HTML文件中,可以这样写:</p>< p> 〈B〉〈H〉XXXXXXX〈/B〉〈/H〉,〈B〉和〈H〉</p>< p>  标记之间有相互重叠的区域,而在XML中,是严格禁止这样标记交错的写法,标记必须以规则性的次序来出现。</p>< p>  第五,属性值必须要用&ldquo;& rdquo;号括起来。如第一个例子中的&ldquo;1.0&rdquo;、&ldquo;gb2312&rdquo;、&ldquo;人民币&rdquo;。都是用&ldquo;& rdquo;号括起来了的,不能漏掉。</p>< p>  第六,控制标记、指令和属性名称等英文要区分大小写。与HTML不同的是,在HTML中, 类似〈B〉和〈b〉的标记含义是一样的,而在XML中,类似〈name〉、〈NAME〉或〈Name〉这样的标记是不同的。</p>< p>  第七,我们知道,在HTML文件中,如果我们要浏览器原封不动地将我们所输入的东西显示出来,可以将这些东西放到〈pre〉〈/pre〉或者〈xmp〉〈/xmp〉标记中间。这对于我们创建HTML教学的网页是必不可少的,因为网页中要显示HTML的源代码。而在XML中,要实现这样的功能,就必须使用CDATA标记。在CDATA标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记。CDATA区域是由:&ldquo;〈![CDATA[&rdquo;为开始标记,以&ldquo;&gt;〉&rdquo;为结束标记。例如:例2中的源码,除了&ldquo;〈![CDATA[&rdquo;和&ldquo;&gt;〉&rdquo;符号,其余的内容解析器将原封不动地交给下游的应用程序,即使CDATA区域中的开始和结尾的空白以及换行字符等,都同样会被转交(注意CDATA是大写的字符)。</p>< p>  例2</p>< p>  〈![CDATA[飞翔的xml〉〉〉〉〉,:-)< br />   oooo〈〈〈〈〈〈〈< br />   &gt;〉</p>< p>  第八,XML处理空白字符和HTML不一样。HTML标准规定,不管有多少个空白,都当作一个空白来处理;而在XML中规定,所有标记以外的空白,解析器都要忠实地交给下游的应用程序处理。这样,我们有时必须摒弃编写HTML文件时的缩排习惯,因为缩排的空格,解析器也要处理。如:</p>< p>   〈作者〉张三〈/作者〉< br />   和< br />    〈作者〉< br />    张三< br />    〈/作者〉</p>< p>  上述内容对于解析器来说是不同的(后者在〈作者〉〈/作者〉标记之内除了张三这个字符以外,还包括两个换行记号以及&ldquo;张三&rdquo;前的文字缩排符号)。所以解析器在去掉标记后将信息传给应用程序将有不同的处理结果。</p>< p>  如果我们想明确地告诉XML程序,标记中的空白有明确的含义,不要随便去掉(如在一些诗中,空格有它具体的意义),则可在标记中加入一个XML内置的属性&mdash;&mdash;xml:space 。如(注意属性名称和值的大小写):   </p>< p>  〈诗歌 xml:space=&quot;preserver&quot;〉< br />    祖国啊! 祖国!< br />    我的祖国!< br />    〈/诗歌〉</p>< p> 另外,在XML文件中,如果要用到表1的特殊字符,必须用相应符号代替。</p>< p> 表1</p>< p>  特殊字符 替代符号< br />   &amp;&amp;& amp;< br />   &lt;& amp;it;< br />   &gt;& gt;< br />   &quot;& quot;< br />   '& amp;apos;</p>< p>  在此做个小结:符合上述规定的XML文件就是Well-Formed的XML文件。这是编写XML文件的最基本要求。可以看到XML文件的语法规定比HTML要严格多了。由于有这样的严格规定,软件工程师编写XML的解析器就容易多了,不像编写HTML语言的解析器,必须费尽心思去适应不同的网页写法,提高自己浏览器的适应能力。实际上,这对于我们初学者来说,也是一件好事。该怎样就怎样,不必像原来那样去疑惑各种HTML的写法。</p>< p>  我们看到,在XML文件中,用的大多都是自定义的标记。但是大家考虑一下,如果两个同行业的公司A和B要用XML文件相互交换数据,A公司用〈价格〉标记来表示他们产品的价格信息,而B公司可能用〈售价〉来表示价格信息。如果一个XML应用程序来读取他们各自的XML文件中的信息时,如果它只知道〈价格〉标记里表示的是价格信息,那么Bhttp://www.downcc.com/tech/867.htmlXml编程2010/02/16 18:57:00<p>xml(可扩展标记语言)看起来可能像某种w3c标准&mdash;&mdash;现在没有什么实际影响,即使以后能派上用场,也是很久以后的事。但实际上,它现在已经得到了应用。所以,不要等到xml已被加进了你最喜爱的html编辑器中才开始使用它。它现在就可以解决各种内部问题和b2b系统问题。</p>< p>在sparks.com,我们使用xml来标准化从java对象到html数据显示等不同系统之间的数据表示。</p>< p>特别需要指出的是,我们发现,只要以非常基本的xml结构来实现标准化,就可以更容易地共享和操作数据。在这一过程中,我们发现了使用xml的很多有效方法。下面详细介绍我们现在的应用情况。</p>< p>标准化<br /> 在使用xml之前,建立与你要使用的信息不同的xml数据格式。</p>< p>生成动态xml<br /> 从数据库中生成html并不新鲜,但生成xml却很新鲜。这里我们介绍具体的生成步骤。</p>< p>用xsl作为模板语言<br /> xsl(可扩展样式表语言)是定义xml数据显示格式的好方法,如果写成几个静态模板会更有效。</p>< p>生成html<br /> xml加上xsl就等于html。这听起来似乎不对,但用户所见的我们的html页面其实就是xml和xsl共同产生的效果。</p>< p><br /> 一、标准化</p>< p>xml的能力来自于它的灵活性。但不幸的是,它有时太灵活了,以至于你会面对一个空白的页面,发愁该怎么解决问题。</p>< p>在任何xml的项目中,第一步工作都是创建标准的数据格式。为此你要作出以下决定:</p>< p>&bull; 要涉及哪些数据<br />& bull; 是否要使用dtd(文件类型定义)<br />& bull; 是否要使用dom(文档对象模型)或sax(xml的简化api)解析</p>< p>确定数据:<br /> 因为没有标准的xml格式,开发者可以自由地开发自己的格式。然而,如果你的格式只能被一个应用程序识别,那么你只能运行这个程序来使用该格式。如果还有其他程序也能读懂你的xml格式,那显然会更有帮助。如果某个xml格式被修改,则使用它的系统可能也需要被修改,所以你应该建立尽可能完整的格式。因为大多数系统忽略它们无法识别的标签,所以改变一个xml格式的最安全的方法是添加标签,而不是修改标签。</p>< p>单击此处查看xml数据格式实例</p>< p>在sparks.com,我们查看了不同的产品展示需要的所有产品数据。尽管并不是所有的页面都使用全部数据,但我们还是由此开发出适用于所有数据的非常完整的xml数据格式。例如,我们的产品明细信息页面显示的数据要比产品浏览页面多。然而,我们在这两种情况下仍然使用相同的数据格式,因为每个页面的xsl模板都只使用它所需要的字段。</p>< p>是否使用dtd<br /> 在sparks.com,我们使用组织良好的xml,而不使用仅仅是正确的xml,因为前者不需要dtd。dtd在用户点击和看到页面之间加入了一个处理层。我们发现这一层需要太多的处理。当然,在以xml格式与其他公司通信时,使用dtd还是很不错的。因为dtd能在发送和接受时能保证数据结构正确。</p>< p>选择解析引擎<br /> 现在,可以使用的解析引擎有好几个。选择哪一个几乎完全取决于你的应用需要。如果你决定使用dtd,那么这个解析引擎必须能使你的xml被dtd验证。你可以将验证另放到一个进程中,但那样会影响性能。</p>< p>sax和dom是两个基本的解析模型。sax基于事件,所以在xml被解析时,事件被发送给引擎。接下来,事件与输出文件同步。dom解析引擎为动态xml数据和xsl样式表建立层次树状结构。通过随机访问dom树,可以提供xml数据,就象由xsl样式表来决定一样。sax模型上的争论主要集中于对dom结构的内存降低过度和加快xsl样式表解析时间缩短方面。</p>< p>然而,我们发现使用sax的很多系统并没有充分发挥它的能力。这些系统用它来建立dom结构并通过dom结构来发送事件。用这种方法,在任何xml处理之前必须从样式表中建立dom,所以性能会下降。</p>< p>二、生成动态xml</p>< p>一旦建立了xml格式,我们需要一种能够将其从数据库中动态移植的方法。</p>< p>生成xml文档相对来说比较简单,因为它只需要一个可以处理字符串的系统。我们建立了一个使用java servlet、enterprise javabean server、jdbc和rdbms(关系型数据库管理系统)的系统。</p>< p>&bull; servlet通过把生成xml文档的任务交给enterprise javabean (ejb)来处理产品信息请求。<br />& bull; ejb使用jdbc从数据库里查询所需的产品详细信息。<br />& bull; ejb生成xml文件并把它传递给servlet。<br />& bull; servlet调用解析引擎,从xml文件和静态的xsl样式表中创建html输出。</p>< p>(有关xsl应用的其他信息,请参阅用xsl作为模板语言。)</p>< p>生成xml的例子<br /> 在java中创建xml文档字符串的真正代码可以分成几个方法和类。</p>< p>启动xml生成过程的代码放在ejb方法里。这一实例会立即创建一个stringbuffer,以便存储生成的xml字符串。</p>< p>stringbuffer xml = new stringbuffer();< br /> xml.append(xmlutils.begindocument(&quot;/browse_find/browse.xsl&quot;,& quot;browse&quot;, request));< br /> xml.append(product.toxml());< br /> xml.append(xmlutils.enddocument(&quot;browse&quot;);<br /> out.print(xml.tostring());</p>< p><br /> 后面的三个xml.append()变元本身就是对其他方法的调用。< br /> 产生文件头<br /> 第一个附加方法调用xmlutils类来产生xml文件头。我们的java servlet中的代码如下:</p>< p>public static string begindocument(string stylesheet, string page)<br /> {< br />& nbsp;&nbsp;&nbsp; stringbuffer xml = new stringbuffer();< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;<!--l version=\"1.0\-->\n&quot;)<br />& nbsp;&nbsp;&nbsp; .append(&quot;<!--l-stylesheet href=\"")<b-->&nbsp;&nbsp;&nbsp; .append(stylesheet).append(&quot;\&quot;&quot;)< br />& nbsp;&nbsp;&nbsp; .append(&quot; type =\&quot;text/xsl\&quot;?&gt;\n&quot;);< br />& nbsp; xml.append(&quot;&lt;&quot;).append(page).append(&quot;&gt;\n&quot;);< br />& nbsp; return xml.tostring();< br /> }</p>< p>这段代码生成了xml文件头。标签把本文件定义为支持1.0版本的xml文件。第二行代码指向用以显示数据的正确样式表的位置。最后包括进去的是项级标签(本实例中为<br /> )。在文件末尾,只有<br /> 标签需要被关闭。</p>< p>填入产品信息<br /> 完成了文件头后,控制方法会调用java对象来产生它的xml。本例中调用的是product对象。product对象使用两个方法来产生它的xml表示。第一个方法toxml()通过产生&lt;product&gt;和&lt;/product&gt;标签来建立product节点。然后它会调用internalxml(),这样就能提供产品xml所需的内容。internalxml()是一系列的stringbuffer.append()调用。stringbuffer也被转换成字符串并返回给控制方法。</p>< p>public string toxml()<br />& nbsp;&nbsp;&nbsp; {< br />& nbsp;&nbsp;&nbsp; stringbuffer xml = new stringbuffer(&quot;&lt;product&gt;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(internalxml());< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;&lt;/product&gt;\n&quot;);< br />& nbsp;&nbsp;&nbsp; return xml.tostring();< br />& nbsp;&nbsp;&nbsp; }</p>< p>public string internalxml()< br />& nbsp;&nbsp;&nbsp; {< br />& nbsp;&nbsp;&nbsp; stringbuffer xml = new<br />& nbsp;&nbsp;&nbsp; stringbuffer(&quot;\t&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(producttype).append(&quot;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(idvalue.trim())<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(&quot;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(idname.trim())<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(&quot;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(page.trim())<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(&quot;\n&quot;);< br /> 厖?<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(amount).append(&quot;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(vendor).append(&quot;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(pubdesc).append(&quot;\n&quot;);< br />& nbsp;&nbsp;&nbsp; xml.append(&quot;\t&quot;).append(vendesc).append(&quot;\n&quot;;< br /> 厖?<br />& nbsp;&nbsp;&nbsp; return xml.tostring();< br /> }</p>< p><br /> 关闭文件<br /> 最后,xmlutils.enddocument()方法被调用。这个调用关闭xml标签(本例中为),并最终完成架构好的xml文件。来自控制方法的整个stringbuffer也转换成字符串,并返回给处理最初http请求的servlet。</p>< p>三、用xsl作为模板语言</p>< p>为了得到html输出,我们把生成的xml文件和控制xml数据如何表示的xsl模板相结合。我们的xsl模板由精心组织的xsl和html标签组成。</p>< p>开始建模板<br /> 我们的xsl模板开始部分与下面这段代码类似。第一行代码为必需代码,将本文件定义为xsl样式表。xmlns:xsl=属性引用本文件所使用的xml名称空间,而version=属性则定义名称空间的版本号。在文件的末尾,我们关闭标签。</p>< p>由&lt;xsl:template&gt;开始的第二行代码确定了xsl模板的模式。match属性是必需的,在这里指向xml标签&lt;basketpage&gt;。在我们的系统里,&lt;basketpage&gt;标签里包含&lt;product&gt; 标签,这http://www.downcc.com/tech/866.htmlXml编程2010/02/16 18:51:12<p>1、复杂类型和简单类型之间最根本的区别就是:复杂类型的内容中可以包含其他元素,也可以带有属性(Attribute),但简单类型既不能包含子元素,也不能带有任何属性。< br />& lt;xsd:complexType&nbsp;name=&quot;CNAddress&quot;&nbsp;&gt;< br />& lt;xsd:sequence&gt;< br />& lt;xsd:element&nbsp;name=&quot;name&quot;type=&quot;xsd:string&quot;/&gt;< br />& lt;xsd:element&nbsp;name=&quot;street&quot;&nbsp;type=&quot;xsd:string&quot;/&gt;< br />& lt;xsd:element&nbsp;name=&quot;city&quot;type=&quot;xsd:string&quot;/&gt;< br />& lt;xsd:element&nbsp;name=&quot;zip&quot;type=&quot;xsd:decimal&quot;/&gt;< br />& lt;/xsd:sequence&gt;< br />& lt;xsd:attribute&nbsp;name=&quot;country&quot;&nbsp;type=&quot;xsd:NMTOKEN&quot;&nbsp;fixed=&quot;US&quot;/&gt;< br />& lt;/xsd:complexType&gt;< br />< br /> 2、element存在约束:element可以通过其minOccurs和maxOccurs两个属性来约束元素实例存在的个数,这两个属性的缺省值都是1,表示默认情况下此元素在XML实例文档中必须出现一次。< br />< br /> 3、attribute存在约束:元素属性也可以通过attribute的use属性来约束出现一次或根本不出现;use属性的取值可以是required,optional,prohibited三个值,缺省(默认)值是optional.< br />< br /> 4、element和attribute都有一个default和fixed属性,针对element来书,只有当element实例为空时才采用此default值,而attribute是当实例不提供此attribute时才采用此default值,因此对attribute而言,只有其use值是optional时default值才有意义,而且对element和attribute来说fixed和default两个属性不能同时存在,否则会出现错误。< br />< br /> 5、直接定义在schema元素下,即schema元素的顶级子元素的element和attribute都是全局的,称之为全局元素和全局属性,你在其他类型定义中可以直接引用。< br />< br /> 6、派生新类型有两种方式:第一种就是直接从其他类型中扩展(继承)而来,另外一种就是通过对已有类型进行限定性约束而来。< br /> 如:以下有三种通过限定性约束定义的新类型:< br /> 通过值范围限定:< br />& lt;xsd:simpleType&nbsp;name=&quot;myInteger&quot;&gt;< br />& lt;xsd:restriction&nbsp;base=&quot;xsd:integer&quot;&gt;< br />& lt;xsd:minInclusive&nbsp;value=&quot;10000&quot;/&gt;< br />& lt;xsd:maxInclusive&nbsp;value=&quot;99999&quot;/&gt;< br />& lt;/xsd:restriction&gt;< br />& lt;/xsd:simpleType&gt;< br /> 使用模式匹配限定:< br />& lt;xsd:simpleType&nbsp;name=&quot;SKU&quot;&gt;< br />& lt;xsd:restriction&nbsp;base=&quot;xsd:string&quot;&gt;< br />& lt;xsd:pattern&nbsp;value=&quot;\d{3}-[A-Z]{2}&quot;/&gt;< br />& lt;/xsd:restriction&gt;< br />& lt;/xsd:simpleType&gt;< br /> 使用枚举方式限定:< br />& lt;xsd:simpleType&nbsp;name=&quot;CNCity&quot;&gt;< br />& lt;xsd:restriction&nbsp;base=&quot;xsd:string&quot;&gt;< br />& lt;xsd:enumeration&nbsp;value=&quot;BeiJing&quot;/&gt;< br />& lt;xsd:enumeration&nbsp;value=&quot;NanChang&quot;/&gt;< br />& lt;xsd:enumeration&nbsp;value=&quot;ShangHai&quot;/&gt;< br />& lt;/xsd:restriction&gt;< br />& lt;/xsd:simpleType&gt;< br />< br /> 7、原子类型(不可分割的类型,象string,integer等系统内建的类型)、列表类型、联合类型合起来统一称为简单类型。在Schema中有NMTOKENS、IDREFS、ENTITIES三种内建的列表类型,你也可以从已有的简单类型来创建list(列表)类型,但你不能从已有的list类型和复杂类型来创建列表(list)类型。< br /> 如:< br />& lt;xsd:simpleType&nbsp;name=&quot;listOfMyIntType&quot;&gt;< br />& lt;xsd:list&nbsp;itemType=&quot;myInteger&quot;/&gt;< br />& lt;/xsd:simpleType&gt;< br /> 在XML实例文档中列表类型的值是通过空格来进行分隔的,如果声明了一个listOfMyIntType元素,其值可能是:< br />& lt;listOfMyInt&gt;20003&nbsp;15037&nbsp;95977&nbsp;95945&lt;/listOfMyInt&gt;< br />< br /> 8、有几个方面的元素可以应用于list类型来进行约束,它们是:length、minLength、maxLength和enumeration,如:< br />& lt;xsd:simpleType&nbsp;name=&quot;USStateList&quot;&gt;< br />& lt;xsd:list&nbsp;itemType=&quot;USState&quot;/&gt;< br />& lt;/xsd:simpleType&gt;< br />& lt;xsd:simpleType&nbsp;name=&quot;SixUSStates&quot;&gt;< br />& lt;xsd:restriction&nbsp;base=&quot;USStateList&quot;&gt;< br />& lt;xsd:length&nbsp;value=&quot;6&quot;/&gt;< br />& lt;/xsd:restriction&gt;< br />& lt;/xsd:simpleType&gt;< br /> 注:针对列表类型要千万注意成员是string类型的,因为string类型中的空格和列表类型的分割符空格会造成部分混淆。<br /> 9、对元素的定义可以采用通过指定其type属性为已定义的属性的方式,也可一采用匿名定义类型的方式,如:< br /> 采用类型定义:< br />& lt;xsd:element&nbsp;name=&rdquo;comment&rdquo;&nbsp;type=&rdquo;xsd:string&rdquo;&gt;< br /> 采用匿名定义:< br />& lt;xsd:element&nbsp;name=&rdquo;quantity&rdquo;&gt;< br />& lt;xsd:simpleType&gt;< br />& lt;xsd:restriction&nbsp;base=&rdquo;xsd:positiveInteger&rdquo;&gt;< br />& lt;xsd:maxExclusive&nbsp;value=&rdquo;100&rdquo;&nbsp;/&gt;< br />& lt;/xsd:restriction&gt;< br />& lt;/xsd:simpleType&gt;< br />& lt;/xsd:element&gt;< br />< br /> 10、union(联合)类型表示在XML实例文档中的元素实例符合union类型定义的成员类型中的一种就可以了(合法),这一点和C++中的联合类型有类似的概念,如:< br />& lt;xsd:simpleType&nbsp;name=&quot;addrUnion&quot;&gt;< br />& lt;xsd:union&nbsp;memberTypes=&quot;xsd:string&nbsp;integer&quot;/&gt;< br />& lt;/xsd:simpleType&gt;< br />< br /> 11、复杂类型一般可以分为三类:第一类是包含字符内容和属性但不包含子元素;第二类是包含属性和子元素但不包含字符数据(字符数据包含在子元素中);第三类是即包含属性和字符内容又包含子元素的;那么如何来定义这三类类型呢?针对第一类可以通过simpleContent来实现,第二类可以通过complexContent来做到,第三类只需要将complexType的属性mixed设为true就可以了。具体的例子如下:< br />< br /> 第一种类型(从一个简单类型扩展而来,增加了属性):< br />& lt;xsd:element&nbsp;name=&quot;internationalPrice&quot;&gt;< br />& lt;xsd:complexType&gt;< br />& lt;xsd:simpleContent&gt;< br />& lt;xsd:extension&nbsp;base=&quot;xsd:decimal&quot;&gt;< br />& lt;xsd:attribute&nbsp;name=&quot;currency&quot;&nbsp;type=&quot;xsd:string&quot;/&gt;</p>< p>&lt;/xsd:extension&gt;< br />& lt;/xsd:simpleContent&gt;< br />& lt;/xsd:complexType&gt;< br />& lt;/xsd:element&gt;< br />< br /> 第二种类型(有一个element和两个attribute构成):< br />& lt;xsd:element&nbsp;name=&quot;internationalPrice&quot;&gt;< br />& lt;xsd:complexType&gt;< br />& lt;xsd:complexContent&gt;< br />& lt;xsd:element&nbsp;name=&rdquo;Country&rdquo;&nbsp;?type=&rdquo;xsd:string&rdquo;&nbsp;/&gt;< br />& lt;xsd:attribute&nbsp;name=&quot;currency&quot;&nbsp;type=&quot;xsd:string&quot;/&gt;< br />& lt;xsd:attribute&nbsp;name=&quot;value&quot;?type=&quot;xsd:decimal&quot;/&gt;< br />& lt;/xsd:complexContent&gt;< br />& lt;/xsd:complexType&gt;< br />& lt;/xsd:element&gt;< br /> 注意:在这里由于默认情况下缺省是complexContent,所以在这里简略的写法是:< br />& lt;xsd:element&nbsp;name=&quot;internationalPrice&quot;&gt;< br />& lt;xsd:complexType&gt;< br />& lt;xsd:element&nbsp;name=&rdquo;Country&rdquo;type=&rdquo;xsd:string&rdquo;&nbsp;/&gt;< br />& lt;xsd:attribute&nbsp;name=&quot;currency&quot;&nbsp;type=&quot;xsd:string&quot;/&gt;< br />& lt;xsd:attribute&nbsp;name=&quot;value&quot;?type=&quot;xsd:decimal&quot;/&gt;< br />& lt;/xsd:complexContent&gt;< br />& lt;/xsd:element&gt;< br />< br /> 第三种类型:< br />& lt;xsd:element&nbsp;name=&quot;letterBody&quot;&gt;< br />& lt;xsd:complexType&nbsp;mixed=&quot;true&quot;&gt;< br />& lt;xsd:sequence&gt;< br />& lt;xsd:element&nbsp;name=&quot;salutation&quot;&gt;< br />& lt;xsd:complexType&nbsp;mixed=&quot;true&quot;&gt;< br />& lt;xsd:sequence&gt;< br />& lt;xsd:element&nbsp;name=&quot;name&quot;&nbsp;type=&quot;xsd:string&quot;/&gt;< br />& lt;/xsd:sequence&gt;< br />& lt;/xsd:complexType&gt;< br />& lt;/xsd:element&gt;< br />& lt;xsd:element&nbsp;name=&quot;quantity&quot;type=&quot;xsd:positiveInteger&quot;/&gt;< br />& lt;xsd:element&nbsp;name=&quot;productName&quot;&nbsp;type=&quot;xsd:string&quot;/&gt;< br />& lt;xsd:element&nbsp;name=&quot;shipDate&quot;type=&quot;xsd:date&quot;&nbsp;minOccurs=&quot;0&quot;/&gt;< br />& lt;/xsd:sequence&gt;< br />& lt;/xsd:complexType&http://www.downcc.com/tech/865.htmlXml编程2010/02/16 18:48:24<p>&nbsp;&nbsp;&nbsp; 应用程序开发技术正发生着一次质的飞跃,从根本上大幅度提高开发人员的生产效率,它开启了一道通向全新概念的应用程序的大门。</p>< p>&nbsp;&nbsp;&nbsp; 在过去,开发人员一直通过集成本地系统服务来构建应用程序。在这种模式下,开发人员可以访问丰富的开发资源并能严格控制应用程序的行为。</p>< p>&nbsp;&nbsp;&nbsp; 如今,开发人员在很大程度上已挣脱了这种模式的束缚,致力于构建具有复杂结构的n层系统,这种系统能将网络中各处的众多的应用程序进行集成,并大大提升应用程序的价值。这样,开发人员便可集中精力挖掘软件独特的商业价值,而不必日夜为如何构建基本结构伤脑筋了。令人欣喜的局面将应运而生:软件投放市场的时间大大缩短、开发人员的编程效率明显提高,最为根本的是开发出质量上乘的软件。</p>< p>&nbsp;&nbsp;&nbsp; 我们正在进入一个崭新的计算时代,一个互联网时代,其核心技术是&ldquo;可扩展标记语言&rdquo;,即XML.XML创建出可供任何人从任何地方访问和使用的功能强大的应用程序。它极大地扩展了应用程序的功能,并实现了软件的不间断传输。在这种大环境中,软件已不完全是指那些从CD进行安装的程序,而是已经演变成了一种服务:类似于调用者的ID验证或按观看次数进行收费的电视,人们可通过通信媒体预定此类服务。</p>< p>&nbsp;&nbsp;&nbsp; 这一切,是通过将紧密耦合的、高效的n层计算技术与面向消息的、松散耦合的Web概念相结合来实现的。我们将这种计算风格称为Web服务,它的出现标志着人类已经迈入应用程序开发技术的新纪元。Web服务是一种应用程序,它可以使用标准的互联网协议,像超文本传输协议(HTTP)和XML,将功能纲领性地体现在互联网和企业内部网上。可将Web服务视作Web上的组件编程。</p>< p>&nbsp;&nbsp;&nbsp; 从理论上讲,开发人员可通过调用Web应用编程接口(API)(就像调用本地服务一样),将Web服务集成到应用程序中,不同的是Web API调用可通过互联网发送给位于远程系统中的某一服务。例如,Microsoft Passport服务使得开发人员能够对某应用程序进行验证。通过Passport服务编程,开发人员可以充分利用Passport的基本结构,通过运行Passport来维护用户数据库,以确保它的正常运行、定期备份等等。</p>< p>&nbsp;&nbsp;&nbsp; 松散耦合</p>< p>&nbsp;&nbsp;&nbsp; 在某个网络中分发应用程序逻辑,并不是一个全新的概念,在Web中分发并集成应用程序逻辑才是一个崭新的概念。</p>< p>&nbsp;&nbsp;&nbsp; 从前,分布式的应用程序逻辑需要使用分布式的对象模型,诸如:微软的分布式组件对象模型(DCOM)、对象管理集团的公用对象请求代理程序体系结构(CORBA)或Sun的远程方法调用(RMI)。通过使用这种基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。</p>< p>&nbsp;&nbsp;&nbsp; 这些系统有一个共同的缺陷,那就是它们无法扩展到互联网上:它们要求服务客户端与系统提供的服务本身之间必须进行紧密耦合,即要求一个同类基本结构。这样的系统往往十分脆弱:如果一端的执行机制发生变化,那么另一端便会崩溃。例如,如果服务器应用程序的接口发生更改,那么客户端便会崩溃。</p>< p>&nbsp;&nbsp;&nbsp; 要求提供紧密耦合的基本结构,无可厚非,许多应用程序均是基于这种系统构建而成的。但是,当各个公司需要相互合作、或信息技术提供商扩大业务范围时,便很难实现单一而统一的基本结构。您根本无法保证您希望与之进行远程通信的管道的另一端,具备所有您需要的基本结构:对于它使用的操作系统、对象模型或编程语言,您可能一无所知。</p>< p>&nbsp;&nbsp;&nbsp; 相反,Web服务彼此是松散偶合的。连接中的任何一方均可更改执行机制,却不影响应用程序的正常运行。从技术角度讲,人们已转向使用一种基于消息的异步技术来实现高可靠性的系统性能,通过使用诸如HTTP、简单邮件传输协议(SMTP)以及至为重要的XML来实现统一的连接。</p>< p>&nbsp;&nbsp;&nbsp; 消息传递系统将通信的基本单元打包成自我描述型的数据包(又称作消息),并将其放到网络缆线中。消息传递系统与分布式对象系统之间的本质区别在于:要求发送方辨识接收方的基本结构的程度有所不同。在分布式系统中,发送方需对接收方的情况作出种种猜测:应用程序是如何激活或拆包的,调用的是什么样的界面,等等。</p>< p>&nbsp;&nbsp;&nbsp; 另一方面,消息传递系统会在缆线格式级上创建合同。发送方既不需考虑消息被接收后的情况,也不需考虑接发双方之间的通信情况,唯一需要考虑的是接收方是否能辩识发送的消息内容。</p>< p>&nbsp;&nbsp;&nbsp; 在缆线格式级上创建合同的优势不言而喻。例如,接收方可在任何时刻进行更改,而不会干扰发送方的消息发送,只要它仍可辩识原有消息的内容。另外,发送方无需任何特殊的软件即可与接收方通信:只要它发出正确格式的消息,接收方就可以响应。</p>< p><br /> 缆线级的XML:SOAP</p>< p>  实现Web服务的异类基本结构以及在整个Web中实现Web服务的关键,是实现支持简单数据描述格式的技术。这种格式就是XML。Web服务必须使用XML来完成三件事情:基本的缆线格式、服务描述以及&ldquo;服务发现&rdquo;。</p>< p>  SOAP:在通信的最低级别,系统需要使用同一语言。特别,作为通信双方的应用程序需要遵守同一套通信规则:如何表示不同的数据类型(例如:是整数还是数组),以及如何表示命令(即:需要对数据进行何种操作)。另外,在必要的时候应用程序还需对该语言适当的扩展。简单对象访问协议(SOAP)是XML的实施工具,它提供了一套公共规则集,该规则集说明了如何表示并扩展数据和命令。</p>< p>  Web服务描述语言(WSDL)。双方应用程序在得到了如何表示数据类型和命令的规则后,需要对所接收的特定数据和命令进行有效的描述。仅仅说已接收到整数是不够的;比如,在接收到两个整数后,应用程序必须明确表述它可以对这两个整数执行乘法运算操作。Web服务描述语言(WSDL)是一种XML语法,开发人员和开发工具可使用它来表述Web服务的具体功能。</p>< p>  &ldquo;SOAP发现&rdquo;:在最高层,还需制定一套如何定位服务描述的规则:默认情况下,用户或工具能在什么地方找到服务的功能描述?依据&ldquo;SOAP发现&rdquo;规格说明中提供的规则集,用户或开发工具可以自动找到服务的SCL描述。</p>< p>  一旦实现了这三种功能层,开发人员便可容易地找到Web服务,将它例示成一个对象后再集成进应用程序中,继而构建出一个具有丰富功能的基本结构。这样,得到的应用程序便能与Web服务进行反向通信了。</p>< p>  .NET框架:Web服务引擎</p>< p>  很显然,许多基本结构都需实现上述进程对开发人员和用户的透明化。.NET框架提供此基本结构。从.NET框架角度看,所有组件都可以是Web服务,而Web服务也仅是一种组件。实际上,.NET框架提取出微软组件对象模型(COM)的精华,将它们与松散耦合计算的精华有机地结合在一起,生成了强大、高效的Web组件系统:简化程序员的&ldquo;管道&rdquo;操作、深入地集成了安全性,引进了基于互联网的操作系统,极大地改善应用程序的可靠性和可扩展性。</p>< p>  .NET框架包含三个主要部分:公共语言运行时、具有多层次结构的统一的类库集合和高级版&ldquo;活动服务器页面&rdquo;(又名ASP+)</p>< p>  公共语言运行时</p>< p>  此名称不能准确反映它的全部功能。实际上,公共语言运行时在组件的开发过程中以及软件的运行过程中,都扮演着非常重要的角色。在组件运行过程中,运行时负责管理内存分配、启动或取消线程和进程、实施安全性策略、同时满足当前组件对其它组件的需求。在开发阶段,运行时的作用有些变化:与现今的COM相比,运行时的自动化程度大为提高(比如可自动执行内存管理),因而开发人员的工作变得非常轻松。尤其是,映射功能将使代码编写量锐减,这些代码是开发人员在将业务逻辑转化成可复用的组件进行编程时所需的。</p>< p>  对编程语言而言,运行时这个概念并不新奇:实际上每种编程语言都有自己的运行时。Visual Basic?开发系统具有最为明显的运行时(名为VBRUN),Visual C++?跟Visual FoxPro?、Jscript?、SmallTalk、Perl、Python和Java一样,有一个运行时MSVCRT。NET框架的关键作用是它提供了一个跨编程语言的统一的编程环境,这也是它能独树一帜的根本原因所在。</p>< p>  统一的编程类</p>< p>  .NET框架中的类为开发人员提供了一个统一的、面向对象的、层次化的、可扩展的类库集(API)。现今,C++开发人员使用的是微软基础类库,Java开发人员使用的是Windows?基础类库,而Visual Basic用户使用的又是Visual Basic API集。简而言之,.NET框架统一了微软当前各种不同的框架。这样,开发人员不再需要学习多种框架就能顺利编程。远不止于此的是,通过创建一个公共的跨编程语言的API集,.NET框架可实现跨语言继承性、错误处理功能和调试功能。实际上,从Jscript到C++的所有编程语言,都是相互等同的,开发人员可以自由选择理想的编程语言。</p>< p>  高级版&ldquo;活动服务器页面&rdquo;(ASP+)</p>< p>  ASP+是使用 .NET框架提供的类库构建而成的,它提供了一个Web应用程序模型,该模型由一组控件和一个基本结构组成。有了它,Web应用程序的构建变得非常容易。开发人员可以直接使用ASP+控件集,该控件集封装了公共的、用于超文本标识语言(HTML)用户界面的各种小组件(诸如文本框、下拉菜单等等)。实际上,这些控件运行在Web服务器上,它们将用户界面转换成HTML格式后再发送给浏览器。在服务器上,控件负责将面向对象的编程模型呈现给Web开发人员,这种编程模型能提供面向对象的编程技术拥有的丰富功能。ASP+还提供一些基本结构服务(诸如会话状态管理和进程循环),这些服务进一步减少了http://www.downcc.com/tech/829.htmlXml编程2010/02/07 12:56:10<p>#region 读写xml文件的2个小函数,2005 4 2 by hyc</p>< p>&nbsp;&nbsp;public void SetXmlFileValue(string xmlPath,string AppKey,string AppValue)//写xmlPath是文件路径+文件名,AppKey是 Key Name,AppValue是Value<br />& nbsp;&nbsp;{<br />& nbsp;&nbsp;&nbsp;XmlDocument xDoc = new XmlDocument();<br />& nbsp;&nbsp;&nbsp;xDoc.Load(xmlPath);<br />& nbsp;&nbsp;&nbsp;XmlNode xNode;<br />& nbsp;&nbsp;&nbsp;XmlElement xElem1;<br />& nbsp;&nbsp;&nbsp;XmlElement xElem2;</p>< p>&nbsp;&nbsp;&nbsp;xNode =&nbsp; xDoc.SelectSingleNode(&quot;//appSettings&quot;);</p>< p>&nbsp;&nbsp;&nbsp;xElem1 = (XmlElement)xNode.SelectSingleNode(&quot;//add[@key='&quot; + AppKey +& quot;']&quot;);<br />& nbsp;&nbsp;&nbsp;if ( xElem1 != null )<br />& nbsp;&nbsp;&nbsp;{<br />& nbsp;&nbsp;&nbsp;&nbsp;xElem1.SetAttribute(&quot;value&quot;,AppValue);<br />& nbsp;&nbsp;&nbsp;}<br />& nbsp;&nbsp;&nbsp;else<br />& nbsp;&nbsp;&nbsp;{<br />& nbsp;&nbsp;&nbsp;&nbsp;xElem2 = xDoc.CreateElement(&quot;add&quot;);<br />& nbsp;&nbsp;&nbsp;&nbsp;xElem2.SetAttribute(&quot;key&quot;,AppKey);<br />& nbsp;&nbsp;&nbsp;&nbsp;xElem2.SetAttribute(&quot;value&quot;,AppValue);<br />& nbsp;&nbsp;&nbsp;&nbsp;xNode.AppendChild(xElem2);<br />& nbsp;&nbsp;&nbsp;}<br />& nbsp;&nbsp;&nbsp;xDoc.Save(xmlPath);<br />& nbsp;&nbsp;}</p>< p><br />& nbsp;&nbsp;public void GetXmlFileValue(string xmlPath,string AppKey,ref string AppValue)//读xmlPath是文件路径+文件名,AppKey是 Key Name,AppValue是Value<br />& nbsp;&nbsp;{<br />& nbsp;&nbsp;&nbsp;XmlDocument xDoc = new XmlDocument();<br />& nbsp;&nbsp;&nbsp;xDoc.Load(xmlPath);<br />& nbsp;&nbsp;&nbsp;XmlNode xNode;<br />& nbsp;&nbsp;&nbsp;XmlElement xElem1;</p>< p>&nbsp;&nbsp;&nbsp;xNode =&nbsp; xDoc.SelectSingleNode(&quot;//appSettings&quot;);</p>< p>&nbsp;&nbsp;&nbsp;xElem1 = (XmlElement)xNode.SelectSingleNode(&quot;//add[@key='&quot; + AppKey +& quot;']&quot;);<br />& nbsp;&nbsp;&nbsp;if ( xElem1 != null )<br />& nbsp;&nbsp;&nbsp;{<br />& nbsp;&nbsp;&nbsp;&nbsp;AppValue=xElem1.GetAttribute (&quot;value&quot;);<br />& nbsp;&nbsp;&nbsp;}<br />& nbsp;&nbsp;&nbsp;else<br />& nbsp;&nbsp;&nbsp;{<br /> //&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show (&quot;There is not any information!&quot;);<br />& nbsp;&nbsp;&nbsp;}</p>< p>&nbsp;&nbsp;}</p>< p>&nbsp;&nbsp;#endregion</p>http://www.downcc.com/tech/828.htmlPHP编程2010/02/07 12:50:35<p>PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。</p>< p><strong>1、错误提示:</strong></p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">Warning: Cannot send session cookie - headers already sent< br /> Warning: Cannot send session cache limiter - headers already sent</td>< /tr>< /tbody>< /table>< /p>< p><strong>分析及解决办法</strong></p>< p>这一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的session_start()调到程序的第一行。</p>< p><strong>2、错误提示</strong></p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">Warning: open(F:/689\php\sessiondata\sess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed</td>< /tr>< /tbody>< /table>< /p>< p><strong>分析及解决方法:< /strong></p>< p>出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">session_save_path = c:\temp< br /> session.cookie_path = \</td>< /tr>< /tbody>< /table>< /p>< p>然后在c:\目录下建立一个temp目录即可。</p>< p><strong>3、错误提示</strong></p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">Warning: Trying to destroy uninitialized session in</td>< /tr>< /tbody>< /table>< /p>< p>分析及解决方法出类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。</p>< p><strong>4、问题:怎么获得当前session的id值呢</strong>?</p>< p>最简单的方法是:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">echo SID;</td>< /tr>< /tbody>< /table>< /p>< p><strong>5、问题:</strong></p>< p>我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘故呢?</p>< p>答:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任何的输出!但是你是否用光标键在?&gt;这个PHP代码结束语句后移动检查呢?那么你会发现在?&gt;这个后面,有一个空行或几个空格,你删除了这几个空行或空格,那么问题就解决了。</p>< p>注:此问题,会出PHP4.1.2中,更高版本,没有测试过。</p>< p>6、问:用session做登录主页面后,其它页面怎么用session限制登录?</p>< p>答:最简单的方法是</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">session_start();< br /> if(!session_registered('login') ││ $login != true)< br /> {< br /> echo& quot;你没有登陆&quot;;< br /> exit;< br /> }</td>< /tr>< /tbody>< /table>< /p>< p>7、问:我用session_register()注册了session变量,可是当我用header或用javascript的重定向语句,那么在一下页面中,我却访问不到session所注册的变量值。请问如何解决?</p>< p>问题的程序片段:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">&lt;?< br /> session_start();< br /> $ok = 'love you';< br /> session_register('ok');< br /> header(&quot;location : next.php&quot;);< br /> ?&gt;</td>< /tr>< /tbody>< /table>< /p>< p>next.php</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">&lt;?< br /> session_start();< br /> echo $ok;< br /> ?&gt;</td>< /tr>< /tbody>< /table>< /p>< p><strong>解决的方法:</strong></p>< p>当你用header函数或window.location这样的功能后,你上一个页面所注册的session变量,就会容易的丢失,关于这个问题的原因,至今仍没有一个详细的回答。</p>< p>不过有解决的方法。如下所示</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">header(&quot;Location: next.php&quot; .&quot;?&quot; . SID);</td>< /tr>< /tbody>< /table>< /p>< p>在跳转到下一页面的时候,将session的当前id做为一个参数,传到后一个页面。</p>< p><strong>8、session如何传数组</strong></p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">session_register('data');< br /> $data=array(1,2,3,4);</td>< /tr>< /tbody>< /table>< /p>< p><strong>方法是先注册后赋值</strong></p>< p>9、我是不是可以用像$HTTP_GET_VARS['**']方式来访问session值呢?</p>< p>回答:可以,你可以使用如下global数组来访问session,以加强网页的安全性</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">$HTTP_SESSION_VARS< br /> $_SESSION</td>< /tr>< /tbody>< /table>< /p>< p>例程:</p>< p>< table cellspacing="0" celhttp://www.downcc.com/tech/827.htmlAsp编程2010/02/07 12:48:33<p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font><br />& lt;% FunctIon DownloadFIle(StrFIle)<br /> StrFIlename=StrFIle<br /> Response.Buffer=True<br /> Response.Clear<br /> Set S=Server.CreateObJect(&quot;ADODB.Stream&quot;)<br /> S.Open<br /> S.Type=1<br /> on Error Resume Next<br /> Set Fso=Server.CreateObJect(&quot;ScrIptIng.FIleSystemObJect&quot;)<br /> If Not Fso.FIleExists(StrFIleName) Then<br /> From_Url=Cstr(Request.ServerVarIables(&quot;HTTP_REFERER&quot;))<br /> Serv_Url=Cstr(Request.ServerVarIables(&quot;SERVER_NAME&quot;))<br /> If MId(From_Url,8,len(Serv_Url))& lt;&gt; Serv_Url Then<br /> Response.WrIte& quot;该文件不存在或者已经删除.&quot;<br /> Response.End<br /> End If<br /> Response.RedIrect Request.ServerVarIables(&quot;HTTP_REFERER&quot;)<br /> Response.End<br /> End If<br /> FileExt=MId(StrFIlename,InStrRev(StrFIleName,& quot;.&quot;)+1)<br /> Select Case UCase(FIleExt)<br /> Case& quot;ASP&quot;,& quot;ASA&quot;,& quot;ASPX&quot;,& quot;ASAX&quot;,& quot;MDB&quot;,& quot;PHP&quot;,& quot;JSP&quot;,& quot;SHTML&quot;,& quot;HTML&quot;,& quot;HTM&quot;,& quot;TV&quot;,& quot;DATA&quot;<br /> From_Url=Cstr(Request.ServerVarIables(&quot;HTTP_REFERER&quot;))<br /> Serv_Url=Cstr(Request.ServerVarIables(&quot;SERVER_NAME&quot;))<br /> If MId(From_Url,8,len(Serv_Url))& lt;&gt; Serv_Url Then<br /> Response.WrIte& quot;该文件不存在或者已经删除.&quot;<br /> Response.End<br /> End If<br /> Response.RedIrect Request.ServerVarIables(&quot;HTTP_REFERER&quot;)<br /> Response.End<br /> End Select<br /> Set F=Fso.GetFIle(StrFIlename)<br /> IntFIlelength=F.SIze<br /> s.LoadFromFIle(StrFIlename)<br /> If Err Then<br /> From_Url=Cstr(Request.ServerVarIables(&quot;HTTP_REFERER&quot;))<br /> Serv_Url=Cstr(Request.ServerVarIables(&quot;SERVER_NAME&quot;))<br /> If MId(From_Url,8,len(Serv_Url))& lt;&gt; Serv_Url Then<br /> Response.WrIte& quot;该文件数据不完整或许已损坏.&quot;<br /> Response.End<br /> End If<br /> Response.RedIrect Request.ServerVarIables(&quot;HTTP_REFERER&quot;)<br /> Response.End<br /> End If<br /> Set Upload=Server.CreateObJect(&quot;PersIts.Upload&quot;)<br /> If Upload Is Nothing Then<br /> Response.AddHeader& quot;Content-DIsposItIon&quot;,&quot;attachment; FIlename=&quot;&amp;F.Name<br /> Response.AddHeader& quot;Content-Length&quot;,IntFilelength<br /> Response.CharSet=&quot;UTF-8&quot;<br /> Response.ContentType=&quot;application/x-download&quot;<br /> Response.BinaryWrite S.Read<br /> Response.Flush<br /> S.Close<br /> Set s=NothIng<br /> Else<br /> Upload.SendBinary StrFIlename,True,&quot;application/x-download&quot;,False<br /> End If<br /> End FunctIon<br /> %&gt;</td>< /tr>< /tbody>< /table>< /p>< p>调用</p>< p>&lt;%Call DownloadFIle(&quot;下载地址&quot;)%&gt;</p>http://www.downcc.com/tech/687.htmlPHP编程2010/01/10 18:57:20<p>PHP还是一个不断发展的工具,其功能还在不断地删减< br /> ; 而php.ini的设置更改可以反映出相当的变化,< br /> ; 在使用新的PHP版本前,研究一下php.ini会有好处的< br /> ;;;;;;;;;;;;;;;;;;;< br /> ; 关于这个文件 ;< br /> ;;;;;;;;;;;;;;;;;;;< br /> ; 这个文件控制了PHP许多方面的观点.为了让PHP读取这个文件,它必须被命名为&nbsp;& nbsp;<br /> ; 'php.ini'.PHP 将在这些地方依次查找该文件:当前工作目录;环境变量PHPRC< br /> ; 指明的路径;编译时指定的路径.< br /> ; 在windows下,编译时的路径是Windows安装目录.< br /> ; 在命令行模式下,php.ini的查找路径可以用 -c 参数替代.< br /> ; 该文件的语法非常简单.空白字符和用分号';'开始的行被简单地忽略(就象你可能< br /> ; 猜到的一样). 章节标题(例如 : [Foo])也被简单地忽略,即使将来它们可能< br /> ; 有某种的意义.< br /> ;< br /> ; 指示被指定使用如下语法:< br /> ; 指示标识符 = 值< br /> ; directive = value< br /> ; 指示标识符 是 *大小写敏感的* - foo=bar 不同于 FOO = bar.< br /> ;< br /> ; 值可以是一个字符串,一个数字,一个 PHP 常量 (如: E_ALL or M_PI), INI 常量中的< br /> ; 一个 (On, Off, True, False, Yes, No and None) ,或是一个表达式< br /> ; (如: E_ALL& amp; ~E_NOTICE), 或是用引号括起来的字符串(&quot;foo&quot;).< br /> ;< br /> ; INI 文件的表达式被限制于位运算符和括号.< br /> ; | bitwise OR< br /> ;& amp; bitwise AND< br /> ; ~ bitwise NOT< br /> ; ! boolean NOT< br /> ;< br /> ; 布尔标志可用 1, On, True or Yes 这些值置于开的状态.< br /> ; 它们可用 0, Off, False or No 这些值置于关的状态.< br /> ;< br /> ; 一个空字符串可以用在等号后不写任何东西表示,或者用 None 关键字:< br /> ;< br /> ; foo = ; 将foo置为空字符串< br /> ; foo = none ; 将foo置为空字符串< br /> ; foo =& quot;none&quot; ; 将foo置为字符串'none'< br /> ;< br /> ; 如果你值设置中使用常量,而这些常量属于动态调入的扩展库(不是 PHP 的扩展,就是< br /> ; Zend 的扩展),你仅可以调入这些扩展的行*之后*使用这些常量.< br /> ;< br /> ; 所有在 php.ini-dist 文件里设定的值与内建的默认值相同(这是说,如果 php.ini< br /> ; 没被使用或者你删掉了这些行,默认值与之相同).< br /> ;;;;;;;;;;;;;;;;;;;;< br /> ; 语言选项 ;< br /> ;;;;;;;;;;;;;;;;;;;;< br /> engine = On< br /> ; 使 PHP scripting language engine(PHP 脚本语言引擎)在 Apache下有效.< br /> short_open_tag = On< br /> ; 允许& lt;? 标识(这种简单表示). 仅有& lt;?php and& lt;script&gt; tags 将被识别.< br /> asp_tags = Off< br /> ; 允许ASP-style& lt;% %&gt; tags< br /> precision = 14< br /> ; 浮点类型数显示时的有效位数< br /> y2k_compliance = Off< br /> ; 是否打开 2000年适应 (可能在非Y2K适应的浏览器中导致问题)< br /> output_buffering = Off< br /> ; 输出缓存允许你甚至在输出正文内容之后发送 header(标头,包括cookies)行< br /> ; 其代价是输出层减慢一点点速度.你可以使用输出缓存在运行时打开输出缓存,< br /> ; 或者在这里将指示设为 On 而使得所有文件的输出缓存打开.< br /> output_handler = ; 你可以重定向你的脚本的所有输出到一个函数,< br /> ; 那样做可能对处理或以日志记录它有用.< br /> ; 例如若你将这个output_handler 设为&quot;ob_gzhandler&quot;,< br /> ; 则输出会被透明地为支持gzip或deflate编码的浏览器压缩.< br /> ; 设一个输出处理器自动地打开输出缓冲.< br /> implicit_flush = Off< br /> ; 强制flush(刷新)让PHP 告诉输出层在每个输出块之后自动刷新自身数据.< br /> ; 这等效于在每个 print() 或 echo() 调用和每个 HTML 块后调用flush()函数.< br /> ; 打开这项设置会导致严重的运行时冲突,建议仅在debug过程中打开.< br /> allow_call_time_pass_reference = On< br /> ; 是否让强迫函数调用时按引用传递参数.这一方法遭到抗议,< br /> ; 并可能在将来版本的PHP/Zend里不再支持.< br /> ; 受到鼓励的指定哪些参数按引用传递的方法是在函数声明里.< br /> ; 你被鼓励尝试关闭这一选项并确认你的脚本仍能正常工作,以保证在将来版本的语言里< br /> ; 它们仍能工作.(你将在每次使用该特点时得到一个警告,而参数将按值而不是按引用< br /> ; 传递).< br /> ; Safe Mode 安全模式< br /> safe_mode = Off< br /> safe_mode_exec_dir =< br /> safe_mode_allowed_env_vars = PHP_< br /> ; ?Setting certain environment variables< br /> ; ?may be a potential security breach.< br /> ; 该指示包含用逗号分隔的前缀列表.安全模式中,用户仅可以替换< br /> ; 以在此列出的前缀开头的环境变量的值.< br /> ; 默认地,用户将仅能 设定以PHP_开头的环境变量,(如: PHP_FOO=BAR).< br /> ; 注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!< br /> safe_mode_protected_env_vars = LD_LIBRARY_PATH< br /> ; 这条指示包含一个用逗号分隔的环境变量列表,那是最终用户将不能用putenv () 更改的.< br /> ; 这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护.< br /> disable_functions =< br /> ; 这条指示让你可以为了安全的原因让特定函数失效.< br /> ; 它接受一个用逗号分隔的函数名列表.< br /> ; 这条指示 *不受* 安全模式是否打开的影响.< br /> ; 语法高亮模式的色彩.< br /> ; 只要能被&lt;font color=???&gt;接受的东西就能工作.< br /> highlight.string = #DD0000< br /> highlight.comment = #FF8000< br /> highlight.keyword = #007700< br /> highlight.bg = #FFFFFF< br /> highlight.default = #0000BB< br /> highlight.html = #000000< br /> ; Misc 杂项< br /> expose_php = Off< br /> ; 决定 PHP 是否标示它装在服务器上的事实(例如:加在它& mdash;PHP&mdash;给Web服务< br /> ; 发送的信号上).< br /> ; (我个人的意见,在出现什么power-by的header的时候,把这关掉.)< br /> ; 它不会有安全上的威胁, 但它使检查你的服务器上是否安装了PHP成为了可能.< br /> ;;;;;;;;;;;;;;;;;;;< br /> ; Resource Limits ;< br /> ;;;;;;;;;;;;;;;;;;;< br /> max_execution_time = 30 ; 每个脚本的最大执行时间, 按秒计< br /> memory_limit = 8388608 ; 一个脚本最大可使用的内存总量 (这里是8MB)< br /> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;< br /> ; Error handling and logging ;< br/> ; 出错控制和登记 ;< br /> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;< br /> ; 错误报告是按位的.或者将数字加起来得到想要的错误报告等级.< br /> ; E_ALL - 所有的错误和警告< br /> ; E_ERROR - 致命性运行时错< br /> ; E_WARNING - 运行时警告(非致命性错)&nbsp;& nbsp;<br /> ; E_PARSE - 编译时解析错误< br /> ; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的,< br /> ;也可能是有意的行为造成的.(如:基于未初始化的变量自动初始化为一个< br /> ;空字符串的事实而使用一个未初始化的变量)< br /> ; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误< br /> ; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)< br /> ; E_COMPILE_ERROR - 编译时致命性错< br /> ; E_COMPILE_WARNING - 编译时警告(非致命性错)< br /> ; E_USER_ERROR - 用户产生的出错消息< br /> ; E_USER_WARNING - 用户产生的警告消息< br /> ; E_USER_NOTICE - 用户产生的提醒消息< br /> ; 例子:< br /> ; error_reporting = E_ALL& amp; ~E_NOTICE ; 显示所有的错误,除了提醒< br /> ; error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显示错误< br /> error_reporting = E_ALL& amp; ~E_NOTICE ; 显示所有的错误,除了提醒< br /> display_errors = On ; 显示出错误信息(作为输出的一部分)</p>< p>[NextPae]; 在最终发布的web站点上,强烈建议你关掉这个特性,并使用< br /> ; 错误日志代替(参看下面).< br /> ; 在最终发布的web站点继续让 display_errors 有效可能< br /> ; 暴露一些有关安全的信息,例如你的web服务上的文件路径、< br /> ; 你的数据库规划或别的信息.< br /> display_startup_errors = Off ; 甚至当display_erroes打开了,发生于PHP的启动的步骤中< br /> ; 的错误也不会被显示.< br /> ; 强烈建议保持使 display_startup_errors 关闭,< br /> ; 除了在改错过程中.< br /> log_errors = Off ; 在日志文件里记录错误(服务器指定的日志,stderr标准错误输出,或error_log(下面的))< br /> ; 正如上面说明的那样,强烈建议你在最终发布的web站点以日志记录错误< br /> ; 取代直接错误输出.< br /> track_errors = Off ; 保存最近一个 错误/警告 消息于变量 $php_errormsg (boolean)< br /> ;error_prepend_string =& quot;&lt;font color=ff0000&gt;&quot; ; 于错误信息前输出的字符串&nbsp;& nbsp;<br /> ;error_append_string =& quot;&lt;/font&gt;&quot; ; 于错误信息后输出的字符串< br /> ;error_log = filename ; 记录错误日志于指定文件< br /> ;error_log = syslog ; 记录错误日志于系统日志 syslog (NT 下的事件日志, Windows 95下无效)< br /> warn_plus_overloading = Off ; 当将&lsquo;+&rsquo;用于字符串时警告< br /> ;;;;;;;;;;;;;;;;;< br /> ; Data Handling ;< br /> ;;;;;;;;;;;;;;;;;< br /> variables_order =& quot;EGPhttp://www.downcc.com/tech/686.html.Net编程2010/01/10 18:55:45<p>学习目的:学会SESSION和COOKIE的使用</p>< p>在各个网页间的变量传递和一些记录用户的登陆信息要用到SESSION和COOKIE。在ASP.NET中使用COOKIE比ASP中稍微麻烦一点,因为我们要申明变量。</p>< p>首先看一下SESSION的使用,基本和ASP差不多<br /> 写入一个SESSION:</p>< p>Session[&quot;username&quot;])=&quot;aa&quot;;</p>< p>---------------------<br /> Session(&quot;username&quot;)=&quot;aa&quot;</p>< p>读取一个SESSINN:</p>< p>string username= Session[&quot;username&quot;];</p>< p>-------------------------</p>< p>dim username=Session(&quot;username&quot;)</p>< p>再来看一下COOKIE的写入:< br /> DateTime dt=DateTime.Now; //需要&lt;%@Import Namespace=&quot;System&quot;%&gt;,得到当前时间<br /> HttpCookie mycookie=new HttpCookie(&quot;logname&quot;);//申明新的COOKIE变量<br /> mycookie.Value=&quot;aa&quot;;//赋值<br /> mycookie.Expires=Convert.ToDateTime(dt+TimeSpan.FromDays(1));//设定过期时间为1天<br /> Response.Cookies.Add(mycookie1);//写入COOKIE</p>< p>-------------------------------</p>< p>dim dt as DateTime<br /> dt=DataTime.Now<br /> dim mycookie as HttpCookie<br /> mycookie=new HttpCookie(&quot;logname&quot;)<br /> mycookie.Value=&quot;aa&quot;<br /> mycookie.Expires=Convert.ToDateTime(dt+TimeSpan.FromDays(1))<br /> Response.Cookies.Add(mycookie1)</p>< p>看一下COOKIE的读取:</p>< p>HttpCookie mycookie=Request.Cookies[&quot;username&quot;];< br /> string username=mycookie.Value;</p>< p>-----------------------<br /> dim mycookie as HttpCookie< br /> mycookie=Request.Cookies[&quot;username&quot;]<br /> dim string=mycookie.Value</p>< p>到此《十天学会ASP.NET》结束了,时间仓促,还请大家原谅写的不全,实际上我只是带大家入门,学会还要靠自己啊。</p>http://www.downcc.com/tech/685.html.Net编程2010/01/10 18:54:25<p>学习目的:学会用DATAGRID分页显示</p>< p>虽然说DATAGRID的分页显示效率不怎么高,但是不管怎么说,它是最方便的分页显示,对于做一个留言簿还是相当简单实用的。对于启用分页功能还有一个重要要求,只能在DATADRID控件的数据源实现了ICOLLECTION接口的情况下才能启用分页功能,而DATAREADER没有这个接口,所以必须使用DATATABLE来代替。</p>< p>&lt;script runat=&quot;server&quot; language=&quot;c#&quot;&gt;<br /> void Page_Load()<br /> {< br /> string strConnection=&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;;<br /> strConnection+=Server.MapPath(&quot;guestbook.mdb&quot;);<br /> OleDbConnection objConnection=new OleDbConnection(strConnection);<br /> OleDbDataAdapter objDataAdapter=new OleDbDataAdapter(&quot;select * from guestbook&quot;,objConnection);<br /> DataSet objDataSet=new DataSet();<br /> objDataAdapter.Fill(objDataSet);<br /> dgrdMain.DataSource=objDataSet;<br /> dgrdMain.DataBind();<br /> }<br /> void dgrdMain_PageIndexChanged(Object sender, DataGridPageChangedEventArgs e)<br /> {<br /> dgrdMain.CurrentPageIndex = e.NewPageIndex;< br /> DataBind();< br /> }< br />& lt;/script&gt;<br />& lt;html&gt;<br />& lt;body&gt;< br />& lt;asp:DataGrid< br /> id=&quot;dgrdMain&quot;< br /> cellpadding=&quot;1&quot;< br /> showheader=&quot;true&quot;< br /> borderwidth=&quot;0&quot;<br /> allowpaging=&quot;true&quot; 启用分页功能<br /> pagesize=&quot;3&quot; 每一页显示三条记录< br /> onpageindexchanged=&quot;dgrdMain_pageindexchanged& quot; 调用第&times;页的函数为dgrdMain_PageIndexChanged()<br /> runat=&quot;server&quot;< br /> /&gt;< br />& lt;/body&gt;<br />& lt;/html&gt;</p>< p>&lt;script runat=&quot;server&quot; language=&quot;vb&quot;&gt;<br /> subPage_Load<br /> dim objConnection as OleDbConnection<br /> dim objDataAdapter as OleDbDataAdapter<br /> dim objDataSet as DataSet<br /> objConnection=new OleDbConnection(&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;+Server.MapPath(&quot;guestbook.mdb&quot;))<br /> objDataAdapter=new OleDbDataAdapter(&quot;select * from guestbook&quot;,objConnection)<br /> objDataSet=new DataSet<br /> objDataAdapter.Fill(objDataSet)< br /> dgrdMain.DataSource=objDataSet<br /> dgrdMain.DataBind()<br /> end sub<br /> sub dgrdMain_PageIndexChanged(sender as object,e as datagridpagechangedeventargs)<br /> dgrdMain.CurrentPageIndex = e.NewPageIndex<br /> DataBind<br /> end sub<br />& lt;/script&gt;< br />& lt;html&gt;<br />& lt;body&gt;< br />& lt;asp:DataGrid< br /> id=&quot;dgrdMain&quot;< br /> cellpadding=&quot;1&quot;< br /> showheader=&quot;true&quot;< br /> borderwidth=&quot;0&quot;<br /> allowpaging=&quot;true&quot; 启用分页功能<br /> pagesize=&quot;3&quot; 每一页显示三条记录< br /> onpageindexchanged=&quot;dgrdMain_pageindexchanged& quot; 调用第&times;页的函数为dgrdMain_PageIndexChanged()<br /> runat=&quot;server&quot;< br /> /&gt;< br />& lt;/body&gt;<br />& lt;/html&gt;</p>< p>这样就是最简单的分页,我们可以用参数pagestyle-mode=&quot;nextprev/numericpages&quot;来设定是显示上一页、下一页方式还是直接选择页面的数字方式来实现页面跳转。如果是前者我们可以用pagestyle-nextpagetext来设定包含下一页链接的文本,用pagestyle-prevpagetext来设定包含上一页链接的文本;如果是后者我们可以用PagerStyle-PageButtonCount来设定在使用省略号之前显示的页面编号数量(默认是10)</p>< p>今天就说到这里,明天说一下SESSION和COOKIE。</p>http://www.downcc.com/tech/684.html.Net编程2010/01/10 18:50:56<p>学习目的:初步掌握DATAGRID的使用</p>< p>以前在ASP中,我们显示大批量数据经常使用循环读取记录集的方式,在表格中插入代码来显示,循环的是&lt;tr&gt;,如果是分页还需要自己制作,如果排序更加复杂,在ASP.NET中就好了,一切工作都可以让DATAGRID来做。</p>< p>首先看一下DATAGRID的样式方面的属性<br /> BackImageUrl=&quot;&quot; 背景图片<br /> CellSpacing=&quot;&quot; 单元格间距<br /> CellPadding=&quot;&quot; 单元格填充<br /> cssClass=&quot;&quot; 使用的CSS样式</p>< p>DATAGRID可以自动用表中的字段名放在显示的记录的头部来表示各个单元格所代表的意义,用ShowHeader=&quot;true/false&quot;来控制是不是显示,在大多数情况下我们是不需要这个功能的,因为我们数据库中的字段名大多是英文的,而我们想在页面输出的大多是中文名字。</p>< p>下面看一下显示数据库内所有记录,就几行代码:</p>< p>&lt;script runat=&quot;server&quot; language=&quot;c#&quot;&gt;<br /> void Page_Load()<br /> {<br /> string strConnection=&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;;<br /> strConnection+=Server.MapPath(&quot;guestbook.mdb&quot;);<br /> OleDbConnection objConnection=new OleDbConnection(strConnection);<br /> OleDbCommand objCommand1 = new OleDbCommand(&quot;select * from guestbook&quot;,objConnection);<br /> objConnection.Open();<br /> dgrdMain.DataSource=objCommand1.ExecuteReader();//dgrdMain就是下面的DATAGRID的ID<br /> dgrdMain.DataBind();<br /> objConnection.Close();<br /> }<br />& lt;/script&gt;<br />& lt;html&gt;<br />& lt;body&gt;< br />& lt;asp:DataGrid< br /> id=&quot;dgrdMain&quot;< br /> cellpadding=&quot;1&quot;< br /> showheader=&quot;true&quot;< br /> borderwidth=&quot;0&quot;<br />& nbsp;</p>< p>runat=&quot;server&quot;< br /> /&gt;< br />& lt;/body&gt;<br />& lt;/html&gt;</p>< p>至于VB的版本,这次大家自己来试试吧:)</p>< p>假设数据库是三个字段:id,aa,bb<br /> 显示的样子就如下:<br />< table height="65" cellspacing="1" cellpadding="0" width="174" align="center" border="1">< tbody>< tr>< td>id</td>< td>aa</td>< td>bb</td>< /tr>< tr>< td>1</td>< td>werwe</td>< td>rewrwe</td>< /tr>< tr>< td>2</td>< td>werwe</td>< td>rewrwe</td>< /tr>< /tbody>< /table>< /p>< p>我们一定觉得这种显示不满意,我们有两种显示的方式(需要包括在&lt;columns&gt;&lt;/columns&gt;中间):</p>< p>一、默认的列,我们可以选择不输出所有的字段还可以安排顺序:</p>< p>&lt;asp:BoundColumn DataField=&quot;想要显示的字段名&quot;&gt;<br /> 比如说我们想按照bb,aa来输出这个表,我们这么写</p>< p>&lt;asp:DataGrid< br /> id=&quot;dgrdMain&quot;< br /> cellpadding=&quot;1&quot;< br /> showheader=&quot;true&quot;< br /> autogeneratecolumns=&quot;false&quot;<br /> borderwidth=&quot;0&quot;<br /> runat=&quot;server&quot;&gt;<br />& lt;columns&gt;<br />& lt;asp:boundcolumn datafield=&quot;bb&quot;/&gt;<br />& lt;asp:boundcolumn datafield=&quot;bb&quot;/&gt;<br />& lt;/columns&gt;<br />& lt;/asp:datagrid&gt;</p>< p>注意:使用了autogeneratecolumns=&quot;false&quot;以后DATAGRID就不会自动输出所有字段了</p>< p>二、以模板列,我们可以定制每一个单元格的样式:</p>< p>&lt;asp:TemplateColumn&gt;<br />& lt;itemTemplate&gt;<br /> 中间是一个表格,想怎么样就怎么样<br />& lt;/itemTemplate&gt;<br />& lt;/asp:DataGrid&gt;< br /> 或许你们要说怎么在表格中输出代码那,可以使用&lt;%# DataBinder.Eval(Container.DataItem,&quot;字段名&quot;).ToString()%&gt;<br /> 下面看一个例子,我们所要做的就是把aa,bb两个字段放在一个单元格内显示,就好像下面一样:</p>< p>< table height="65" cellspacing="1" cellpadding="0" width="89" align="center" border="1">< tbody>< tr>< td>1</td>< td>werwe<br /> rewrwe</td>< /tr>< tr>< td>2</td>< td>werwe<br /> rewrwe</td>< /tr>< /tbody>< /table>< /p>< p>我们这样写代码:< br />& lt;asp:DataGrid< br /> id=&quot;dgrdMain&quot;< br /> cellpadding=&quot;1&quot;< br /> showheader=&quot;false&quot;< br /> autogeneratecolumns=&quot;false&quot;<br /> borderwidth=&quot;0&quot;<br /> runat=&quot;server&quot;&gt;<br />& lt;columns&gt;<br />& lt;asp:boundcolumn datafield=&quot;ii&quot;/&gt; 首先使用默认的显示方式显示ID<br />& lt;asp:TemplateColumn&gt; 再使用模板来显示后面一列(由AA,BB并列组成)<br />& lt;itemTemplate&gt;<br />& lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;<br />& lt;tr&gt;<br />& lt;td&gt;&lt;%# Container.DataItem(&quot;aa&quot;)%&gt;&lt;/td&gt;<br />& lt;/tr&gt;<br />& lt;tr&gt;<br />& lt;td&gt;&lt;%# Container.DataItem(&quot;bb&quot;)%&gt;&lt;/td&gt;<br />& lt;/tr&gt;<br />& lt;/table&gt;< br />& lt;/itemTemplate&gt;<br />& lt;/asp:DataGrid&gt;< br />& lt;/columns&gt;<br />& lt;/asp:datagrid&gt;</p>< p>今天就说到这里,明天我们来看一下DATAGRID的分页显示等功</p>http://www.downcc.com/tech/683.html.Net编程2010/01/10 18:49:46<p>学习目的:学会添加删除修改记录</p>< p>以前我们在ASP中不管是添加还是删除记录或者用SQL语句加上EXECUTE()或者就是直接用RECORDSET的NEW、DELETE、UPDATE等方法来添加删除修改记录。在ASP.NET里面我们采用SQL语句加上COMMAND对象来执行SQL语句的方法来添加删除修改记录。这比上次说的读取记录还简单。实际上只有一点区别,把ExecuteReader()修改为ExecuteNonQuery()即可,因为我们不需要返回值啊。<br /> string strConnection=&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;;<br /> strConnection+=Server.MapPath(strDb);<br /> OleDbConnection objConnection=new OleDbConnection(strConnection);<br /> OleDbCommand objCommand = new OleDbCommand(&quot;这里是SQL语句&quot; , objConnection);< br /> objConnection.Open();<br /> OleDbDataReader objDataReader=objCommand.ExecuteNonQuery();</p>< p>-----------------------<br /> dim objConnection as OleDbConnection<br /> dim objCommand as OleDbCommand<br /> objConnection=new OleDbConnection(Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;+Server.MapPath(strDb))<br /> objCommand=new OleDbCommand(&quot;这里是SQL语句&quot; , objConnection)< br /> objConnection.Open()<br /> objDataReader=objCommand.ExecuteNoQuery()</p>< p>下面再举例子说明一下SQL语句(ACCESS):</p>< p>添加记录: insert int< br /> o 表名 (字段1,字段2) values (字符串1,字符串2) where 条件<br /> 删除记录: delete from 表名 where 条件<br /> 修改记录: update 表名 set字段1=&times;&times;,字段2=&times;&times; where 条件</p>< p>需要特别注意,如果是Sql Server删除记录是delete 表名,不需要再加from了。</p>< p>今天就说到这里了,明天说ASP.NET里面最著名的DATAGRID。</p>http://www.downcc.com/tech/682.html.Net编程2010/01/10 18:48:48<p>学习目的:学会读取数据库</p>< p>有的网友说,不会C#,在ASP.NET里面还是选择VB.NET,这个我不反对,但是我觉得既然是学习新的东西,就不要在意有多少是新的。实际上C#就一般的操作来说,只是区分大小写和多了一个分号这两点与VB.NET不同其他都差不多啊。在ASP里面我们读取数据就直接用RECORDSET,然后在HTML代码里面穿插&lt;%= %&gt;就可以显示了,但是ASP.NET讲究的是代码分离,如果还是这样显示数据就不能代码分离了。所以我们有两种方法:如果是读取一条记录的数据或者不多的数据,我们用DATAREADER采集数据,然后赋值给LABEL控件的Text属性即可;如果是读取大量数据我们就采用DATAGRID。</p>< p>今天我们就来说一下DATAREADER:</p>< p>string strConnection=&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;;<br /> strConnection+=Server.MapPath(strDb);<br /> OleDbConnection objConnection=new OleDbConnection(strConnection);<br /> OleDbCommand objCommand = new OleDbCommand(&quot;这里是SQL语句&quot; , objConnection);< br /> objConnection.Open();<br /> OleDbDataReader objDataReader=objCommand.ExecuteReader();<br /> if(objDataReader.Read())<br /> {<br /> oicq.Text=Convert.ToString(objDataReader[&quot;useroicq&quot;]);<br /> homesite.Text=Convert.ToString(objDataReader[&quot;usersite&quot;]);<br /> face.SelectedItem.Text=Convert.ToString(objDataReader[&quot;userface&quot;]);<br /> }</p>< p>大家可以看到我们首先是连接数据库然后打开,对于select的命令,我们申明一个OleDbCommand来执行之,然后再申明一个OleDbDataReader,来读取数据,用的是ExecuteReader(),objDataReader.Read()就开始读取了,在输出的时候我们要注意Text属性接受的只能是字符串,所以我们要把读出的数据都转化为字符串才行。<br />& nbsp;</p>< p>转换变量类型函数:</p>< p>转换为字符串:Convert.ToString()<br /> 转换为数字:Convert.ToInt64(),Convert.ToInt32(),Convert.ToInt16() 是按照数字位数由长到短<br /> 转换为日期:Convert.ToDateTime()</p>< p>------------------</p>< p>dim objConnection as OleDbConnection<br /> dim objCommand as OleDbCommand<br /> dim objDataReader as OleDbDataReader<br /> objConnection=new OleDbConnection(Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;+Server.MapPath(strDb))<br /> objCommand=new OleDbCommand(&quot;这里是SQL语句&quot; , objConnection)< br /> objConnection.Open()<br /> objDataReader=objCommand.ExecuteReader()<br /> if objDataReader.Read()<br /> oicq.Text=Convert.ToString(objDataReader[&quot;useroicq&quot;])<br /> homesite.Text=Convert.ToString(objDataReader[&quot;usersite&quot;])<br /> face.SelectedItem.Text=Convert.ToString(objDataReader[&quot;userface&quot;])<br /> end if</p>< p>其实大家比较一下C#和VB的语法,会发觉用C#似乎更加简单,教程里面我侧重C#,对于VB的代码我就不解释了。</p>< p>下面说一下如果代码是读取SQL数据库,我们这样来转变</p>< p>1、把代码开始的<br />& lt;%@Import Namespace=&quot;System.Data&quot;%&gt;<br />& lt;%@Import Namespace=&quot;System.Data.OleDb&quot;%&gt;<br /> 修改为<br />& lt;%@Import Namespace=&quot;System.Data&quot;%&gt;<br />& lt;%@Import Namespace=&quot;System.Data.SqlClient&quot;%&gt;</p>< p>2、把代码里面所有申明的对象OleDb&times;&times;变为Sql&times;&times;就这么简单<br /> 你甚至可以用替换所有来解决,所以今后我讲不再列出Sql Server的代码了。</p>< p>今天就说到这里,明天开始说数据的添加、删除、修改。</p>http://www.downcc.com/tech/681.html.Net编程2010/01/10 18:47:09<p>学习目的:学会连接两种数据库</p>< p>对于ASP来说,我们常用的数据库无非是ACCESS和SQL SERVER,对于ASP.NET也是,不过ASP.NET对于SQL SERVER有专门的连接组件而不推荐用OLE DB。</p>< p>首先看一下ACCESS的连接数据库并打开;</p>< p>string strConnection=&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;;<br /> strConnection+=Server.MapPath(&quot;*.mdb&quot;); //*就是数据库的名字<br /> OleDbConnection objConnection=new OleDbConnection(strConnection);<br /> objConnection.Open();< br /> --------<br /> dim objConnection as OleDbConnection<br /> objConnection=new OleDbConnection(&quot;Provider=Microsoft.Jet.OleDb.4.0;Data Source=&quot;+Server.MapPath(&quot;*.mdb&quot;))< br /> objConnection.Open()</p>< p>下面再看一下SQL SERVER的连接数据库并打开;</p>< p>stringstrConnection=&quot;server=数据库连接;uid=用户名;pwd=密码;database=数据库名字&quot;;<br /> SqlConnediob objConnection=new SqlCOnnection(strConnection);<br /> objConnection.Open();<br /> -----------<br /> dim objConnection as SqlConnectiom&lt; br&gt; objConnection=newSqlConnection(&quot;server=数据库连接;uid=用户名;pwd=密码;database=数据库名字&quot;)< br /> objConnection.Open()</p>< p>实际上,在大多数地方SQL SERVER和ACCESS的区别除了连接语句,其他定义语句也就是SQL&times;&times;和OLEDB&times;&times;的区别</p>< p>另外,如果是ACCESS数据库的话在ASPX文件的开头需要包括下列语句:</p>< p>&lt;%@Import Namespace=&quot;System.Data&quot;%&gt;<br />& lt;%@Import Namespace=&quot;System.Data.OleDb&quot;%&gt;<br /> 如果是SQL SERVER则需要包括以下语句:<br />& lt;%@Import Namespace=&quot;System.Data&quot;%&gt;<br />& lt;%@Import Namespace=&quot;System.Data.SqlClient&quot;%&gt;</p>< p>今天就说到这里,明天开始讲数据库的读取。</p>http://www.downcc.com/tech/680.html.Net编程2010/01/10 18:44:47<p>学习目的:掌握WEB控件的使用(二)</p>< p>首先我要说明,我这十天教程也只是一个让大家对ASP.NET有一个认识而已,我也跳过了很多东西。网上有很多人在责骂我写的教程,认为十天什么都学不会,看了我的教程还是什么都不会,我想他们或许是过高估计了我的教程。外面有很多书,关于ASP和ASP.NET的,我就是看外面的书学会的。我所要做的就是希望大家能看了我的教程以后觉得ASP和ASP.NET不是学不会的东西然后有信心去学会它。我想学习还是靠自己的,外面每一本书也有自己写的不周到的地方,关键还需要自己的实践加上探索。</p>< p>首先来说一下表单的验证控件,以前我们做表单验证,如果是客户端的JAVASCRIPT,不能做到美观统一,而且还可以通过直接在浏览器起教表单来屏蔽;如果我们做服务器端验证,又会发现让检验结果在前台反映也是很麻烦的事情。现在好了,ASP.NET提供的很多检验控件让我们不需要考虑是客户端检验还是服务器端检验,让我们不需要考虑是怎么输出检验结果。</p>< p>看一下检验表单控件是不是填写了的检验控件先:<br />& lt;asp:textbox id=&quot;username&quot; runat=&quot;server&quot; cssclass=&quot;textbox&quot;/&gt;< br />& lt;asp:requiredfieldvalidator controltovalidate=&quot;username&quot; display=&quot;dynamic&quot; forecolor=&quot;#ff0000&quot; font-name=&quot;宋体&quot; font-size=&quot;9pt&quot; text=&quot;请填写&quot; runat=&quot;server&quot;/&gt;< br /> controltovalidate就是你想检验的控件的ID;默认情况下不显示错误消息,地方也会被保留,如果使用了display=&quot;dynamic&quot; 那么不显示错误消息的地方不会被空出; forecolor=&quot;#ff0000&quot; font-name=&quot;宋体&quot; font-size=&quot;9pt&quot; 就是设定错误消息字体的颜色,字体,大小的;text=&quot;请填写&quot; 就是当没有填写内容时候显示的错误消息;别忘记最后的runat=&quot;server&quot;。现在这个检验控件是放在了textbox的后面,那么错误消息也在textbox后面显示,也可以放在其他地方。</p>< p>再看一下比较表单控件的数据与另外一个数据的检验控件:<br />& lt;asp:textbox id=&quot;password1&quot; runat=&quot;server&quot; textmode=&quot;password&quot; cssclass=&quot;textbox&quot;/&gt;</p>< p>&lt;asp:requiredfieldvalidator controltovalidate=&quot;password1&quot; display=&quot;dynamic&quot; forecolor=&quot;#ff0000&quot; font-name=&quot;宋体&quot; font-size=&quot;9pt&quot; text=&quot;请填写&quot; runat=&quot;server&quot;/&gt;< br /> 这里是第一个需要用户填写的密码框<br /> 我们经常会再设立一个密码框让用户再填写一次:<br />& lt;asp:textbox id=&quot;password2&quot; runat=&quot;server&quot; textmode=&quot;password&quot; cssclass=&quot;textbox&quot;/&gt;< br />& lt;asp:requiredfieldvalidator controltovalidate=&quot;password2&quot; display=&quot;dynamic&quot; forecolor=&quot;#ff0000&quot; font-name=&quot;宋体&quot; font-size=&quot;9pt&quot; text=&quot;请填写&quot; runat=&quot;server&quot;/&gt;< br />& lt;asp:comparevalidator controltovalidate=&quot;password2&quot; controltocompare=&quot;password1&quot; display=&quot;dynamic&quot; operator=&quot;equal&quot; forecolor=&quot;#ff0000&quot; font-name=&quot;宋体&quot; font-size=&quot;9pt&quot; text=&quot;确认失败&quot; runat=&quot;server&quot;/&gt;< br /> controltocompare=&quot;password1&quot; 就是需要比较的控件;operator=&quot;equal&quot; 就是设定比较操作是:是否相等(还有NotEqual:不相等,LessThan:少于,GreaterThan:大于,当不符合这个比较操作的时候显示错误消息)。</p>< p>以前说到BUTTON控件CausesValidation=true/false来设置按钮提交的表单是不是被检验也就是这里的几个检验控件,如果CausesValidation=true的话按下按钮就会首先检测是不是都通过了检验控件的检验。</p>< p>下面再说两点:</p>< p>一、每一个可以显示的控件都有是不是显示的属性,比如username.Visible=false;就是隐藏了前面的username控件;还有就是如果要对控件应用CSS的话就这么写:cssclass=&quot;&quot;,而不是以前HTML中的class=&quot;&quot;。</p>< p>二、所有WEB控件都要包含在&lt;form runat=&quot;server&quot;&gt;&lt;/form&gt;中,否则就会出错。</p>< p>今天就到此结束,请继续往后面看,下次开始就要说ADO.NET了。</p>http://www.downcc.com/tech/679.html.Net编程2010/01/10 18:41:00<p>或许你会问,为什么需要WEB控件?WEB控间就好像VB里面的控间,可以在程序的任何地方引用,修改所有属性,有了它的配合才能完成代码分离。想一下,如果还是以前的HTML控间,我们当我们需要在某一个地方显示一段数据库的内容是不是只有用&lt;%= %&gt;这样势必在HTML包含了程序的代码块,就达不到分离代码和界面的目的了。</p>< p>或许你还会问,为什么要代码分离那?原因很简单,不是每一个程序员都是合格的网页设计师,如果我们需要修改代码的时候会破坏网页设计师原来的设定,是不是不方便那,程序代码和HTML代码混合在一起对于程序员来说也不方便修改代码。当然,我们的网页设计师也需要学习一点WEB控间的知识。</p>< p>下面来一个一个介绍:</p>< p>一、Label控件:</p>< p>主要属性:</p>< p>Text 标签所显示的文本<br /> 范例:&lt;asp:Label id=&quot;lblMessage&quot; Text=&quot;aaa&quot; runat=&quot;server&quot;/&gt;<br /> 需要注意的是我们不能遗漏runat=&quot;server&quot;字样,还有所有的WEB控件都要包含在&lt;form runat=&quot;server&quot;&gt;&lt;/form&gt;中间<br /> 下面看一个完整的例子,在程序里面修改Label的Text属性,以此改变网页的显示。</p>< p>&lt;script runat=&quot;server&quot; language=&quot;c#&quot;&gt;<br /> void Page_Load()<br /> {<br /> lblMessage.Text=&quot;Hello World!&quot;;<br /> }<br />& lt;/script&gt;<br />& lt;html&gt;<br />& lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt;< br />& lt;body&gt;<br />& lt;form runat=&quot;server&quot;&gt;<br />& lt;asp:Label id=&quot;lblMessage&quot; runat=&quot;server&quot;/&gt;<br />& lt;/form&gt;<br />& lt;/body&gt;&lt;/html&gt;</p>< p>--------------</p>< p>&lt;script runat=&quot;server&quot; language=&quot;vb&quot;&gt;<br /> sub Page_Load<br /> lblMessage.Text=&quot;Hello World!&quot;<br /> end sub<br />& lt;/script&gt;<br />& lt;html&gt;<br />& lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt;< br />& lt;body&gt;<br />& lt;form runat=&quot;server&quot;&gt;<br />& lt;asp:Label id=&quot;lblMessage&quot; runat=&quot;server&quot;/&gt;<br />& lt;/form&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< p>二、TextBox控件:</p>< p>主要属性:</p>< p>Text 控件显示的文本;<br /> MaxLength 文本框可以添加的最多的字符数(多行文本框无效);<br /> ReadOnly 只读;<br /> TextMode 有下面几个有效值 MultiLine,Password,SingleLine;<br /> Rows 指定文本框的垂直尺寸</p>< p>三、Button控件:</p>< p>有三种:Button 标准的表单按钮;ImageButton 显示图像的表单按钮;LinkButton 显示作为超链接样子Button<br /> Button基本上就是Text属性来设置按钮上面的文字;<br /> ImageButton基本上就是ImageUrl来设置按钮上图象的地址;AlternativeText 在浏览器不支持图片的时候显示的文字;<br /> LinkButton基本上就是Text属性来设置按钮上的文字;</p>< p>他们三者共同的属性就是CausesValidation=true/false来设置按钮提交的表单是不是被检验(后面将说到检验控件)<br /> 他们三者共同的方法就是OnClick就是点击按钮的时候触发的函数,下面举一个例子:</p>< p>&lt;script runat=&quot;server&quot; language=&quot;c#&quot;&gt;<br /> void btnCounter_OnClick(object sender,EventArgs e)<br /> {<br /> btnCounter.Text=&quot;Clicked&quot;;<br /> }< br />& lt;/script&gt;<br />& lt;html&gt;<br />& lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt;< br />& lt;body&gt;<br />& lt;form runat=&quot;server&quot;&gt;<br />& lt;asp:Button Text=&quot;UnClicked&quot; OnClick=&quot;btnCounter_OnClick&quot; id=&quot;btnCounter&quot; runat=&quot;server&quot;/&gt;<br />& lt;/form&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< p>---------------------<br />& lt;script runat=&quot;server&quot; language=&quot;vb&quot;&gt;<br /> sub btn_COunter_OnClick(s as object,e as eventargs)<br /> btnCounter.Text=&quot;Clicked&quot;< br /> end sub<br />& lt;/script&gt;<br />& lt;html&gt;<br />& lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt;< br />& lt;body&gt;<br />& lt;form runat=&quot;server&quot;&gt;<br />& lt;asp:Button Text=&quot;UnClicked&quot; OnClick=&quot;btnCounter_OnClick&quot; id=&quot;btnCounter&quot; runat=&quot;server&quot;/&gt;<br />& lt;/form&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< p>今天就说这三个控件,明天继续。</p>http://www.downcc.com/tech/678.html.Net编程2010/01/10 18:39:03<p>一、定义变量:</p>< p>string strExample; 字符串(&quot;aaa&quot;)<br /> char chrExample; 字符('a')<br /> bool blnExample; Bool型(true/false)<br /> DataTime datExample; 日期型(&quot;09/19/2002&quot;)<br /> int intExample; 整数(32位有符号整数)<br /> double dblExample; 浮点数(64位双精度浮点数)</p>< p>二、各种运算:</p>< p>= 赋值运算< br /> + 加法运算<br /> - 减法运算<br /> * 乘法运算<br /> / 除法运算<br /> % 取模运算<br />& amp;&amp; 逻辑And<br /> || 逻辑Or<br /> ! 逻辑Not</p>< p>三、各种结构:</p>< p>if(条件)<br /> {<br /> }<br />& nbsp;</p>< p>else<br /> {<br /> }</p>< p>switch(条件)<br /> {<br /> case option1:<br /> break;<br /> case option2:<br /> break;<br /> }</p>< p>for(inti=1;i&lt;=10;i++)//特别注意这里面是分号<br /> {<br /> }</p>< p>while(条件)<br /> {<br /> }</p>< p>do<br /> {<br /> }while(条件);</p>< p>四、注意事项:</p>< p>1、用习惯VB的人很容易漏了语句末尾的分号;<br /> 2、用习惯VB的人很随便使用变量但是不申明,这在C#默认情况下是不允许的;<br /> 3、在向函数传递参数的时候要用圆括号:Response.Write& quot;aa&quot;;是不允许的。</p>< p>我说的这点几乎称不上是在说一种语言,一种语言的学习不仅仅需要学习语法,还需要学习语言特色,希望大家有空还是买一本C#的书来好好研究一下C#作为一种新的语言的特性吧。今天就说到这里,明天说一下WEB控件。</p>http://www.downcc.com/tech/677.html.Net编程2010/01/10 18:34:04<p>我认为ASP.NET比ASP难很多,希望大家做好准备。难难在实现同一个效果有很多方法,大家或许会疑惑。十天学会系列教程会清晰的写出各种方法,让大家能少一点坎坷。在ASP里面,大家几乎都是使用VB,数据库嘛,也无非是SQL和ACCESS。</p>< p>在ASP.NET里面,数据库还是这两个但是常用的语言多了一个C#,也是微软推荐的语言,为.NET平台定制的语言。这样ASP.NET就有四种组合:VB+ACCESS,VB+SQL,C#+ACCESS,C#+SQL,本教程会使用C#+ACCESS,兼顾四种来写,让大家对ASP.NET有一个全面的认识。</p>< p>虽然说学习ASP.NET不需要任何ASP基础,但是我觉得如果大家ASP不会,还是先看一下【十天学会ASP教程】,大家所需要了解的不是ASP的程序怎么写,而是怎么构建服务器,怎么使用HTML表单,同时对SQL语句有一个基础和理解,因为在本文里我不会将将一些基础的东西。</p>< p>废话不多说,开始我们第一天的学习:</p>< p>学习目的:调试出安装环境</p>< p>我要申明一点,操作系统就用2000,如果说要学习一个网络语言还不肯多装一个操作系统的话,那我看也不要学习了。</p>< p>先到网上下载一个MDAC(要是2.7以上的版本才行),然后安装,安装以后或许会重新启动一次。</p>< p>然后再下载一个.NET FRAMEWORK SDK,安装以后会在控制面板里面的管理工具里面多两个东西,这个不用理睬他,我们要使用的还是原来的INTERNET服务管理器。打开它按照ASP教程里面的调试方法建立一个目录,建立一个EXAMPLE1.ASPX,然后用记事本打开这个文件在里面输入</p>< p>&lt;script language=&quot;c#&quot; runat=&quot;server&quot;&gt;<br /> void Page_Load()<br /> {<br /> Response.Write(&quot;Hello World!&quot;);<br /> }<br />& lt;/script&gt;</p>< p>-------------------</p>< p>&lt;script language=&quot;vb&quot; runat=&quot;server&quot;&gt;<br /> sub page_load()<br /> response.write(&quot;Hello World!&quot;)<br /> end sub<br />& lt;/script&gt;</p>< p>然后用本地访问,查看结果:</p>< p>在这里我要说明两点:1、我的示例文件总是有A和B分别是用C#和VB写的,演示的图片就用C#那一种的,都一样嘛,教程里面代码也是写两种用&lt;hr&gt;分割开,大家可以比较一下。2、我写教程的时候用的都是记事本来编写APS.NET大家也可以安装VS.NET来编写不过起步还是用记事本比较好,因为可以看的更加透彻一点。</p>< p>今天就说到这里,明天说一下C#的基本语法。</p>http://www.downcc.com/tech/676.htmlAsp编程2010/01/10 18:31:55<p>由于工作需要,又不愿意又将excel转换成其它数据库,所以想直接使用ASP连接Excel文件,发现还真行,代码如下:</p>< p>其中:list.xls为excel数据库名字,Sheet1为工作表名。</p>< p>&lt;%<br />& nbsp;&nbsp;&nbsp; Dim conn<br />& nbsp;&nbsp;&nbsp; Dim StrConn<br />& nbsp;&nbsp;&nbsp; Dim rs<br />& nbsp;&nbsp;&nbsp; Dim Sql<br />& nbsp;&nbsp;&nbsp; Set conn=Server.CreateObject(&quot;ADODB.Connection&quot;)< br />& nbsp;&nbsp;&nbsp; StrConn=&quot;Driver={Microsoft Excel Driver (*.xls)};DBQ=&quot;&amp; Server.MapPath(&quot;list.xls&quot;)<br />& nbsp;&nbsp;&nbsp; conn.Open StrConn<br />& nbsp;&nbsp;&nbsp; Set rs = Server.CreateObject(&quot;ADODB.Recordset&quot;)< br />& nbsp;&nbsp;&nbsp; Sql=&quot;select * from [Sheet1$]&quot;<br />& nbsp;&nbsp;&nbsp; rs.Open Sql,conn,2,2< br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;center&gt;<br />& nbsp;&nbsp;&nbsp;& lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;<br />& nbsp;&nbsp;&nbsp;& lt;tr&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; for i=0 to rs.Fields.Count-1<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td width=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td height=&quot;28&quot; bgcolor=&quot;#0099FF&quot;&gt;&lt;div align=&quot;center&quot;&gt;&lt;%=rs(i).Name%&gt;&lt;/div&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; next<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td width=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;/tr&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; do while Not rs.EOF<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;tr&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; for i=0 to rs.Fields.Count-1<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td width=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td height=&quot;28&quot; valign=&quot;bottom&quot;&gt;&lt;%=rs(i)%&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; next<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td width=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;/tr&gt;<br />& nbsp;&nbsp;&nbsp;& lt;tr&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%< br />& nbsp;&nbsp;&nbsp; for i=0 to rs.Fields.Count-1<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td height=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td height=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; next<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;td width=&quot;1&quot; bgcolor=&quot;#CCCCCC&quot;&gt;&lt;/td&gt;<br />& nbsp;&nbsp;&nbsp;& lt;/tr&gt;<br />& nbsp;&nbsp;&nbsp;& lt;%<br />& nbsp;&nbsp;&nbsp; rs.MoveNext<br />& nbsp;&nbsp;&nbsp; Loop<br />& nbsp;&nbsp;&nbsp; rs.close<br />& nbsp;&nbsp;&nbsp; set rs=nothing<br />& nbsp;&nbsp;&nbsp; Conn.close<br />& nbsp;&nbsp;&nbsp; set StrConn=nothing<br />& nbsp;&nbsp;&nbsp; %&gt;<br />& nbsp;&nbsp;&nbsp;& lt;/table&gt;<br />& nbsp;&nbsp;&nbsp;& lt;/center&gt;</p>http://www.downcc.com/tech/675.htmlAsp编程2010/01/10 18:29:48<p>在写ASP网页时常用的检测代码:</p>< p>服务器现在时间:< br />& nbsp;引用<br />& lt;% =now %&gt;</p>< p>服务器CPU型号:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;HTTP_UA_CPU&quot;)%&gt;</p>< p>当前分辨率:< br />& nbsp;引用<br />& lt;% =Request.ServerVariables(&quot;HTTP_UA_PIXELS&quot;)%&gt;</p>< p>可显示颜色:[qoute]&lt;%=Request.ServerVariables(&quot;HTTP_UA_COLOR&quot;)%&gt;[/quote]< br /> Server地址:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;SERVER_NAME&quot;)%&gt;</p>< p>服务器接受语言:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;HTTP_ACCEPT_LANGUAGE&quot;)%&gt;</p>< p>访问者I:P< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;REMOTE_ADDR&quot;)%&gt;</p>< p>访问者浏览器版本及系统:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;HTTP_USER_AGENT&quot;)%&gt;</p>< p>服务器可接受文件:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;HTTP_ACCEPT&quot;)%&gt;</p>< p>WEB服务器软件及版本信息:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;SERVER_SOFTWARE&quot;)%&gt;</p>< p>路由端口:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;REMOTE_PORT&quot;)%&gt;</p>< p>服务器http端口:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;LOCAL_PORT&quot;)%&gt;</p>< p>WEB目录名称:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;APPL_PHYSICAL_PATH&quot;)%&gt;</p>< p>当前WEB页位置:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;PATH_TRANSLATED&quot;)%&gt;</p>< p>请求方式:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;REQUEST_METHOD&quot;)%&gt;</p>< p>传输协议:< br />& nbsp;引用<br />& lt;%=Request.ServerVariables(&quot;SERVER_PROTOCOL&quot;)%&gt;</p>http://www.downcc.com/tech/674.htmlAsp编程2010/01/10 18:27:54<p>一、  < br />& lt;% Response.Buffer = True %&gt;< br />& lt;%< br /> ' Setup the variables necessary to accomplish the task< br /> Dim TimerStart, TimerEnd, TimerNow, TimerWait< br /> ' How many seconds do you want them to wait...< br /> TimerWait = 5< br /> ' Setup and start the timers< br /> TimerNow = Timer< br /> TimerStart = TimerNow< br /> TimerEnd = TimerStart + TimerWait< br /> ' Keep it in a loop for the desired length of time< br /> Do While (TimerNow& lt; TimerEnd)< br /> ' Determine the current and elapsed time< br /> TimerNow = Timer< br /> If (TimerNow& lt; TimerStart) Then< br /> TimerNow = TimerNow + 86400< br /> End If< br /> Loop< br /> ' Okay times up, lets git em outa here< br /> Response.Redirect& quot;nextpage.html&quot; %&gt;< br />< br /> 二、< br />< br />& lt;%< br /> Sub TimeDelaySeconds(DelaySeconds)< br /> SecCount = 0< br /> Sec2 = 0< br /> While SecCount& lt; DelaySeconds + 1< br /> Sec1 = Second(Time())< br /> If Sec1& lt;&gt; Sec2 Then< br /> Sec2 = Second(Time())< br /> SecCount = SecCount + 1< br /> End If< br /> Wend< br /> End Sub< br /> %&gt;< br />< br /> ' To change delay adjust here< br />& lt;% TimeDelaySeconds(2) %&gt;</p>http://www.downcc.com/tech/295.htmlPHP编程2009/09/14 11:55:39<p>本文主要介绍如何用php程序实现将远程网络文件下载到自己的主机(服务器、虚拟主机)上,当然也提供asp、asp.net的源码给大家参考.</p>< p>最近让 Lc. 下载《汪洋中的一条船》这部感人的励志电视剧,为了分享方便,于是我提供一个Godaddy的免费FTP.</p>< p>考虑到稳定性和专一性,我想重新开启一个godaddy的免费空间,但是此时已经上传了两集,一共是400多兆.怎么办呢?</p>< p>于是乎我想起了之前转移空间时用到的一个php文件,他可以下载远程网络文件到服务器上,也就是只要是可以下载的url,就可以转移到新的服务器上.</p>< p>废话不多说,直接亮出将远程网络文件下载到服务器的php源码(测试通过,很好很强大).</p>< p>< table cellspacing="0" cellpadding="6" border="0">< tbody>< tr>< td bgcolor="#ddedfb">&nbsp;&lt;form method=&quot;post&quot;&gt;<br />& lt;input name=&quot;url&quot; size=&quot;50&quot; /&gt;<br />& lt;input name=&quot;submit&quot; type=&quot;submit&quot; /&gt;<br />& lt;/form&gt;<br />& lt; ?php<br /> // maximum execution time in seconds<br /> set_time_limit (24 * 60 * 60);<br /> if (!isset($_POST['submit'])) die();<br /> // folder to save downloaded files to. must end with slash<br /> $destination_folder = 'temp/';<br />& nbsp;<br /> $url = $_POST['url'];<br /> $newfname = $destination_folder . basename($url);<br /> $file = fopen ($url,& quot;rb&quot;);<br /> if ($file) {<br /> $newf = fopen ($newfname,& quot;wb&quot;);<br /> if ($newf)<br /> while(!feof($file)) {<br /> fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );<br /> }<br /> }<br /> if ($file) {<br /> fclose($file);<br /> }<br /> if ($newf) {<br /> fclose($newf);<br /> }<br /> ?&gt;</td>< /tr>< /tbody>< /table>< /p>< p>当然还需要展示下asp版本的源码(未测试)</p>< p>< table cellspacing="0" cellpadding="6" border="0">< tbody>< tr>< td bgcolor="#ddedfb">&lt; %< br /> function&nbsp;&nbsp; downfilea(d_target,&nbsp;&nbsp; s_target)< br /> On&nbsp;&nbsp; Error&nbsp;&nbsp; Resume&nbsp;&nbsp; Next&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp; dim&nbsp;&nbsp; myhttp,&nbsp;&nbsp; objstream< br />& nbsp;&nbsp;&nbsp; set&nbsp;&nbsp; myhttp&nbsp;&nbsp; =&nbsp;&nbsp; server.createobject(& quot;MSXML2.XMLHTTP& quot;)< br />& nbsp;&nbsp;&nbsp; myhttp.open&nbsp;&nbsp;& quot;GET& quot;,&nbsp;&nbsp; d_target,&nbsp;&nbsp; false< br />& nbsp;&nbsp;&nbsp; myhttp.send()< br />& nbsp;&nbsp;&nbsp; set&nbsp;&nbsp; objstream&nbsp;&nbsp; =&nbsp;&nbsp; Server.CreateObject(& quot;adodb.stream& quot;)&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp; objstream.Type&nbsp;&nbsp; =&nbsp;&nbsp; 1&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp; objstream.Mode&nbsp;&nbsp; =&nbsp;&nbsp; 3&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp; objstream.Open< br />& nbsp;&nbsp;&nbsp; objstream.Write&nbsp;&nbsp; myhttp.responseBody< br />& nbsp;&nbsp;&nbsp; objstream.SaveToFile&nbsp;&nbsp; s_target,&nbsp;&nbsp; 2< br />& nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; err.number&nbsp;&nbsp;& lt;&gt;&nbsp;&nbsp; 0&nbsp;&nbsp; then&nbsp;&nbsp; err.Clear< br /> end&nbsp;&nbsp; function< br />& nbsp;<br /> downfilea&nbsp;&nbsp;& quot;http://www.abc.com/xxx.rar& quot;,&nbsp;&nbsp; Server.MapPath(& quot;down/xxx.rar& quot;)< br /> Response.write&nbsp;&nbsp;& quot;ok& quot;< br /> %&gt;< p>还有asp.net版本的源码(未测试)</p>< p>&nbsp;&nbsp; using&nbsp;&nbsp; System;&nbsp;&nbsp;< br />& nbsp; using&nbsp;&nbsp; System.Net;&nbsp;&nbsp;< br />& nbsp; using&nbsp;&nbsp; System.IO;&nbsp;&nbsp;< br />& nbsp;<br />& nbsp; class&nbsp;&nbsp; DownloadFile;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static&nbsp;&nbsp; void&nbsp;&nbsp; Main(string[]&nbsp;&nbsp; args)&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //你的远程文件&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string&nbsp;&nbsp; siteURL=&quot;http://www.abc.com/xxx.rar&quot;;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下载到本地的路径及文件名&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string&nbsp;&nbsp; fileName=&quot;c:\\xxx.rar&quot;;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //实例化一个WebClient&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebClient&nbsp;&nbsp; client=new&nbsp;&nbsp; WebClient();&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用WebClient的DownloadFile方法&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.DownloadFile(siteURL,fileName);&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>< /td>< /tr>< /tbody>< /table>< /p>< p>注意事项:</p>< p>1.相关的目录可能需要建立,具体请看源码.比如temp/、down/.</p>< p>2.其中php版本的源码是支持自定义url的,但asp、asp.net版本的并没有提供自定义.</p>< p>3.在拷贝大文件时,国内估计支持欠佳.因为考虑到程序的超时时间,但在国外支持很好.</p>< p>比如Blinux将一个近300M的文件转移到另一个服务器上耗费时间是28秒.这是国内无法想象的.</p>< p>最后希望大家反馈下使用效果.</p>http://www.downcc.com/tech/289.html.Net编程2009/09/10 19:10:47<p>Asynchronous JavaScript and XML(AJAX)最近掀起的高潮,要完全归功于Google在Google Suggest和Google Maps中的使用。对ASP.NET而言,AJAX不需要回传就能进行服务器端处理,从而使客户机(浏览器)具有丰富的服务器端能力。换句话说,它为异步指派和处理请求与服务器响应提供了一个框架。AJAX利用了一些不是很新颖的已有技术,但是对这些技术(加到一起就是AJAX)的爱好最近突然升温。</p>< p>请尝试Michael Schwarz的AJAX .NET包装器,通过它ASP.NET开发人员可以快速方便的部署很容易利用AJAX功能的页面。需要注意的是,这个包装器处于初期开发阶段,因此还没有完全成熟。</p>< p>它是如何工作的&mdash;&mdash;概述</p>< p>AJAX依靠代理(broker)指派和处理往返服务器的请求。对此,.NET包装器依靠客户端XmlHttpRequest对象。多数浏览器都支持XmlHttpRequest对象,这就是选择它的原因。因为包装器的目的是隐藏XmlHttpRequest的实现,我们就不再详细讨论它了。<br /> 包装器本身通过将.NET函数标记为AJAX方法来工作。标记之后,AJAX就创建对应的JavaScript函数,这些函数(和任何JavaScript函数一样)作为代理可以在客户端使用XmlHttpRequest调用。这些代理再映射回服务器端函数。</p>< p>复杂吗?并不复杂。我们来看一个例子。假设有一个.NET函数:</p>< p>ublic int Add(int firstNumber, int secondNumber)<br /> {<br /> return firstNumber + secondNumber;< br /> }</p>< p>AJAX .NET包装器将自动创建名为&ldquo;Add&rdquo;、带有两个参数的JavaScript函数。使用JavaScript(在客户机上)调用该函数时,请求将传递给服务器并把结果返回给客户机。</p>< p>初始设置</p>< p>我们首先介绍&ldquo;安装&rdquo;项目中使用的.dll的步骤。如果您很清楚如何添加.dll文件引用,可以跳过这一节。</p>< p>首先,如果还没有的话,请下载最新的AJAX版本。解压下载的文件并把ajax.dll放到项目的引用文件夹中。在Visual Studio.NET中有机Solution Explorer的&ldquo;References(引用)&rdquo;节点并选择Add Reference(添加引用)。在打开的对话框中,单击Browse(浏览)并找到ref/ajax.dll文件。依次单击Open(打开)和Ok(确认)。这样就可以用AJAX .NET包装器编程了。</p>< p>建立HttpHandler</p>< p>为了保证正常工作,第一步是在web.config中设置包装器的HttpHandler。不需要详细解释HttpHandlers是什么及其如何工作,只要知道它们用于处理ASP.NET请求就足够了。比如,所有*.aspx页面请求都由<br /> System.Web.UI.PageHandlerFactory类处理。类似的,我们让所有对ajax/*.ashx的请求由Ajax.PageHandlerFactory处理:</p>< p>〈configuration&gt;<br /> 〈system.web&gt;<br /> 〈httpHandlers&gt;<br /> 〈add verb=&quot;POST,GET&quot; path=&quot;ajax/*.ashx&quot;<br /> type=&quot;Ajax.PageHandlerFactory, Ajax&quot; /&gt;<br /> 〈/httpHandlers&gt;</p>< p>〈system.web&gt;<br /> 〈/configuration&gt;</p>< p>简言之,上面的代码告诉ASP.NET,和指定路径(ajax/*.ashx)匹配的任何请求都由Ajax.PageHandlerFactory而不是默认处理程序工厂来处理。不需要创建ajax子目录,使用这个神秘的目录只是为了让其他HttpHandlers能够在自己建立的子目录中使用.ashx扩展。</p>< p>建立页面</p>< p>现在我们可以开始编码了。创建一个新页面或者打开已有的页面,在file后的代码中,为Page_Load事件添加以下代码:</p>< p>public class Index : System.Web.UI.Page{<br /> private void Page_Load(object sender, EventArgs e){<br /> Ajax.Utility.RegisterTypeForAjax(typeof(Index));< br /> //< br /> }<br /> //< br /> }</p>< p><br /> 调用RegisterTypeForAjax将在页面上引发后面的JavaScript(或者在页面中手工加入以下两行代码):</p>< p>〈script language=&quot;javascript&quot; src=&quot;ajax/common.ashx&quot;&gt;〈/script&gt;<br /> 〈script language=&quot;javascript&quot;< br /> src=&quot;ajax/Namespace.PageClass,AssemblyName.ashx&quot;&gt;〈/script&gt;</p>< p>其中最后一行的含义是:</p>< p>Namespace.PageClass&mdash;&mdash;当前页面的名称空间和类(通常是@Page指令中Inherits属性的值)</p>< p>AssemblyName&mdash;&mdash;当前页面所属程序集的名称(通常就是项目名)< br /> 下面是AjaxPlay项目中sample.aspx页面的结果例子:</p>< p>〈%@ Page Inherits=&quot;AjaxPlay.Sample&quot; Codebehind=&quot;sample.aspx.cs&quot; %&gt;<br /> 〈html&gt;<br /> 〈head&gt;<br /> 〈script language=&quot;javascript&quot; src=&quot;ajax/common.ashx&quot;&gt;〈/script&gt;<br /> 〈script language=&quot;javascript&quot;<br /> src=&quot;ajax/AjaxPlay.Sample,AjaxPlay.ashx&quot;&gt;〈/script&gt;<br /> 〈/head&gt;<br /> 〈body&gt;< br /> 〈form id=&quot;Form1&quot; method=&quot;post&quot; runat=&quot;server&quot;&gt;</p>< p>〈/form&gt;< br /> 〈/body&gt;<br /> 〈/html&gt;</p>< p>可以在浏览器中手工导航到src路径(查看源代码,复制粘贴路径)检查是否一切正常。如果两个路径都输出一些(似乎)毫无意义的文本,就万事大吉了。如果什么也没输出或者出现ASP.NET错误,则表明有些地方出现问题。</p>< p>即便不知道HttpHandlers如何工作,上面的例子也很容易理解。通过web.config,我们已经保证所有对ajax/*.ashx的请求都由自定义的处理程序处理。显然,这里的两个脚本标签将由自定义的处理程序处理。</p>< p>创建服务器端函数</p>< p>现在来创建可从客户端调用中异步访问的服务器端函数。因为目前还不支持所有的返回类型(不用担心,将在目前的基础上开发新的版本),我们继续使用简单的ServerSideAdd函数吧。在file后的代码中,向页面添加下列代码:</p>< p>[Ajax.AjaxMethod()]<br /> public int ServerSideAdd(int firstNumber, int secondNumber)<br /> {<br /> return firstNumber + secondNumber;< br /> }</p>< p>要注意,这些函数具有Ajax.AjaxMethod属性集。该属性告诉包装器这些方法创建javaScript代理,以便在客户端调用。</p>< p>客户端调用</p>< p>最后一步是用JavaScript调用该函数。AJAX包装器负责创建带有两个参数的JavaScript函数Sample.ServerSideAdd。对这种最简单的函数,只需要调用该方法并传递两个数字:</p>< p>〈%@ Page Inherits=&quot;AjaxPlay.Sample&quot; Codebehind=&quot;sample.aspx.cs&quot; %&gt;<br /> 〈html&gt;<br /> 〈head&gt;<br /> 〈script language=&quot;javascript&quot; src=&quot;ajax/common.ashx&quot;&gt;〈/script&gt;<br /> 〈script language=&quot;javascript&quot;< br /> src=&quot;ajax/AjaxPlay.Sample,AjaxPlay.ashx&quot;&gt;〈/script&gt;<br /> 〈/head&gt;<br /> 〈body&gt;< br /> 〈form id=&quot;Form1&quot; method=&quot;post&quot; runat=&quot;server&quot;&gt;<br /> 〈script language=&quot;javascript&quot;&gt;<br /> var response = Sample.ServerSideAdd(100,99);< br /> alert(response.value);< br /> 〈/script&gt;<br /> 〈/form&gt;< br /> 〈/body&gt;<br /> 〈/html&gt;</p>< p>当然,我们不希望仅仅用这种强大的能力来警告用户。这就是所有客户端代理(如JavaScript Sample.ServerSideAd函数)还接受其他特性的原因。这种特性就是为了处理响应而调用的回调函数:</p>< p>Sample.ServerSideAdd(100,99, ServerSideAdd_CallBack);</p>< p>function ServerSideAdd_CallBack(response){<br /> if (response.error != null){<br /> alert(response.error);< br /> return;< br /> }<br /> alert(response.value);< br /> }</p>< p><br /> 从上述代码中可以看到我们指定了另外一个参数。ServerSideAdd_CallBack(同样参见上述代码)是用于处理服务器响应的客户端函数。这个回调函数接收一个响应对象,该对象公开了三个主要性质</p>< p>Value&mdash;&mdash;服务器端函数实际返回的值(无论是字符串、自定义对象还是数据集)。</p>< p>Error&mdash;&mdash;错误消息,如果有的话。</p>< p>Request&mdash;&mdash;xml http请求的原始响应。</p>< p>Context&mdash;&mdash;上下文对象。</p>< p>首先我们检查error只看看是否出现了错误。通过在服务器端函数中抛出异常,可以很容易处理error特性。在这个简化的例子中,然后用这个值警告用户。Request特性可用于获得更多信息(参见下一节)。</p>< p>处理类型</p>< p>返回复杂类型</p>< p>Ajax包装器不仅能处理ServerSideAdd函数所返回的整数。它目前还支持integers、strings、double、booleans、DateTime、DataSets和DataTables,以及自定义类和数组等基本类型。其他所有类型都返回它们的ToString值。<br /> 返回的DataSets和真正的.NET DataSet差不多。假设一个服务器端函数返回DataSet,我们可以通过下面的代码在客户端显示其中的内容:</p>< p>〈script language=&quot;JavaScript&quot;&gt;<br /> //Asynchronous call to the mythical& quot;GetDataSet&quot; server-side function<br /> function getDataSet(){<br /> AjaxFunctions.GetDataSet(GetDataSet_callback);< br /> }<br /> function GetDataSet_callback(response){<br /> var ds = response.value;< br /> if(ds != null& amp;&amp; typeof(ds) ==& quot;object&quot;& amp;&amp; ds.Tables != null){<br /> var s = new Array();< br /> s[s.length] =& quot;〈table border=1&gt;&quot;;< br /> for(var i=0; i〈ds.Tables[0].Rows.length; i++){<br /> s[s.length] =& quot;〈tr&gt;&quot;;< br /> s[s.length] =& quhttp://www.downcc.com/tech/288.htmlPHP编程2009/09/10 19:09:12<p>Zend Studio是我们PHPer的一个非常的得力的工具,有了他往往能够让我们的工作事倍功半,今天就来记录一下日常使用中非常有用的配置,来帮助更多的PHPer提高工作的效率。</p>< p>1、配置服务器。</p>< p>如果我们希望能够快速的进行调试,那么将Server和Zend整合在一起是必不可少的。配置服务器的入口很多,比如我们可以从Preferences/PHP/PHP Server中进入,也可以在Run按钮的下拉列表中找到Run Configuration/Server的配置。</p>< p>创建新的Server时,我们需要指定Server访问的地址,这个如果我们在本地配置了服务器的话,我们可以到(/etc/httpd/conf.d/vhost)中设置本地的工程的域名,当然,不能忘记设置HOSTS(在/etc/hosts中)。</p>< p>配置完成后,如果需要调试页面,我们只需要点击&ldquo;Run&rdquo;图标,第一次的时候会弹出一个地址对话框等待我们确认,之后点击就可以在Zend Studio中直接查看代码的运行结果了,这个对于逻辑比较重要的页面来说非常的实用,因为我们不用像往常那样切换到浏览器中,点击F5刷新查看结果了。</p>< p>2、创建PHP工程。</p>< p>我发现在Fedora下,如果你创建了一个一般的工程,PHP的函数是不会有自动的代码提示的,后来找了很久并没有发现在什么地方可以设置。但是如果将工程创建为PHP Project,那么我们就可以享受到代码提示带来的快感了。</p>< p>创建PHP Project更重要的一个好处还在于,当我们的工程越来越庞大的时候,我们就可以很容易的在各个类和各个函数之间进行跳转,只需要两个按键&ldquo;Ctrl+Left Click&rdquo;。</p>< p>3、DEBUG。</p>< p>由于是解释执行型语言,PHP的调试一直都不是很方便,但是我们可以通过 Zend Studio 的Debug来改善这一状况。Debug 的设置窗口可以在 Window/Preferences/PHP/Debug中找到。</p>< p>默认的一些配置:</p>< p>PHP Debugger: 默认的使用Zend Debugger,需要我们安装Zend Debugger后才能使用。Zend Studio 6.1.2 默认进行了安装,可以通过Window/Preference/PHP/Debug/Installed Debuggers进行查看。</p>< p>Zend Debugger配置过程中需要有一个dummy.php文件,这个文件的作用是在指定的服务器上建立一个调试脚本的会话(SESSION),文件名最好默认不要修改。</p>< p>PHP Server: 选择我们之前创建好的服务器。</p>< p>PHP Executable:选择合适的PHP版本,如果需要添加新的项目,可以在Window / Preference / PHP / PHP Executable中找到。</p>< p>最后还有两项输入输出字符编码配置,这个采用默认就好了,下面就可以进行调试了。</p>< p>Zend Studio的调试允许我们设置断点、按步执行、检测变量和参数,下面分别说明一下几种不同的调试方法。</p>< p>3.1 PHP代码本地调试(PHP Script Local Debugging)。</p>< p>允许我们通过Zend Studio 内置的Debugger进行调试,一般在部署到服务器之前我们可以先用这项来检查程序中是否存在问题。本地调试需要代码存在于工作目录中,同时本地调试回默认使用Zend Studio自带的PHP Executable环境。</p>< p>调试过程一般为:</p>< p>3.1.1 在我们的代码中设置断点。</p>< p>3.1.2 保存文件。</p>< p>3.1.3 点击Debug旁的箭头进行Debug配置,或者邮件选择 Debug As 。。. / Debug Configurations 进行配置。</p>< p>3.1.4 如果没有设置断点,也可以通过在配置中选择Break at first line来进行调试。</p>< p>3.1.5 如果需要,我们还可以在调试代码中加入变量,之后运行就会跳转到调试视图。在调试试图,我们通过单击&ldquo;Resume&ldquo;、&ldquo;Step Into&ldquo;等可以控制程序的执行,同时还可以在变量窗口中观察到变量的变化。</p>< p>3.2 PHP代码远程调试(PHP Script Remote Debugging)。</p>< p>这个选项允许我们使用服务器上安装的Zend Debugger来调试工作目录下的文件。使用这个功能,我们必须在服务器上安装Zend Debugger。</p>< p>调试的过程和3.1基本类似,现在针对服务器上的Zend Debugger安装做一些说明。</p>< p>配置Remote Debugging首先需要确保你的服务器上安装了Zend Debugger,你可以从下面这个地址中下载到:http://www.zend.com/en/products/studio/downloads。</p>< p>根据自己系统的环境选择合适的发行包,我这里选择的是 ZendDebugger-5.2.14-linux-glibc23-i386 ,解压后是几个目录和一个dummy.php文件和其他的一些说明。根据自己当前的PHP版本选择合适的文件夹(不知道的可以用php -v来进行查看,这需要你已经将PHP命令放入环境变量中),找到 ZendDebugger.so 的路径,然后添加到 php.ini 中,格式 zend_extension=/usr/lib/php/modules/ZendDebugger.so。</p>< p>同时添加下面两行代码:</p>< p>zend_debugger.allow_hosts=《ip_addresses》</p>< p>zend_debugger.expose_remotely=always</p>< p>完成后将dummy.php拷贝到工作目录中,然后重启服务器就可以了。这个时候,如果我们再用 phpinfo() 查看服务器情况的时候,就能够看到 Zend Debugger 这一项。</p>< p>3.3 调试PHP网页。</p>< p>这个选项允许我们调试位于服务器上的代码,这样我们就可以全面的测试代码的运行状况。</p>< p>3.4 URL Debugging。</p>< p>用来调试远程服务器上的代码,通过输入一个网址来进行调试,所以并不要求文件在本地存在。</p>< p>3.5 工具栏调试(Toolbar Debugging)。</p>< p>这一项应该属于比较新的产品,目前安装Zend Studio 之后,会提示是否安装Firefox Toolbar 这样,在浏览器中也可以方便的调用 Zend 提供的一些调试方法。</p>< p>4、代码提示(代码提示)。</p>< p>代码提示帮助我们找到变量、调用函数、找到对象成员、引用文件等,能够极大的提高开发的速度,在Win下使用时,代码提示默认是打开的。在Feodra下使用,根据我的经验,需要在PHP的工程中,代码提示才能起作用。在Zend Studio 7.0中,需要Ctrl + Space才能调出代码提示。</p>< p>5、性能分析(Profile)。</p>< p>通过性能分析,我们能够找到代码中的瓶颈所在,从而提高代码的执行效率。Profile为我们提供了相近的统计资料和分析,我想如果用过Firebug的Profile功能的用户,对于使用 Zend Studio 的这个功能,应该也不会陌生。</p>< p>当然,Zend Stduio 使用中还会有各种各样的可以提高效率的办法,诸如快捷键的设置,在此我也无法一一总结,只要我们平时在使用中能够有足够的心思,多用勤用 Zend Help,如果是在不会也要学会通过 Google 解决问题,我们开发的效率一定会快速提高,从而成为 Senior PHPer 指日可待。</p>< p>原文地址:http://www.cnblogs.com/cocowool/archive/2009/07/29/1534522.html</p>http://www.downcc.com/tech/274.htmlPHP编程2009/08/28 19:54:03<p>首先说原理。某驼查了那么多资料,发现不管用什么方法,原理都是一样的。就是用程序读取相应的数据来替换模版中的变量,然后生成静态页。php中主要用到的就是要用到fread()和fwirte()。而静态页面生成了之后,就会牵扯到修改的问题。这里可以用到正则匹配的方法来替换模版中改变的部位。不过此种方法太麻烦,驼驼推荐的方法是直接把原来生成的模版砍掉,重新生成,呵呵,真正的一了百了。</p>< p>还需要说明的一点就是,这种生成静态页面的方法一般都用于那些变化不是很频繁的页面,比如信息的最终页面。而针对列表页,如果信息更新不是很频繁的话,也是可取的。现在网上流行好多可以生成静态页面的blog或者论坛程序,都是通过手动点击后台&ldquo;生成html页&rdquo;的按钮来&ldquo;半自动&rdquo;生成html的。而对一些信息量非常大的门户网站,则行不通。因为静态页之所以叫&ldquo;静态&rdquo;,是因为其不可自动改变。如果信息列表每天更新100次,那么静态的列表页就要重新生成100次。如果我有10个这样的栏目,那想想也够吐血的了。</p>< p>好了,闲话少说,现在来看看实际的程序演示:</p>< p>first:是一个利用ob函数来做的咚咚,代码比较简单,效率相对也高一些。某驼从某个</p>< p>高人处得到的源码,做了一些改动</p>< p>&lt;?php&nbsp;&nbsp;&nbsp; ob_start();< br /> @readfile(&quot;http://localhost/?package=pricab&amp;place_port=4&quot;);< br /> $text= ob_get_flush();< br /> $myfile= fopen(&quot;myfile.html&quot;,&quot;w&quot;);< br /> $text= str_replace (&quot;{counent}&quot;,$string,$text);&nbsp;&nbsp;&nbsp;&nbsp;< br /> fwrite($myfile,$text);&nbsp;&nbsp;&nbsp;&nbsp;< br /> ob_clean();< br /> ?&gt;</p>< p>因为就算要生成静态页面,动态读取那部分也是要保留的,把数据插入数据库后,把url传递给readfile函数,然后读入缓存,fwrite一下就可以生成静态页面,这个是驼驼最欣赏的一种作法。代码行数最少,效率最高。驼驼这边要求http://localhost/?package=pricab&amp;place_port=4是一个裸页,也就是单纯的内容,没有头,尾,菜单。这样才能比较自由的定制自己的模版myfile.html。如果仅仅是要求生成静态页的话,< br /> ob_start();&nbsp;&nbsp;&nbsp;&nbsp;< br /> @readfile(&quot;http://localhost/?package=pricab&amp;place_port=4&quot;);&nbsp;&nbsp;&nbsp;&nbsp;< br /> $string= ob_get_flush();< br /> $myfile= fopen(&quot;myfile.html&quot;,&quot;w&quot;);&nbsp;&nbsp;&nbsp;&nbsp;< br /> fwrite($myfile,$string);&nbsp;&nbsp;&nbsp;&nbsp;< br /> ob_clean();</p>< p>就可以over了</p>< p>second:普通生成静态html页。</p>< p>这种作法就是按部就班的来做,fread进来页面,然后str_replace替换</p>< p>首先是创建最终内容页:</p>< p>$title=& quot;http://siyizhu.com测试模板&quot;;&nbsp;&nbsp;< br /> $file=& quot;TwoMax Inter test templet,&lt;br&gt;author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]&quot;;< br /> $fp= fopen (&quot;temp.html&quot;,&quot;r&quot;);&nbsp;&nbsp;< br /> $content= fread ($fp,filesize (&quot;temp.html&quot;));&nbsp;&nbsp;< br /> $content= str_replace (&quot;{file}&quot;,$file,$content);&nbsp;&nbsp;< br /> $content= str_replace (&quot;{title}&quot;,$title,$content);&nbsp;&nbsp;< br /> $filename=& quot;test/test.html&quot;;&nbsp;&nbsp;< br /> $handle= fopen ($filename,&quot;w&quot;); //打开文件指针,创建文件&nbsp;&nbsp; /*  检查文件是否被创建且可写&nbsp;&nbsp; */&nbsp;&nbsp; if (!is_writable ($filename))< br /> {&nbsp;&nbsp;&nbsp;&nbsp; die (&quot;文件:&quot;.$filename.&quot;不可写,请检查其属性后重试!&quot;);&nbsp;&nbsp; }&nbsp;&nbsp;< br /> if (!fwrite ($handle,$content)){ //将信息写入文件&nbsp;&nbsp;&nbsp;&nbsp; die (&quot;生成文件&quot;.$filename.&quot;失败!&quot;);&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;< br /> fclose ($handle); //关闭指针&nbsp;&nbsp;&nbsp; die (&quot;创建文件&quot;.$filename.&quot;成功!&quot;);</p>< p>这一步比较简单。只是单纯的变量替换即可。如果要生成静态的列表页面的话,原理也是一样,用程序来生成文章列表,把它当成一个大的变量,替换模版中的变量,列表的翻页页是如此。当然,如果有信息更新的话,列表翻页也是要重新生成的。</p>< p>&lt;?php&nbsp;&nbsp;&nbsp;&nbsp;< br /> $title=& quot;http://&quot;;&nbsp;&nbsp;&nbsp;&nbsp;< br /> $file=& quot;TwoMax Inter test templet,&lt;br&gt;author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]&quot;;&nbsp;&nbsp;&nbsp;&nbsp;< br /> $fp= fopen (&quot;temp.html&quot;,&quot;r&quot;);&nbsp;&nbsp;&nbsp;&nbsp;< br /> $content= fread ($fp,filesize (&quot;temp.html&quot;));&nbsp;&nbsp;&nbsp;&nbsp;< br /> $content= str_replace (&quot;{file}&quot;,$file,$content);&nbsp;&nbsp;&nbsp;&nbsp;< br /> $content= str_replace (&quot;{title}&quot;,$title,$content);&nbsp;&nbsp;&nbsp;&nbsp;< br /> // 生成列表开始&nbsp;&nbsp;&nbsp;&nbsp;< br /> $list= '';&nbsp;&nbsp;&nbsp;&nbsp;< br /> $sql=& quot;select id,title,filename from article&quot;;&nbsp;&nbsp;&nbsp;&nbsp;< br /> $query= mysql_query ($sql);&nbsp;&nbsp;&nbsp;&nbsp;< br /> while ($result = mysql_fetch_array ($query)){&nbsp;&nbsp;&nbsp;&nbsp;< br /> $list.= '&lt;a href='.$root.$result['filename'].'&nbsp;&nbsp; target=_blank&gt;'.$result['title'].'&lt;/a&gt;&lt;br&gt;';&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;< br /> $content.= str_replace (&quot;{articletable}&quot;,$list,$content);&nbsp;&nbsp;&nbsp;&nbsp; //生成列表结束&nbsp;&nbsp;< br /> // echo $content;&nbsp;&nbsp;&nbsp;&nbsp;< br /> $filename=& quot;test/test.html&quot;;&nbsp;&nbsp;&nbsp;&nbsp;< br /> $handle= fopen ($filename,&quot;w&quot;); //打开文件指针,创建文件&nbsp;&nbsp;< br /> /*  检查文件是否被创建且可写&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp; if (!is_writable ($filename)){&nbsp;&nbsp;&nbsp;&nbsp; die (&quot;文件:&quot;.$filename.&quot;不可写,请检查其属性后重试!&quot;);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; if (!fwrite ($handle,$content)){ //将信息写入文件&nbsp;&nbsp;&nbsp;&nbsp; die (&quot;生成文件&quot;.$filename.&quot;失败!&quot;);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; fclose ($handle); //关闭指针&nbsp;&nbsp;&nbsp;&nbsp; die (&quot;创建文件&quot;.$filename.&quot;成功!&quot;); ?&gt;</p>< p>关于翻页:<br />& nbsp;<br /> 如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i& lt; allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,die (&quot;创建文件&quot;.$filename.&quot;成功!&quot;;这句去掉,放到循环后的显示,因为该语句将中止程序执行。例:</p>< p>&lt;?php $fp = fopen (&quot;temp.html&quot;,&quot;r&quot;);< br /> $content= fread ($fp,filesize (&quot;temp.html&quot;));< br /> $onepage= '20';< br /> $sql=& quot;select id from article where channel='$channelid'&quot;;< br /> $query= mysql_query ($sql);< br /> $num= mysql_num_rows ($query);< br /> $allpages= ceil ($num / $onepage);< br /> for ($i = 0;$i&lt;$allpages; $i++)< br /> { if ($i == 0){ $indexpath =& quot;index.html&quot;; }< br /> else { $indexpath =& quot;index_&quot;.$i.&quot;html&quot;; }< br /> $start= $i * $onepage; $list = '';< br /> $sql_for_page=& quot;select name,filename,title from article where channel='$channelid' limit $start,$onepage&quot;;< br /> $query_for_page= mysql_query ($sql_for_page);< br /> while ($result = $query_for_page){ $list .= '&lt;a href='.$root.$result['filename'].' target=_blank&gt;'.$title.'&lt;/a&gt;&lt;br&gt;'; }< br /> $content= str_replace (&quot;{articletable}&quot;,$list,$content);< br /> if (is_file ($indexpath)){ @unlink ($indexpath); //若文件已存在,则删除 } $handle = fopen ($indexpath,&quot;w&quot;); //打开文件指针,创建文件 /*  检查文件是否被创建且可写 */ if (!is_writable ($indexpath)){ echo& quot;文件:&quot;.$indexpath.&quot;不可写,请检查其属性后重试!&quot;; //修改为echo } if (!fwrite ($handle,$content)){ //将信息写入文件 echo& quot;生成文件&quot;.$indexpath.&quot;失败!&quot;; //修改为echo } fclose ($handle); //关闭指针 }< br /> fclose ($fp); die (&quot;生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!&quot;);?&gt;< br /> third:smarty模版生成静态页面< br /> 驼驼是用smarty模版的,smarty自己有一个fetch函数,其功用有点类似于fread()可以用来生成静态的页面.< br /> 这个例子大家想必看起来眼熟,对,smarty手册中关于fetch函数的例子,hoho 某驼借用一下,比竟官方的例子总是很经典的嘛!</p> http://www.downcc.com/tech/264.html.Net编程2009/08/19 10:36:14<p>在asp.net中的Session存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障,用户每天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题 ,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大概20人左右,同时大概100多人在线,以后访问人数还会增加,为了解决这个怪问题,先从软件着手,故而三种方式都应用了一番。</p>< p>打开web.config文件< br />& lt; sessionState</p>< p>mode=&quot;InProc&quot;</p>< p>stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;</p>< p>sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot;</p>< p>cookieless=&quot;false&quot;</p>< p>timeout=&quot;20&quot;</p>< p>/&gt;</p>< p>其中默认的mode是InProc类型,这种模式和以前ASP模式一样,就是服务器将Session信息存储在IIS进程当中,当IIS关闭、重起后这些进程信息都会丢失,但这种模式的性能最高(具体没测,看书上说),这种模式是asp.net的默认方式。</p>< p>由于这种模式出现了故障,当时我的考虑就是由于访问量过大的原因,导致Inetinfo.exe进程崩溃。用户难以登陆以致Session丢值出现故障,我采用了另外一种Session的存储方式把Session信息存储在进程外。</p>< p>首先,打开管理工具找到服务,找到名为:asp.net State Service的服务,启动它.并且改成自动启动。这时你可以在任务管理器中看到一个名为aspnet_state.exe的进程。这就是我们保存session信息的进程。</p>< p>然后,回到web.config文件中把Mode的值改为StateServer,保存文件。OK.</p>< p>&lt; sessionState</p>< p>mode=&quot;StateServer&quot;</p>< p>stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;</p>< p>sqlConnectionString=&quot;data source=192.10.78.76;User id=sa;password=sa&quot;</p>< p>cookieless=&quot;false&quot;</p>< p>timeout=&quot;20&quot;</p>< p>/&gt;</p>< p>这种模式当我们重起IIS,保存的session值不会丢失。另外这种方式还可以把信息保存在其他机器的进程中,不过还要更改 stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;,IP地址改为其他机器即可。</p>< p>另外还采取了其他的措施.比如把数据库和Web服务器分开,数据库服务器不提供WEB服务,Web服务器不提供数据库服务,</p>< p>然后把连接池扩大,由于asp.net中ADO.NET数据访问默认连接池数量为100, 后来我扩大到6000顺便把写法加上来</p>< p>&ldquo;Server=(local);</p>< p>Database=rgs;</p>< p>password=sa;</p>< p>user ID=sa;</p>< p>Max Pool Size =6000;</p>< p>Min Pool Size =5;</p>< p>Pooling=True&rdquo;</p>< p>最后把Machine.config中的ProcessModel中的memoryLimit改为95,默认为60,表示内存占用超过60%后iis进程会自动重起。接着还做写其它一些优化IIS的方法,把注册表的IIS缓存加大等等 。</p>< p>当我做完这些优化步骤后,整个软件运行比较良好,第二天没有发现堵塞的现象,但是第三天情况又出现了,实在没办法,我采取了最后一种ASP.NET中的session存储方法就是将Session存储在SQLServer中,我想这样稳定性应该强些。</p>< p>要使用SQLServer中,首先在会话状态的SQLServer的计算机上,运行InstallSqlState.sql或InstallPersistSqlState.sql(默认位置:systemroot\Microsoft.NET\Framework\versionNumber下面)两个脚本都创建一个名为ASPState的数据库,两个脚本的差别在于放置ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql脚本将这些表添加到TempDB数据库,该数据库在计算机重起时将丢失数据,而InstallPersistSqlState.sql脚本将这些表添加到ASPState数据库,该数据库重启时保留会话数据。</p>< p>然后在应用程序的web.config文件中,把&lt; sessionState&gt;元素的mode属性设置为SQLServer,最后将sqlConnectionString属性设置为Integrated Security=SSPI;data source=serverName;</p>< p>&lt; sessionState mode=&quot;SQLServer&quot; sqlConnectionString=&quot; Integrated Security=SSPI;</p>< p>data source=dataserver;&quot;</p>< p>cookieless=&quot;false&quot;</p>< p>timeout=&quot;20&quot;/&gt;</p>< p>&lt; /sessionState&gt;</p>< p><br /> 如果部署在其他机器上可以更改为,加上用户名和密码</p>< p><br />& lt; sessionState</p>< p>mode=&quot;SQLServer&quot;</p>< p>stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;</p>< p>sqlConnectionString=&quot;data source=192.10.78.76;User id=sa;password=sa&quot;</p>< p>cookieless=&quot;false&quot;</p>< p>timeout=&quot;20&quot;</p>< p>/&gt;</p>< p>这样部署完成了,如果不想使用这种可以删除掉,只要在相应的目录(systemroot\Microsoft.NET\Framework\versionNumber)找到UninstallPersistSqlState.sql或者UninstallSqlState.sql文件运行即可。这样就介绍了ASP.NET中的session存储模式。</p>< p>最后要注意的是,无论使用StateServer或者SQLServer模式时,当使用session转换对象时,注意对象要先序列化,就是在类前加上Serializable,否则会出现错误!</p>http://www.downcc.com/tech/259.html.Net编程2009/08/17 11:40:13<p>ASP.NET中使用AJAX中的方式之背景介绍</p>< p>asp.net中使用php常用的jquery等类库来实现ajax不是很容易。因为asp.net的机制已经被封装了,依靠内部的viewstate,如果硬用js修改了控件的值,跟他的viewstate对不上,而这些控件又是不可修改的,将对程序造成安全性困扰,后台获取值也是一个麻烦。</p>< p>另外,asp.net的控件也封装了html控件,使用js操作不是这么直接。</p>< p>根据Surance( http://www.fltek.com.cn/)研究发现,在asp.net中,有3种方法使用ajax比较简单。算是ms的一个补偿方案来的。</p>< p>一个是PageMethod,一个是使用ICallbackEventHandler,还有一个是用ms自带的ajax控件。</p>< p>分别举例说明,以下例子要实现的功能为:</p>< p>在页面有一个div,一个按钮。点击按钮要调用后台方法获取一个时间,然后将时间写入div。要求页面不刷新</p>< p>另外有个后台的按钮,点击此按钮,取到保存后的值</p>< p>ASP.NET中使用AJAX中的方式1:PageMehtod</p>< p>第一步,建立一个asp.net的ajax网站(或者建立普通网站后修改webconfig)</p>< p>第二步,在页面建立控件:</p>< p>&lt; asp:ScriptManager ID=&quot;ScriptManager1&quot; runat=&quot;server&quot; EnablePageMethods=&quot;true&quot; /&gt;&nbsp;&nbsp;&nbsp;& lt; div id=&quot;show&quot; runat=&quot;server&quot;&gt;aaaa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; /div&gt;&nbsp;&nbsp;&nbsp;&nbsp;& lt; asp:HiddenField ID=&quot;HiddenField1&quot; runat=&quot;server&quot; /&gt;&nbsp;&nbsp;&nbsp;&nbsp;& lt; input type=&quot;button&quot; value=&quot;1111&quot; onclick=&quot;myFun()&quot; id=&quot;Button2&quot; /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; asp:Button ID=&quot;Button1&quot; runat=&quot;server&quot; Text=&quot;getValue&quot; OnClick=&quot;Button1_Click&quot; /&gt;&nbsp;&nbsp;< br /> 第三步,js</p>< p>&lt; script&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function myFun()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageMethods.GetDate('a',myCallBack)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function myCallBack(result)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var di = document.getElementById(&quot;HiddenField1&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; di.value=result;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var di = document.getElementById(&quot;show&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; di.innerHTML=result;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; /script&gt;&nbsp;&nbsp;< br /> 第四步,后台代码</p>< p>注意,这个方法必须是静态方法,必须是写入以下特性。</p>< p>因此这个方法不可以直接访问页面的值</p>< p>[System.Web.Services.WebMethod]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static DateTime GetDate(string a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DateTime.Now;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void Button1_Click(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt = (DataTable)this.DataList1.DataSource;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(dt.Rows.Count);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;< br /> ASP.NET中使用AJAX中的方式2:使用ICallbackEventHandler</p>< p>第一步同上</p>< p>第二步,页面实现接口</p>< p>public partial class Default2 : System.Web.UI.Page, ICallbackEventHandler</p>< p><br /> 第三步,建立控件</p>< p><br />& lt; form id=&quot;form1&quot; runat=&quot;server&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; div id=&quot;show&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; /div&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; input type=&quot;button&quot; onclick=&quot;CallServer()&quot; value=&quot;CallServer&quot;&gt;&lt; /input&gt;&nbsp;&nbsp;< br /> 第四步,</p>< p>写入js</p>< p><br />& lt; script type=&quot;text/javascript&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function CallServer()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var product =& quot;1&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& lt; %= ClientScript.GetCallbackEventReference(this,& quot;product&quot;,& quot;ReceiveServerData&quot;,null)%&gt;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function ReceiveServerData(rValue)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(rValue);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var di = document.getElementById(&quot;show&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; di.innerHTML=rValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;& lt; /script&gt;&nbsp;< br /> 第五步,</p>< p>后台代码</p>< p>声明变量: public&nbsp; string CallBackValue;</p>< p>接口方法:</p>< p><br /> public string GetCallbackResult()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CallBackValue +& quot;,ok&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void RaiseCallbackEvent(string eventArgument)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.CallBackValue = eventArgument;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;< br /> 说明:RaiseCallbackEvent是实际做事的方法</p>< p>GetCallbackResult是执行完动作回调的方法。</p>< p>可以修改控件的值。</p>< p>先执行后台的回调方法,后执行前台js的回调方法</p>< p>可以使用RenderControl等类,来将asp.net控件输出为html</p>< p>可以在RaiseCallbackEvent中switchargument,看看是什么地方传来的,以便调用不同的函数。</p>http://www.downcc.com/tech/258.htmlPHP编程2009/08/17 11:36:44<p>最近想做一个通过PHP实现DataGrid功能的东西,这样可以直接修改数据库中表的内容,而不用开发【新增数据页面】,【编辑页面】,于是乎在网上找了找,类似的东西也有几个,开源的、付费的都有,不过基本都是基于MySQL。由于需要连接Oracle所以从二次开发和页面样式来说个人觉得phpMyDataGrid还是比较好上手。本篇首先介绍基于MySQL的使用方法,再简单介绍对于Oracle连接(基于sqlrelay)的二次开发。</p><p><strong> 创建测试数据库和表</strong></p><pre>create&nbsp;database&nbsp;`guru`;USE&nbsp;`guru`;CREATE&nbsp;TABLE&nbsp;`employees`&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`id`&nbsp;int(6)&nbsp;NOT&nbsp;NULL&nbsp;auto_increment,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`name`&nbsp;char(20)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`lastname`&nbsp;char(20)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`salary`&nbsp;float&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`age`&nbsp;int(2)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`afiliation`&nbsp;date&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`status`&nbsp;int(1)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`active`&nbsp;tinyint(1)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`workeddays`&nbsp;int(2)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`photo`&nbsp;char(30)&nbsp;default&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;&nbsp;(`id`) )insert&nbsp;into&nbsp;`employees`(`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)&nbsp;values&nbsp;(1,&nbsp;&#39;Ana&#39;,&nbsp;&#39;Trujillo&#39;,2000,45,&nbsp;&#39;2005-05-13&#39;,1,1,10,&nbsp;&#39;1.jpg&#39;);insert&nbsp;into&nbsp;`employees`&nbsp;(`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)values&nbsp;(2,&nbsp;&#39;Jennifer&#39;,&nbsp;&#39;Aniston&#39;,3500,23,&nbsp;&#39;2004-10-22&#39;,1,0,0,&nbsp;&#39;2.jpg&#39;);insert&nbsp;into&nbsp;`employees`&nbsp;(`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)values&nbsp;(3,&nbsp;&#39;Michael&#39;,&nbsp;&#39;Norman&#39;,1200,19,&nbsp;&#39;2007-01-10&#39;,1,1,5,&nbsp;&#39;3.jpg&#39;);insert&nbsp;into&nbsp;`employees`&nbsp;(`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)values&nbsp;(4,&nbsp;&#39;Vanessa&#39;,&nbsp;&#39;Black&#39;,6500,31,&nbsp;&#39;2000-11-05&#39;,1,1,30,&nbsp;&#39;4.jpg&#39;);insert&nbsp;into&nbsp;`employees`&nbsp;(`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`&lt;span</pre>http://www.downcc.com/tech/200.htmlAsp编程2009/07/07 19:45:46<p>< p><span >在ASP编程中,身份认证可以说是常要用到的。但怎么样才能做到认证的安全呢?</span></p>< /p>< p><span >< p>表单提交页面:sub.htm&nbsp;</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font><br />< p>&lt;html&gt;< br />& nbsp;&nbsp;&nbsp;& lt;head&gt;< br />& nbsp;&nbsp;&nbsp;& lt;title&gt;管理员登陆</title&gt;< br />& nbsp;&nbsp;&nbsp;& lt;body&gt;< br />& nbsp;&nbsp;&nbsp;& lt;form name=&quot;form1&quot; method=&quot;post&quot; action=&quot;sub.asp&quot;&gt;< br />& nbsp;&nbsp;&nbsp;& lt;p&gt; 管理员:< br />& nbsp;&nbsp;&nbsp;& lt;input type=&quot;text&quot; name=&quot;UserID&quot; size=&quot;25&quot; maxlength=&quot;20&quot;&gt;<br />& nbsp;&nbsp;&nbsp; 密 码:< br />& nbsp;&nbsp;&nbsp;& lt;input type=&quot;text&quot; name=&quot;Pass&quot; size=&quot;12&quot; maxlength=&quot;20&quot;&gt;< br />& nbsp;&nbsp;&nbsp;& lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;提交&quot;&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/p&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/form&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/body&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< /span></p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font><br />& nbsp;&nbsp;&nbsp; SUB.asp程序< br />& nbsp;&nbsp;&nbsp;& lt;%< br />& nbsp;&nbsp;&nbsp; 接收表单中的数据< br />& nbsp;&nbsp;&nbsp; user=request.from(&quot;UserID&quot;)< br />& nbsp;&nbsp;&nbsp; 检察表单提交的数据是否为空(表单页面可能你用JAVASCRIPT OR VBSCRIPT控制了,但这里也不要忘记控制!< br />& nbsp;&nbsp;&nbsp; if user=&quot;&quot; then< br />& nbsp;&nbsp;&nbsp; 转到出错提示页面!< br />& nbsp;&nbsp;&nbsp; response.redirect& quot;err1.htm&quot;< br />& nbsp;&nbsp;&nbsp; 这一句可能没用,但加上为好!< br />& nbsp;&nbsp;&nbsp; response.end< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; pass=request.from(&quot;Pass&quot;)< br />& nbsp;&nbsp;&nbsp; if pass=&quot;&quot; then< br />& nbsp;&nbsp;&nbsp; response.redirect& quot;err2.htm&quot;< br />& nbsp;&nbsp;&nbsp; response.end< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; 联接数据库< br />& nbsp;&nbsp;&nbsp; file=server.mappath(&quot;你的数据库&quot;)< br />& nbsp;&nbsp;&nbsp; set conn=server.createobject(&quot;adodb.connection&quot;)< br />& nbsp;&nbsp;&nbsp; dr=&quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;file< br />& nbsp;&nbsp;&nbsp; conn.open dr< br />& nbsp;&nbsp;&nbsp; set rs=server.createobject(&quot;adodb.recordset&quot;)< br />& nbsp;&nbsp;&nbsp; 关键是这里的SQL语言< br />& nbsp;&nbsp;&nbsp; sql=&quot;select * from 表 where user=& quot;&amp;user&amp;&quot; and pass=& quot;&amp;pass&amp;&quot;& quot;< br />& nbsp;&nbsp;&nbsp; rs.open sql< br />& nbsp;&nbsp;&nbsp; if not rs.eof then< br />& nbsp;&nbsp;&nbsp; 找到的话就进入管理页面< br />& nbsp;&nbsp;&nbsp; reponse.redirect& quot;login.asp&quot;< br />& nbsp;&nbsp;&nbsp; else< br />& nbsp;&nbsp;&nbsp; 没找到就进入错误页面< br />& nbsp;&nbsp;&nbsp; response.write& quot;err3.htm&quot;< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; %&gt;</td>< /tr>< /tbody>< /table>< /p>< p>大家感觉以上代码应该没问题啊,但是这里有一个严重的安全隐患:</p>< p>我如果想登录管理员的话可以在SUb.htm表单输入框中输入:</p>< p>第一个文本框中输入:a or 1 = 1 或 OR =</p>< p>第二个文本框中输入:a or 1 = 1 或 OR =</p>< p>提交,大家会看到...&ldquo;呜,听我说完好不好,砖头一会再丢过来...&quot;</p>< p>&quot;a& quot; 和&ldquo;1&rdquo;为任意字符</p>< p>有人会问为什么你输入这些字符会以管理员身份进入呢??</p>< p>其实这些字符是对你程序中SQL语言的欺骗,而成功进入的</p>< p>大家看:开始程序SQL中是对表进行查询满足user=& quot;&amp;user&amp;&quot; and pass=& quot;&amp;pass&amp;&quot;& quot;条件的记录</p>< p>sql=&quot;select * from 表 where user=& quot;&amp;user&amp;&quot; and pass=& quot;&amp;pass&amp;&quot;& quot;</p>< p>我而输入上面的代码后就成了:</p>< p>sql=&quot;select * from 表 where user= a or 1 = 1 and pass= a or 1 = 1& quot;</p>< p>大家看看,能有不进入的理由吗??给我一个不进入的理由,先!</p>< p>以上USER PASS字段为字符型 如果是数字型也一样的道理!</p>< p>解决方法:</p>< p>一、函数替代法:</p>< p>用REPLACE将用户端输入的内容中含有特殊字符进行替换,达到控制目的啊!sql=&quot;select * from 表 where user=& quot;&amp;replace(user,&quot;& quot;,&quot;& quot;)&amp;&quot; and pass=& quot;&amp;replace(pass,&quot;& quot;,&quot;& quot;)&amp;&quot;& quot;</p>< p>这种方法每次只能替换一个字符,其实危险的字符不只是&quot;& quot;,还有如&quot;&gt;&quot;、&quot;&lt;&quot;、&quot;&amp;&quot;、&quot;%&quot;等字符应该全控制起来。但用REPLACE函数好象不太胜任那怎么办呢??</p>< p>二、程序控制法</p>< p>用程序来对客户端输入的内容全部控制起来,这样能全面控制用户端输入的任何可能的危险字符或代码,我就的这个方法!</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font><br />& lt;%< br />& nbsp;&nbsp;&nbsp; 捕捉用户端提交的表单内容< br />& nbsp;&nbsp;&nbsp; user=request.from(&quot;user&quot;)< br />& nbsp;&nbsp;&nbsp; pass=request.from(&quot;pass&quot;)< br />& nbsp;&nbsp;&nbsp; ...< br />& nbsp;&nbsp;&nbsp; 循环控制开始< br />& nbsp;&nbsp;&nbsp; for i=1 to len(user)< br />& nbsp;&nbsp;&nbsp; 用MID函数读出变量user中i 位置的一个字符< br />& nbsp;&nbsp;&nbsp; us=mid(user,i,1)< br />& nbsp;&nbsp;&nbsp; 将读出的字符进行比较< br />& nbsp;&nbsp;&nbsp; if us=&quot;& quot; or us=&quot;%&quot; or us=&quot;&lt;&quot; or us=&quot;&gt;&quot; or us=&quot;&amp;&quot; then< br />& nbsp;&nbsp;&nbsp; 如果含有以上字符将出错提示,不能含有以上特殊字符< br />& nbsp;&nbsp;&nbsp; response.redirect& quot;err2.htm&quot;< br />& nbsp;&nbsp;&nbsp; response.end< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; next< br />& nbsp;&nbsp;&nbsp; ...< br />& nbsp;&nbsp;&nbsp; %&gt;&nbsp;</td>< /tr>< /tbody>< /table>< /p>http://www.downcc.com/tech/199.htmlPHP编程2009/07/07 19:39:44<p>这几天装PHPWIND,费了很多周折,最大的就是静态化部署问题。</p>< p>所谓的静态化对于PHPWIND来说实质是伪静态。</p>< p>什么意思呢?</p>< p>比如某些已经实现静态化的PHPWIND论坛某页面:http://www.5kongsoft.com/bbs/post-htm-fid-4.html</p>< p>实质呢是http://www.5kongsoft.com/bbs/post.php?id=4</p>< p>也就是个解析问题,但是这样的话明显搜索引擎更喜欢HTML页面</p>< p>即使是伪造的。</p>< p>但是很多站长包括悟空软件的站长对PHP不是很熟悉。官方手册说的一堆搞得我云里雾里</p>< p>怎么办?悟空教你三步制胜!</p>< p><strong>第一步</strong></p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font><br />< ol>< li>&lt;IfModule mod_rewrite.c&gt;</li>< li>RewriteEngine On</li>< li>RewriteBase /</li>< li>RewriteRule ^(.*)-htm-(.*)$ $1.php?$2</li>< li>&lt;/IfModule&gt;</li>< /ol>< /td>< /tr>< /tbody>< /table>< /p>< p>在你本机网站根目录另存为htaccess.txt</p>< p><strong>第二步</strong></p>< p>上传服务器根目录,改名为 .htaccess</p>< p>很多对PHP不熟悉的有疑问了,这是什么文件名,可以命名吗?</p>< p>对的在unix下是可以的在你本机是不行的,这就是我们上传后再改名的原因</p>< p><strong>第三步</strong></p>< p>到后台,全面静态化部署,按照PHPWIND官方手册操作即可。</p>< p>是不是很简单?免除很多php不熟悉站长之忧,让你轻松玩转phpwind!</p>http://www.downcc.com/tech/186.htmlAsp编程2009/06/24 19:10:11<p>数据库连接:<br />& lt;%<br /> set conn=server.createobject(&quot;adodb.connection&quot;)<br /> conn.open& quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;server.mappath(&quot;数据库名&quot;)<br /> %&gt;</p>< p>打开数据库:</p>< p>exec=&quot;select * from 数据库表&quot;<br /> set rs=server.createobject(&quot;adodb.recordset&quot;)<br /> rs.open exec,conn,1,1< br /> 参数1,1为读取<br /> 读取内容格式:&lt;%=rs(&quot;字段&quot;)%&gt;<br /> 添加记录处理程序:</p>< p>&lt;%<br /> set conn=server.createobject(&quot;adodb.connection&quot;)<br /> conn.open& quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;server.mappath(&quot;数据库名&quot;)<br /> name=request.form(&quot;字段&quot;) name,tel,message为提交表单所设置的字段值<br /> tel=request.form(&quot;字段&quot;)<br /> message=request.form(&quot;字段&quot;)<br /> exec=&quot;insert into 表名(字段)values(';&quot;+字段+&quot;';)&quot; 多个用逗号隔开<br /> conn.execute exec 使用execute提交<br /> conn.close<br /> set conn=nothing<br /> %&gt;</p>< p>搜索处理程序:</p>< p>&lt;%<br /> name=request.form(&quot;字段&quot;) name,tel为提交表单所设置的字段值<br /> tel=request.form(&quot;字段&quot;)<br /> set conn=server.createobject(&quot;adodb.connection&quot;)<br /> conn.open& quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;server.mappath(&quot;数据库名&quot;)<br /> exec=&quot;select * from 表 where name=';&quot;+字段+&quot;'; and tel=&quot;+字段<br /> set rs=server.createobject(&quot;adodb.recordset&quot;)<br /> rs.open exec,conn,1,1<br /> %&gt;</p>< p>';页面搜索到的内容导出来</p>< p>&lt;%<br /> do while not rs.eof<br /> %&gt;&lt;tr&gt;<br />& lt;td&gt;&lt;%=rs(&quot;name&quot;)%&gt;&lt;/td&gt;<br />& lt;td&gt;&lt;%=rs(&quot;tel&quot;)%&gt;&lt;/td&gt;<br />& lt;td&gt;&lt;%=rs(&quot;time&quot;)%&gt;&lt;/td&gt;<br />& lt;/tr&gt;<br />& lt;%<br /> rs.movenext<br /> loop<br /> %&gt;</p>< p>删除记录处理程序:</p>< p>&lt;%<br /> set conn=server.createobject(&quot;adodb.connection&quot;)<br /> conn.open& quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;server.mappath(&quot;数据库名&quot;)<br /> exec=&quot;delete * from 表名 where 编号=&quot;&amp;request.form(&quot;id&quot;)<br /> conn.execute exec<br /> %&gt;</p>< p>修改记录处理程序:</p>< p>&lt;%<br /> set conn=server.createobject(&quot;adodb.connection&quot;)<br /> conn.open& quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;server.mappath(&quot;数据库名&quot;)<br /> exec=&quot;select * from 表名 where 编号=&quot;&amp;request.form(&quot;id&quot;)<br /> set rs=server.createobject(&quot;adodb.recordset&quot;)<br /> rs.open exec,conn,1,3 ';1,3为修改意思<br /> rs(&quot;name&quot;)=request.form(&quot;字段&quot;) ';name,tel,message为提交表单所设置的字段值<br /> rs(&quot;tel&quot;)=request.form(&quot;字段&quot;)<br /> rs(&quot;message&quot;)=request.form(&quot;字段&quot;)<br /> rs.update<br /> rs.close<br /> set rs=nothing<br /> conn.close<br /> set conn=nothing<br /> %&gt;</p>< p>修改记录执行程序:输入ID号页面&gt;&gt;&gt;导出相对应ID数据&gt;&gt;&gt;&gt;&gt;&gt;直接修改的处理程序<br /> 后台登陆处理程序例子:</p>< p>&lt;%<br /> dim name,password<br /> name=request.form(&quot;name&quot;)<br /> password=request.form(&quot;password&quot;)<br /> dim exec,conn,rs<br /> exec=&quot;select *from 表名 where(name=';&quot;&amp;字段&amp;&quot;'; and password=';&quot;&amp;字段&amp;&quot;';)&quot;<br /> set conn=server.createobject(&quot;adodb.connection&quot;)<br /> conn.open& quot;driver={microsoft access driver (*.mdb)};dbq=&quot;&amp;server.mappath(&quot;数据库名&quot;)<br /> set rs=server.createobject(&quot;adodb.recordset&quot;)<br /> rs.open exec,conn<br /> if not rs.eof then<br /> rs.Close<br /> conn.Close<br /> session(&quot;checked&quot;)=&quot;yes&quot;<br /> session(&quot;check&quot;)=&quot;right&quot;<br /> response.Redirect& quot;index.asp&quot;<br /> else<br /> session(&quot;checked&quot;)=&quot;no&quot;<br /> session(&quot;check&quot;)=&quot;wrong&quot;<br /> response.Redirect& quot;login.asp&quot;<br /> end if<br /> %&gt;</p>< p>每个后台页面加上:</p>< p>&lt;%if not session(&quot;checked&quot;)=&quot;yes&quot; then ';session里面定义一个checked字符串变量<br /> response.Redirect& quot;login.asp&quot;< br /> else<br /> %&gt;</p>http://www.downcc.com/tech/185.html.Net编程2009/06/20 22:13:03<p>良好的习惯对于人的成长是非常重要的,良好的编程习惯对于我们编程能力的提高也是非常重要的。我们编程时要有良好的风格,源代码的逻辑简明清晰,易读易懂是好程序的重要标准。让我们的程序写得更加平易近人,更加生动对我们的编程是大有益处的。对我们的程序学习也能起到事半功倍的作用。编程过程中遵守的不成文的标准,对于我们和他人的交流和自己的再学习都是有益无害的。毕竟有时我们写的程序不是只给自己看的,也不是一时兴起,不管以后。 好的编码可使源代码的可读性强且意义清楚,与其他语言约定相一致,并且尽可能直观。</p>< p>1.错误(以外)的处理</p>< p>程序健壮性最基本要求就是程序错误的处理与捕捉,在ASP.NET中,错误的处理有和其他编程语言一样的机制,可以使用Try&hellip;Catch&hellip; Finally等方式,这一点和ASP相比具有较大的进步。而且,使用这些错误处理方法,可以大大提高程序的可读性和程序调试速度,在这几个优势结合的情况下,我们更加应该注意这一点。</p>< p>2.字符串的处理</p>< p>网页设计中,字符串的处理几乎是最常见的了。使用ASP.NET以后,字符串的处理比ASP的速度快,而且,在ASP.NET中,专门增加一个字符串处理类StringBulider,使用这个类可以完成一些常见的字符串操作,而最主要的,使用StringBuilder可以大大提高字符串处理速度。</p>< p>在ASP.NET中,最常见的就是使用&ldquo;&amp;&rdquo;来连接两个字符串:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p><span twffan="done" style="color: #000000">Dim myOutputString As String< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000">< /span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">My name is</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000"><br /> Dim myInputString As String< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000">< /span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000"> Alex</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000"><br /> myOutputString< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000"> myOutputString< /span><span twffan="done" style="color: #000000">&amp;</span><span twffan="done" style="color: #000000"> myInputString<br /> Response.Write(myoutputString)</span></p>< /td>< /tr>< /tbody>< /table>< /p>< p>现在,我们来看看StringBuilder的使用,在使用StringBuilder的时候,我们对字符串可以做一些基本的操作,比如Append、Replace、Insert、Remove等,现在我们来看具体举例。</p>< p>(1)StringBuilder中Append的使用</p>< p>Append和其他语言的Append一样,就是在字符串最后增加其他字符。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p><span twffan="done" style="color: #000000">Dim sb< /span><span twffan="done" style="color: #0000ff">as</span><span twffan="done" style="color: #000000"> StringBuilder< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000"> New StringBuilder()<br /> sb.append(< /span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">&lt;table border=\\\'1\\\' width=\\\'80%\\\'&gt;</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000"> )<br /> For i< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000">< /span><span twffan="done" style="color: #800080">0</span><span twffan="done" style="color: #000000"> To RowCount< /span><span twffan="done" style="color: #000000">-</span><span twffan="done" style="color: #000000">< /span><span twffan="done" style="color: #800080">1</span><span twffan="done" style="color: #000000"><br /> sb.Append(</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">&lt;tr&gt;</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000">)<br /> For k< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000">< /span><span twffan="done" style="color: #800080">0</span><span twffan="done" style="color: #000000"> To ColCount< /span><span twffan="done" style="color: #000000">-</span><span twffan="done" style="color: #000000">< /span><span twffan="done" style="color: #800080">1</span><span twffan="done" style="color: #000000"><br /> sb.Append(</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">&lt;td&gt;</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000">)<br /> sb.Append( dt.Rows(i).Item(k, DataRowVersion.Current).toString())<br /> sb.Append(< /span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">&lt;/td&gt;</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000"> )<br /> Next<br /> sb.Append(</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">&lt;tr&gt;</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000">)<br /> Next<br /> sb.Append(< /span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #800000">&lt;/table&gt;</span><span twffan="done" style="color: #800000">&quot;</span><span twffan="done" style="color: #000000">)<br /> Dim strOutput< /span><span twffan="done" style="color: #0000ff">as</span><span twffan="done" style="color: #000000"> String< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000"> sb.ToString()<br /> lblCompany.Text< /span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #000000"> strOutput</span></p>< /td>< /tr>< /tbody>< /table>< /p>< p>在以上的程序中,用Append方法实现了一个表格的输出,需要注意的一点是,StringBulider必须首先使用ToString()方法将其转化为String类型才可以直接输出。在以上的举例中,我们看到的全部是Append一个直接的字符串,其实,这个方法有一个很方便的功能,那就是可以直接 Append其他类型的变量,比如可以直接Appemd一个Integer类型的数值,当然,我们输出以后自动转化为一个字符串:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p><span twffan="done" style="color: #000000">Sub Page_Load(Source As Object, E As EventArgs)<br /> Dim sb As System.Text.StringBuilder<br /> Dim varother As Integer<br /> varother</span><span twffan="done" style="color: #000000">=</span><span twffan="done" style="color: #80008http://www.downcc.com/tech/184.html.Net编程2009/06/20 22:10:00<p>两个截取字符串的实用方法(超过一定长度自动换行)< br /> 1/**////< br /> 2 /// 截取字符串,不限制字符串长度<br /> 3 ///< br /> 4 /// 待截取的字符串<br /> 5 /// 每行的长度,多于这个长度自动换行<br /> 6 ///< br /> 7 public string CutStr(string str,int len)<br /> 8 { string s=&quot;&quot;;<br /> 9< br /> 10 for(int i=0;i 11 {<br /> 12 int r= i% len;<br /> 13 int last =(str.Length/len)*len;<br /> 14 if (i!=0& amp;&amp; i&lt;=last)<br /> 15 {<br /> 16< br /> 17 if( r==0)<br /> 18 {<br /> 19 s+=str.Substring(i-len,len)+&quot;<br />& quot;;<br /> 20 }<br /> 21< br /> 22 }<br /> 23 else if (i&gt;last)<br /> 24 {<br /> 25 s+=str.Substring(i-1) ;<br /> 26 break;<br /> 27 }<br /> 28< br /> 29 }<br /> 30< br /> 31 return s;<br /> 32< br /> 33 }<br /> 34<br /> 35<br /> 36 /**////< br /> 37 /// 截取字符串并限制字符串长度,多于给定的长度+。。。<br /> 38 ///< br /> 39 /// 待截取的字符串<br /> 40 /// 每行的长度,多于这个长度自动换行<br /> 41 /// 输出字符串最大的长度<br /> 42 ///< br /> 43 public string CutStr(string str,int len,int max)<br /> 44 {<br /> 45 string s=&quot;&quot;;<br /> 46 string sheng=&quot;&quot;;<br /> 47 if (str.Length& gt;max)<br /> 48 {<br /> 49 str=str.Substring(0,max) ;<br /> 50 sheng=&quot;&quot;;<br /> 51 }<br /> 52 for(int i=0;i 53 {<br /> 54 int r= i% len;<br /> 55 int last =(str.Length/len)*len;<br /> 56 if (i!=0& amp;&amp; i&lt;=last)<br /> 57 {<br /> 58< br /> 59 if( r==0)<br /> 60 {<br /> 61 s+=str.Substring(i-len,len)+&quot;<br />& quot;;<br /> 62 }<br /> 63< br /> 64 }<br /> 65 else if (i&gt;last)<br /> 66 {<br /> 67 s+=str.Substring(i-1) ;<br /> 68 break;<br /> 69 }<br /> 70< br /> 71 }<br /> 72< br /> 73 return s+sheng;<br /> 74< br /> 75 }</p>http://www.downcc.com/tech/183.htmlPHP编程2009/06/20 22:06:33<p>虽然 LAMP 组合很不错,但是如果想要架设一台同时支持PHP、ASP、ASP.NET、JSP、Perl的Web虚拟主机服务器,还是用 Windows 2003的IIS 6最好。网上有很多介绍在IIS 6上配置PHP的文章,但是那些方法不是性能不好,就是升级麻烦。下面的方法可以让你在第一次配置好后,能够非常方便的进行升级。</p>< p>这里所说的升级,是指从某个php4版本升级到另一个php4版本,或者从某个php5版本升级到另一个php5版本,而不是指从php4升级到php5。</p>< p>准备:</p>< p>1、一台安装好的 Windows 2003 服务器,并且已经安装了 IIS 6。</p>< p>2、下载 windows 版的 PHP 二进制压缩包</p>< p>安装:</p>< p>解压缩 PHP 二进制压缩包到 C:php 目录下(这里假设 C: 盘是系统盘,即安装了Windows 系统的盘,如果系统盘是 D: 盘,则解压缩到 D:php 目录下,以此类推,下同)。</p>< p>然后打开&ldquo;我的电脑&rdquo;-&gt;&ldquo;属性&rdquo;-&gt;&ldquo;高级&rdquo;-&gt;&ldquo;环境变量&rdquo;-&gt;&ldquo;系统变量&rdquo;-&gt;&ldquo;path&rdquo;,编辑其值,在前面增加下面的路径地址:</p>< p>C:php;C:phpdlls;C:phpextensions;C:phpsapi;</p>< p>将 php.ini-dist 或 php.ini-recommended 复制到 C:Windows 目录下,并改名为 php.ini,一般正式发布网站的服务器用 php.ini-dist,而作为调试用的服务器用 php.ini-recommended 更好。当然一般情况下,这个 php.ini 还是需要根据实际情况来修改的。</p>< p>下面来介绍一下几个必要的修改选项:</p>< p>extension_dir =& quot;C:phpextensions&quot;</p>< p>这个是 PHP 扩展所放置的目录,请确保跟你实际安装的目录相同。</p>< p>extension=php_mbstring.dll</p>< p>;extension=php_big_int.dll</p>< p>extension=php_bz2.dll</p>< p>extension=php_cpdf.dll</p>< p>extension=php_crack.dll</p>< p>extension=php_curl.dll</p>< p>extension=php_db.dll</p>< p>extension=php_dba.dll</p>< p>extension=php_dbase.dll</p>< p>extension=php_dbx.dll</p>< p>extension=php_domxml.dll</p>< p>;extension=php_exif.dll</p>< p>;extension=php_fdf.dll</p>< p>;extension=php_filepro.dll</p>< p>extension=php_gd2.dll</p>< p>extension=php_gettext.dll</p>< p>extension=php_hyperwave.dll</p>< p>extension=php_iconv.dll</p>< p>;extension=php_ifx.dll</p>< p>;extension=php_iisfunc.dll</p>< p>extension=php_imap.dll</p>< p>;extension=php_interbase.dll</p>< p>extension=php_java.dll</p>< p>extension=php_ldap.dll</p>< p>;extension=php_mcrypt.dll</p>< p>extension=php_mhash.dll</p>< p>extension=php_mime_magic.dll</p>< p>extension=php_ming.dll</p>< p>extension=php_mssql.dll</p>< p>extension=php_msql.dll</p>< p>;extension=php_oci8.dll</p>< p>extension=php_openssl.dll</p>< p>;extension=php_oracle.dll</p>< p>extension=php_pdf.dll</p>< p>extension=php_pgsql.dll</p>< p>;extension=php_printer.dll</p>< p>extension=php_shmop.dll</p>< p>;extension=php_snmp.dll</p>< p>extension=php_sockets.dll</p>< p>;extension=php_sybase_ct.dll</p>< p>extension=php_w32api.dll</p>< p>extension=php_xmlrpc.dll</p>< p>extension=php_xslt.dll</p>< p>extension=php_yaz.dll</p>< p>extension=php_zip.dll</p>< p>上面这些,开头没有加分号的是打开的扩展,加了分号的是没有打开的扩展。上面的设置包含了在 Windows 2003 上默认安装情况下可以打开所有扩展(这里列出的是 php 4 的)。</p>< p>session.save_path = c:sessions</p>< p>这个是 session 文件默认保存的目录,这个目录必须是一个存在的目录,不然默认的 session 功能会无效。我这里设置的是一个 ramdisk 上的一个目录。将 session.save_path 设置在 ramdisk 上可以加快 session 处理的速度。如果你没有安装 ramdisk,你可以把它指定到其他盘的任何一个目录下,如 C:sessions 目录、C:WindowsTemp 目录等。</p>< p>OK,基本工作作完了,现在该配置 IIS 了。</p>< p>打开&ldquo; Internet 信息服务(IIS)管理器&rdquo;,在&ldquo; Web 服务扩展&rdquo;里,选择&ldquo;添加一个新的 Web 服务扩展&rdquo;,扩展名可填写&ldquo;PHP ISAPI 扩展&rdquo;,要求的文件选择:C:phpsapiphp4isapi.dll(如果安装的是 PHP5,则此处是 C:phpsapiphp5isapi.dll,下同),并设置扩展状态为允许。</p>< p>打开&ldquo;网站&rdquo;-&gt;&ldquo;属性&rdquo;-&gt;&ldquo;ISAPI 筛选器&rdquo;-&gt;&ldquo;添加&rdquo;,筛选器名称可填写&ldquo;PHP&rdquo;,可执行文件仍然选择 C:phpsapiphp4isapi.dll。</p>< p>打开&ldquo;网站&rdquo;-&gt;&ldquo;属性&rdquo;-&gt;&ldquo;主目录&rdquo;-&gt;&ldquo;应用程序设置&rdquo;-&gt;&ldquo;配置&rdquo;-&gt;&ldquo;应用程序扩展&rdquo;-&gt;&ldquo;添加&rdquo;,可执行文件还是选择 C:phpsapiphp4isapi.dll。扩展名填写&ldquo;.php&rdquo;,动作限制为&ldquo;HEAD,GET,POST&rdquo;。</p>< p>打开&ldquo;网站&rdquo;-&gt;&ldquo;属性&rdquo;-&gt;&ldquo;文档&rdquo;-&gt;&ldquo;启用默认内容文档&rdquo;-&gt;&ldquo;添加&rdquo;,可以将 index.php 添加为默认内容文档。</p>< p>然后选择&ldquo;服务器机器名&rdquo;-&gt;&ldquo;所有任务&rdquo;-&gt;&ldquo;重新启动 IIS&rdquo;来重启 IIS。</p>< p>测试</p>< p>在默认网站发布目录下,建立一个测试页面:</p>< p>下载:phptest.php</p>< p>phpinfo();</p>< p>?&gt;</p>< p>如果打开这个页面能够看到 php 安装配置信息,就算是安装成功了。</p>< p>如果想要更优化的执行 php 程序,可以安装 ZendOptimizer-2.6.0-Windows-i386.exe ,这个东西安装非常简单,这里就不介绍了。</p>< p>升级</p>< p>现在升级就非常简单了。只需要将新版本的 PHP 二进制压缩包下载下来,将原来的 C:php 目录删除,将新版本解压缩到 C:php 目录中,然后重新启动一下 IIS 就可以了。不需要修改任何配置,也不需要往 System32 目录中复制任何文件。是不是很方便啊?</p>http://www.downcc.com/tech/182.htmlPHP编程2009/06/20 22:04:02<p>变量类型变化(juggling)</p>< p>PHP不需要(或者说不支持)在声名变量明确他的变量类型;一个变量的类型是由这个变量被使用的前后关系来决定的,也就是说,如果你给一个变量var赋了 一个字符串的值,var就变成了字符串变量。如果你再将一个整数赋值给var,他又变成了一个整数型变量。</p>< p>一个PHP自动转化变量类型的例子是加法的操作符&rsquo;+&rsquo;。如果任何一个操作数都是双精度数,那么所有的操作数被当作双精度数求值,并且结果也是双精度数。 否则,操作数将被认为是整数,结果也将会是整数。注意这并不影响每个操作数本身的变量类型,唯一的变化就是操作数在计算的过程中被如何处理。</p>< p>$foo=& quot;0&quot;; // $foo 是一个字符串 ,值是&ldquo;0&rdquo;(ASCII 48)< br /> $foo++; // $foo 是一个字符串,值是&ldquo;1&rdquo;(ASCII 49)< br /> $foo+= 1; // $foo 现在是一个整数(2)了< br /> $foo= $foo + 1.3; // $foo 现在是一个双精度数(3.3)了< br /> $foo= 5 +& quot;10 Little Piggies&quot;; // $foo 是一个整数 (15)< br /> $foo= 5 +& quot;10 Small Pigs&quot;; // $foo 是一个整数 (15)</p>< p>如果你觉得上面例子中最后两个表达式看起来有点奇怪的话,请看& ldquo;字符串的转化&rdquo;部分。</p>< p>如果你希望强制一个变量被当作某种固定的类型来计算,请看& ldquo;类型强制(casting)&rdquo; 一节。如果你希望转变一个变量的类型,请看函数&ldquo;settype()&rdquo;的说明。</p>< p>确定一个变量的类型</p>< p>因为PHP自己决定变量的类型并且一般按照需要转化他们,一个特定的变量的类型不是在任何时间都非常明显。PHP包括一些函数可以找出这个变量的类型。这 些函数是gettype(), is_long(), is_double(), is_string(), is_array(), 和 is_object().</p>< p>类型强制(type casting)</p>< p>在PHP中类型强制同在C语言中大抵相似:将需要的类型的种类写在要强制的变量的前面的圆括号中。</p>< p>$foo= 10; // $foo 是一个整数< br /> $bar= (double) $foo; // $bar 是一个双精度数</p>< p>以下的强制方式是允许的:</p>< p>(int), (integer)& ndash; 强制成整数< br /> (real), (double), (float)& ndash; 强制成双精度数< br /> (string)& ndash; 强制成字符串< br /> (array)& ndash; 强制成数组< br /> (object)& ndash; 强制成对象</p>< p>注意在圆括号中允许制表符(tabs)和空格(spaces) ,因此下面的语句是等价的:</p>< p>$foo= (int) $bar;< br /> $foo= ( int ) $bar;</p>< p>字符串转化</p>< p>当一个字符串被当作数字型的值来计算时,他的结果和类型如下面所述的决定。</p>< p>如果这个字符串含有字符&rsquo;.&rsquo;,&rsquo;e&rsquo;,或者&rsquo;E&rsquo;,则被当作双精度类型变量来处理,否则当作是整数。</p>< p>这个字符串的值由词首部分决定。如果这个字符串以任何有效的数字的数据开始,那么这个数字数据就是这个字符串参加运算的值。否则,值为零(zero)。有 效的数字数据是遵循下面的这些标记的,跟随在一个或多个数字后面(可以包含小数点),跟随在一个可选的指数后面。指数是由一个或多个数字跟在&rsquo;e&rsquo;或& rsquo;E&rsquo;后面构成的。</p>< p>$foo= 1 +& quot;10.5&quot;; // $foo 是双精度数 (11.5)< br /> $foo= 1 +& quot;-1.3e3&quot;; // $foo 是双精度数(-1299)< br /> $foo= 1 +& quot;bob-1.3e3&quot;; // $foo 是整数 (1)< br /> $foo= 1 +& quot;bob3&quot;; // $foo 是整数 (1)< br /> $foo= 1 +& quot;10 Small Pigs&quot;; // $foo 是整数 (11)<br /> $foo= 1 +& quot;10 Little Piggies&quot;; // $foo 是整数 (11);</p>< p>// 这个字符串包括字符'e'</p>< p>获取更多信息,请参考Unix手册关于strtod(3)的部分。</p>http://www.downcc.com/tech/181.htmlPHP编程2009/06/20 22:01:06<p>文件读取函式</p>< p>//文件读取函式</p>< p>function PHP_Read($file_name) {</p>< p>$fd=fopen($file_name,r);</p>< p>while($bufline=fgets($fd, 4096)){</p>< p>$buf.=$bufline;</p>< p>}</p>< p>fclose($fd);</p>< p>return $buf;</p>< p>}</p>< p>?&gt;</p>< p>文件写入函式</p>< p>//文件写入函式</p>< p>function PHP_Write($file_name,$data,$method=&quot;w&quot;) {</p>< p>$filenum=@fopen($file_name,$method);</p>< p>flock($filenum,LOCK_EX);</p>< p>$file_data=fwrite($filenum,$data);</p>< p>fclose($filenum);</p>< p>return $file_data;</p>< p>}</p>< p>?&gt;</p>< p>静态页面生成函式</p>< p>//静态页面生成函式</p>< p>function phptohtm($filefrom,$fileto,$u2u=1){</p>< p>if($u2u==1){</p>< p>$data=PHP_Read($filefrom);</p>< p>}else{</p>< p>$data=$filefrom;</p>< p>}</p>< p>PHP_Write($fileto,$data);</p>< p>return true;</p>< p>}</p>< p>?&gt;</p>< p>指定条件信息数量检索函式</p>< p>//指定条件信息数量检索函式</p>< p>function rec_exist($table,$where){</p>< p>$query=&quot;select count(*) as num from $table& quot;.$where;</p>< p>$result=mysql_query($query) or die(nerror(1));</p>< p>$rowcount=mysql_fetch_array($result);</p>< p>$num=$rowcount[&quot;num&quot;];</p>< p>if ($num==0){</p>< p>return false;</p>< p>}</p>< p>return $num;</p>< p>}</p>< p>?&gt;</p>< p>目录删除函式</p>< p>//目录删除函式</p>< p>function del_DIR($directory){</p>< p>$mydir=dir($directory);</p>< p>while($file=$mydir-&gt;read()){</p>< p>if((is_dir(&quot;$directory/$file&quot;)) AND ($file!=&quot;.&quot;) AND ($file!=&quot;..&quot;)){</p>< p>del_DIR(&quot;$directory/$file&quot;);</p>< p>}else{</p>< p>if(($file!=&quot;.&quot;) AND ($file!=&quot;..&quot;)){</p>< p>unlink(&quot;$directory/$file&quot;);</p>< p>//echo& quot;unlink $directory/$file ok& quot;;</p>< p>}</p>< p>}</p>< p>}</p>< p>$mydir-&gt;close();</p>< p>rmdir($directory);</p>< p>//echo& quot;rmdir $directory ok& quot;;</p>< p>}</p>< p>?&gt;</p>< p>目录名称合法性检测函式</p>< p>//目录名称合法性检测</p>< p>function isen($str){</p>< p>$ret=&quot;&quot;;</p>< p>for($i=0;$i $p=ord(substr($str,$i,1));</p>< p>if(($p&lt;48& amp; $p!=45& amp; $p!=46) || ($p&gt;57& amp; $p&lt;65) || ($p&gt;90& amp; $p&lt;97& amp; $p!=95) || $p&gt;122){</p>< p>nerror(&quot;不符合规范!&quot;);</p>< p>}</p>< p>$ret.=chr($p);</p>< p>}</p>< p>return $ret;</p>< p>}</p>< p>?&gt;</p>< p>分页函式</p>< p>//分页函式</p>< p>function splitlist($HALT,$LRLIST,$ECHOCNT,$paper,$table,$where,$page_id,$userid){</p>< p>global $splitstr,$sumcnt;</p>< p>if($paper==&quot;&quot; || $sumcnt==&quot;&quot;){</p>< p>$query=& quot;select count(*) as num from $table $where&quot;;</p>< p>$result= mysql_query($query);</p>< p>$row= mysql_fetch_array($result);</p>< p>$sumcnt=$row[&quot;num&quot;];</p>< p>if($sumcnt==0){</p>< p>nerror(&quot;该版内还没有选择发布新闻 !&quot;);</p>< p>}</p>< p>$paper=1;</p>< p>}</p>< p>$sumpaper=($sumcnt-$sumcnt%$ECHOCNT)/$ECHOCNT;</p>< p>if(($sumcnt%$ECHOCNT)!=0) $sumpaper+=1;</p>< p>if($sumpaper==1& amp;&amp; $HALT==0) return($where);</p>< p>$enwhere=base64_encode(base64_encode($where));</p>< p>if(($LRLIST*2+1)& lt; $sumpaper){</p>< p>if(($paper-$LRLIST)& lt; 2){</p>< p>$tract=1;</p>< p>$sub=$LRLIST*2+1;</p>< p>}else if(($paper+$LRLIST)& gt;= $sumpaper){</p>< p>$tract=$sumpaper-($LRLIST*2);</p>< p>$sub=$sumpaper;</p>< p>}else{</p>< p>$tract=$paper-$LRLIST;</p>< p>$sub=$paper+$LRLIST;</p>< p>}</p>< p>}else{</p>< p>$tract=1;</p>< p>$sub=$sumpaper;</p>< p>}</p>< p>$uppaper=$paper-1;</p>< p>$downpaper=$paper+1;</p>< p>$startcnt=($paper-1)*$ECHOCNT;</p>< p>$where.=&quot; limit ${ startcnt },${ ECHOCNT }&quot;;</p>< p>if($tract& gt; 1) { $splitstr=&quot;【& lt;&lt;& quot;; }</p>< p>else $splitstr=&quot;【& lt;&lt;& quot;;</p>< p>for($i=$tract;$i&lt;=$sub;$i++){</p>< p>if ($i!=$paper) $splitstr.=&quot;&quot;.$i.&quot;& quot;;</p>< p>else $splitstr.=&quot;&quot;.$i.&quot;& quot;;</p>< p>}</p>< p>if ($sub!=$sumpaper) $splitstr.=&quot;&gt;&gt; 】&quot;;</p>< p>else $splitstr.=&quot;&gt;&gt; 】&quot;;</p>< p>return($where);</p>< p>}</p>< p>?&gt;</p>< p>关于分页函式的使用说明</p>< p>/*</p>< p>#### 检索分页函式 ####</p>< p>Int $HALT - 检索结果仅分1页时是否(1/0)显示页码条</p>< p>Int $LRLIST - (页码条显示页码数-1)/2</p>< p>Int $ECHOCNT - 检索时每页显示记录的数量</p>< p>Int $paper - 页数,预提取:$paper=$HTTP_GET_VARS[paper];</p>< p>Varchar $table - 数据表名,预附值:$table=&quot;db.table&quot;;</p>< p>Varchar $where - 检索条件,预附值:$where=&quot;where field='value'&quot;;</p>< p>Varchar $enwhere - 将原$where进行两次base64_encode()编码后以GET的方式提交</p>< p>Varchar $splitstr - 页码条输出字串,执行函式后在相应的位置执行 echo $splitstr;</p>< p>函式调用前需获取变量 -</p>< p>$paper=$HTTP_GET_VARS[paper];</p>< p>$sumcnt=$HTTP_GET_VARS[sumcnt];</p>< p>$enwhere=$HTTP_GET_VARS[enwhere];</p>< p>Return (Varchar $where) - 分页后检索语句的检索条件</p>< p>注意:本函式需调用出错处理函式 nerror($error);</p>< p>*/</p>< p>图片文件上传函式</p>< p>//图片文件上传函式</p>< p>function upload_img($UploadFile,$UploadFile_name,$UploadFile_size,$UploadPath,$max_size=64){</p>< p>//$TimeLimit=60; //设置超时限制时间 缺省时间为 30秒 设置为0时为不限时</p>< p>//set_time_limit($TimeLimit);</p>< p>if(($UploadFile!=& quot;none&quot; )&amp;&amp;($UploadFile !=& quot;&quot; )){</p>< p>$FileName=$UploadPath.$UploadFile_name;</p>< p>if($UploadFile_size& lt;1024){</p>< p>$FileSize=&quot;(string)$UploadFile_size&quot; .& quot;字节&quot;;</p>< p>}elseif($UploadFile_size& lt;(1024 * $max_size)){</p>< p>$FileSize=number_format((double)($UploadFile_size / 1024), 1) .& quot; KB&quot;;</p>< p>}else{</p>< p>nerror(&quot;文件超过限制大小!&quot;);</p>< p>}</p>< p>//{</p>< p>//$FileSize=&quot;number_format((double)($UploadFile_size&quot; / (1024 * 1024)), 1) .& quot; MB&quot;;</p>< p>// }</p>< p>if(!file_exists($FileName)){</p>< p>if(copy($UploadFile,$FileName)){</p>< p>return& quot;$UploadFile_name ($FileSize)&quot;;</p>< p>}else{</p>< p>nerror(&quot;文件 $UploadFile_name 上载失败!&quot;);</p>< p>}</p>< p>unlink($UploadFile);</p>< p>}else{</p>< p>nerror(&quot;文件 $UploadFile_name 已经存在!&quot;);</p>< p>}</p>< p>//set_time_limit(30); //恢复缺省超时设置</p>< p>}</p>< p>}</p>< p>以下是一些小技巧:</p>< p>如何判断ip地址合法性</p>< p>if(!strcmp(long2ip(sprintf(&quot;%u&quot;,ip2long($ip))),$ip)) echo& quot;is ipn&quot;;</p>< p>----</p>< p>email的正则判断</p>< p>eregi(&quot;^[_.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z_-]+.)+[a-zA-Z]$&quot;, $email);</p>< p>检测ip地址和mask是否合法的例子</p>< p>$ip= '192.168.0.84';</p>< p>$mask= '255.255.255.0';</p>< p>$network= '192.168.0';</p>< p>$ip= ip2long($ip);</p>< p>$mask= ip2long($mask);</p>< p>$network= ip2long($network);</p>< p>if( ($ip& amp; $mask) == $network) echo& quot;valid ip and maskn&quot;;</p>< p>?&gt;</p>< p>----</p>< p>文件下载头部输出如何设定</p>< p>header(&quot;Content-type: application/x-download&quot;);</p>< p>header(&quot;Content-Disposition: attachment; filename=$file_download_name;&quot;);</p>< p>header(&quot;Accept-Ranges: bytes&quot;);</p>< p>header(&quot;Content-Length: $download_size&quot;);</p>< p>echo 'xxx'</p>< p>用header输出ftp下载方式,并且支持断点续传</p>< p>一个例子:</p>< p>header('Pragma: public');</p>< p>header('Cache-Control: private');</p>< p>header('Cache-Control: no-cache, must-revalidate');</p>< p>header('Accept-Ranges: bytes');</p>< p>header('Connection: close');</p>< p>header(&quot;Content-Type: audio/mpeg&quot;);</p>< p>header(&quot;Location:ftp://download:1bk3l4s3k9s2@232.2.22.22/2222/web技术开发知识库/cn_web.rmvb&quot;);</p>< p>正则匹配中文</p>< p>ereg(&quot;^[&quot;.chr(0xa1).&quot;-&quot;.chr(0xff).&quot;]+$&quot;, $str);</p>< p>批量替换文本里面的超级链接</p>< p>function urlParhttp://www.downcc.com/tech/180.htmlAsp编程2009/06/20 21:46:54<p>一个网站空间,但是却可以实现多个域名的访问的一段ASP代码:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font><br />& lt;%<br /> if Request.ServerVariables(&quot;SERVER_NAME&quot;)=&quot;www.abc.com&quot; then<br /> response.redirect& quot;abc/&quot;<br /> else if Request.ServerVariables(&quot;SERVER_NAME&quot;)=&quot;www.123.com&quot; then<br /> response.redirect& quot;123/&quot;<br /> else if Request.ServerVariables(&quot;SERVER_NAME&quot;)=&quot;www.456.com&quot; then<br /> response.redirect& quot;456/&quot;<br /> end if<br /> end if<br /> end if<br /> %&gt;</td>< /tr>< /tbody>< /table>< /p>http://www.downcc.com/tech/179.htmlAsp编程2009/06/20 21:29:59<p>在ASP编程中,身份认证可以说是常要用到的。但怎么样才能做到认证的安全呢?</p>< p>&nbsp;&nbsp;&nbsp; 表单提交页面:sub.htm< br />& lt;html&gt;< br />& nbsp;&nbsp;&nbsp;& lt;head&gt;< br />& nbsp;&nbsp;&nbsp;& lt;title&gt;管理员登陆</title&gt;< br />& nbsp;&nbsp;&nbsp;& lt;body&gt;< br />& nbsp;&nbsp;&nbsp;& lt;form name=&quot;form1&quot; method=&quot;post&quot; action=&quot;sub.asp&quot;&gt;< br />& nbsp;&nbsp;&nbsp;& lt;p&gt; 管理员:< br />& nbsp;&nbsp;&nbsp;& lt;input type=&quot;text&quot; name=&quot;UserID&quot; size=&quot;25&quot; maxlength=&quot;20&quot;&gt;<br />& nbsp;&nbsp;&nbsp; 密 码:< br />& nbsp;&nbsp;&nbsp;& lt;input type=&quot;text&quot; name=&quot;Pass&quot; size=&quot;12&quot; maxlength=&quot;20&quot;&gt;< br />& nbsp;&nbsp;&nbsp;& lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;提交&quot;&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/p&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/form&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/body&gt;< br />& nbsp;&nbsp;&nbsp;& lt;/html&gt;</p>< p>&nbsp;&nbsp;&nbsp; SUB.asp程序< br />& nbsp;&nbsp;&nbsp;& lt;%< br />& nbsp;&nbsp;&nbsp; 接收表单中的数据< br />& nbsp;&nbsp;&nbsp; user=request.from(&quot;UserID&quot;)< br />& nbsp;&nbsp;&nbsp; 检察表单提交的数据是否为空(表单页面可能你用JAVASCRIPT OR VBSCRIPT控制了,但这里也不要忘记控制!< br />& nbsp;&nbsp;&nbsp; if user=&quot;&quot; then< br />& nbsp;&nbsp;&nbsp; 转到出错提示页面!< br />& nbsp;&nbsp;&nbsp; response.redirect& quot;err1.htm&quot;< br />& nbsp;&nbsp;&nbsp; 这一句可能没用,但加上为好!< br />& nbsp;&nbsp;&nbsp; response.end< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; pass=request.from(&quot;Pass&quot;)< br />& nbsp;&nbsp;&nbsp; if pass=&quot;&quot; then< br />& nbsp;&nbsp;&nbsp; response.redirect& quot;err2.htm&quot;< br />& nbsp;&nbsp;&nbsp; response.end< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; 联接<font color="#000000">数据库</font>< br />& nbsp;&nbsp;&nbsp; file=server.mappath(&quot;你的数据库&quot;)< br />& nbsp;&nbsp;&nbsp; set conn=server.createobject(&quot;adodb.connection&quot;)< br />& nbsp;&nbsp;&nbsp; dr=&quot;driver={microsoft< font color="#000000">access</font> driver (*.mdb)};dbq=&quot;&amp;file< br />& nbsp;&nbsp;&nbsp; conn.open dr< br />& nbsp;&nbsp;&nbsp; set rs=server.createobject(&quot;adodb.recordset&quot;)< br />& nbsp;&nbsp;&nbsp; 关键是这里的SQL语言< br />& nbsp;&nbsp;&nbsp; sql=&quot;select * from 表 where user=& quot;&amp;user&amp;&quot; and pass=& quot;&amp;pass&amp;&quot;& quot;< br />& nbsp;&nbsp;&nbsp; rs.open sql< br />& nbsp;&nbsp;&nbsp; if not rs.eof then< br />& nbsp;&nbsp;&nbsp; 找到的话就进入管理页面< br />& nbsp;&nbsp;&nbsp; reponse.redirect& quot;login.asp&quot;< br />& nbsp;&nbsp;&nbsp; else< br />& nbsp;&nbsp;&nbsp; 没找到就进入错误页面< br />& nbsp;&nbsp;&nbsp; response.write& quot;err3.htm&quot;< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; %&gt;</p>< p>&nbsp;&nbsp;&nbsp; 大家感觉以上代码应该没问题啊,但是这里有一个严重的安全隐患:</p>< p>&nbsp;&nbsp;&nbsp; 我如果想登录管理员的话可以在SUb.htm表单输入框中输入:</p>< p>&nbsp;&nbsp;&nbsp; 第一个文本框中输入:a or 1 = 1 或 OR =</p>< p>&nbsp;&nbsp;&nbsp; 第二个文本框中输入:a or 1 = 1 或 OR =</p>< p>&nbsp;&nbsp;&nbsp; 提交,大家会看到...&ldquo;呜,听我说完好不好,砖头一会再丢过来...&quot;</p>< p>&nbsp;&nbsp;&nbsp;& quot;a& quot; 和&ldquo;1&rdquo;为任意字符</p>< p>&nbsp;&nbsp;&nbsp; 有人会问为什么你输入这些字符会以管理员身份进入呢??</p>< p>&nbsp;&nbsp;&nbsp; 其实这些字符是对你程序中SQL语言的欺骗,而成功进入的</p>< p>&nbsp;&nbsp;&nbsp; 大家看:开始程序SQL中是对表进行查询满足user=& quot;&amp;user&amp;&quot; and pass=& quot;&amp;pass&amp;&quot;& quot;条件的记录</p>< p>&nbsp;&nbsp;&nbsp; sql=&quot;select * from 表 where user=& quot;&amp;user&amp;&quot; and pass=& quot;&amp;pass&amp;&quot;& quot;</p>< p>&nbsp;&nbsp;&nbsp; 我而输入上面的代码后就成了:</p>< p>&nbsp;&nbsp;&nbsp; sql=&quot;select * from 表 where user= a or 1 = 1 and pass= a or 1 = 1& quot;</p>< p>&nbsp;&nbsp;&nbsp; 大家看看,能有不进入的理由吗??给我一个不进入的理由,先!</p>< p>&nbsp;&nbsp;&nbsp; 以上USER PASS字段为字符型 如果是数字型也一样的道理!</p>< p>&nbsp;&nbsp;&nbsp; 解决方法:</p>< p>&nbsp;&nbsp;&nbsp; 一、函数替代法:</p>< p>&nbsp;&nbsp;&nbsp; 用REPLACE将用户端输入的内容中含有特殊字符进行替换,达到控制目的啊!sql=&quot;select * from 表 where user=& quot;&amp;replace(user,&quot;& quot;,&quot;& quot;)&amp;&quot; and pass=& quot;&amp;replace(pass,&quot;& quot;,&quot;& quot;)&amp;&quot;& quot;</p>< p>&nbsp;&nbsp;&nbsp; 这种方法每次只能替换一个字符,其实危险的字符不只是&quot;& quot;,还有如&quot;&gt;&quot;、&quot;&lt;&quot;、&quot;&amp;&quot;、&quot;%&quot;等字符应该全控制起来。但用REPLACE函数好象不太胜任那怎么办呢??</p>< p>&nbsp;&nbsp;&nbsp; 二、程序控制法</p>< p>&nbsp;&nbsp;&nbsp; 用程序来对客户端输入的内容全部控制起来,这样能全面控制用户端输入的任何可能的危险字符或代码,我就的这个方法!<br />& lt;%< br />& nbsp;&nbsp;&nbsp; 捕捉用户端提交的表单内容< br />& nbsp;&nbsp;&nbsp; user=request.from(&quot;user&quot;)< br />& nbsp;&nbsp;&nbsp; pass=request.from(&quot;pass&quot;)< br />& nbsp;&nbsp;&nbsp; ...< br />& nbsp;&nbsp;&nbsp; 循环控制开始< br />& nbsp;&nbsp;&nbsp; for i=1 to len(user)< br />& nbsp;&nbsp;&nbsp; 用MID函数读出变量user中i 位置的一个字符< br />& nbsp;&nbsp;&nbsp; us=mid(user,i,1)< br />& nbsp;&nbsp;&nbsp; 将读出的字符进行比较< br />& nbsp;&nbsp;&nbsp; if us=&quot;& quot; or us=&quot;%&quot; or us=&quot;&lt;&quot; or us=&quot;&gt;&quot; or us=&quot;&amp;&quot; then< br />& nbsp;&nbsp;&nbsp; 如果含有以上字符将出错提示,不能含有以上特殊字符< br />& nbsp;&nbsp;&nbsp; response.redirect& quot;err2.htm&quot;< br />& nbsp;&nbsp;&nbsp; response.end< br />& nbsp;&nbsp;&nbsp; end if< br />& nbsp;&nbsp;&nbsp; next< br />& nbsp;&nbsp;&nbsp; ...< br />& nbsp;&nbsp;&nbsp; %&gt;</p>http://www.downcc.com/tech/178.htmlAsp编程2009/06/20 21:23:48<p>在一次ASP程序中不能正常连接MSSQL出现出错信息如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font>< p>HTTP/1.1 200 OK Server: Microsoft-IIS/5.1 Date: Sun, 11 Jun 2006 00:59:27 GMT Connection: close Content-Length: 65 Content-Type: text/html Cache-control: private</p>< center><img src="http://www.chinaz.com/images/tenpay/chinaz.asp?date=11-21" alt="" /></center></td>< /tr>< /tbody>< /table>< /p>< p>HTTP/1.1 401 错误: 拒绝访问。</p>< p>程序源文件:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word"><font color="#ff0000">以下为引用的内容:</font>< p>&lt;%< br /> dim SqlLocalName,SqlUsername,SqlPassword,SqlDatabaseName,Conn,ConnStr,db,Err_OpenDatabase< br /> SqlLocalName =&quot;(local)&quot; '连接IP [ 本地用 (local) 外地用IP ]< br /> SqlUsername =&quot;sa&quot; '用户名< br /> SqlPassword =&quot;zhengque&quot; '用户密码< br /> SqlDatabaseName=&quot;vnut&quot; '数据库名< br /> Set conn = Server.CreateObject(&quot;ADODB.Connection&quot;)< br /> connstr =& quot;Provider=Sqloledb; User ID=&quot;& amp; SqlUsername& amp;& quot;; Password=&quot;& amp; SqlPassword& amp;& quot;; Initial Catalog =& quot;& amp; SqlDatabaseName& amp;& quot;; Data Source=&quot;& amp; SqlLocalName& amp;& quot;;&quot;< br /> conn.Open connstr< br /> sub CloseConn()< br /> On Error Resume Next< br /> Conn.close< br /> set Conn=nothing< br /> end sub< br /> %&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>原因是:</p>< p>要不就是</p>< p>你的sa密码不对</p>< p>要不就是你的mssql没启动。</p>http://www.downcc.com/tech/175.htmlXml编程2009/06/19 18:15:56<p>已知有一个XML文档(bookstore.xml)如下:</p>< p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;<br />& lt;bookstore&gt;<br />& lt;book genre=&quot;fantasy&quot; ISBN=&quot;2-3631-4&quot;&gt;<br />& lt;title&gt;Oberons Legacy&lt;/title&gt;<br />& lt;author&gt;Corets, Eva&lt;/author&gt;<br />& lt;price&gt;5.95&lt;/price&gt;<br />& lt;/book&gt;<br />& lt;/bookstore&gt;</p>< p>1、往&lt;bookstore&gt;节点中插入一个&lt;book&gt;节点:</p>< p>XmlDocument xmlDoc=new XmlDocument();<br /> xmlDoc.Load(&quot;bookstore.xml&quot;);<br /> XmlNode root=xmlDoc.SelectSingleNode(&quot;bookstore&quot;);//查找&lt;bookstore&gt;<br /> XmlElement xe1=xmlDoc.CreateElement(&quot;book&quot;);//创建一个&lt;book&gt;节点<br /> xe1.SetAttribute(&quot;genre&quot;,&quot;李赞红&quot;);//配置该节点genre属性<br /> xe1.SetAttribute(&quot;ISBN&quot;,&quot;2-3631-4&quot;);//配置该节点ISBN属性</p>< p>XmlElement xesub1=xmlDoc.CreateElement(&quot;title&quot;);<br /> xesub1.InnerText=&quot;CS从入门到精通&quot;;//配置文本节点<br /> xe1.AppendChild(xesub1);//添加到&lt;book&gt;节点中<br /> XmlElement xesub2=xmlDoc.CreateElement(&quot;author&quot;);<br /> xesub2.InnerText=&quot;候捷&quot;;<br /> xe1.AppendChild(xesub2);<br /> XmlElement xesub3=xmlDoc.CreateElement(&quot;price&quot;);<br /> xesub3.InnerText=&quot;58.3&quot;;<br /> xe1.AppendChild(xesub3);</p>< p>root.AppendChild(xe1);//添加到&lt;bookstore&gt;节点中<br /> xmlDoc.Save(&quot;bookstore.xml&quot;);</p>< p><br /> //================<br /> 结果为:</p>< p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;<br />& lt;bookstore&gt;<br />& lt;book genre=&quot;fantasy&quot; ISBN=&quot;2-3631-4&quot;&gt;<br />& lt;title&gt;Oberons Legacy&lt;/title&gt;<br />& lt;author&gt;Corets, Eva&lt;/author&gt;<br />& lt;price&gt;5.95&lt;/price&gt;<br />& lt;/book&gt;<br />& lt;book genre=&quot;李赞红&quot; ISBN=&quot;2-3631-4&quot;&gt;<br />& lt;title&gt;CS从入门到精通&lt;/title&gt;<br />& lt;author&gt;候捷&lt;/author&gt;<br />& lt;price&gt;58.3&lt;/price&gt;<br />& lt;/book&gt;<br />& lt;/bookstore&gt;</p>< p>2、修改节点:将genre属性值为&ldquo;李赞红&ldquo;的节点的genre值改为&ldquo;update李赞红&rdquo;,将该节点的子节点&lt;author&gt;</p>< p>的文本修改为&ldquo;亚胜&rdquo;。</p>< p>XmlNodeList nodeList=xmlDoc.SelectSingleNode(&quot;bookstore&quot;).ChildNodes;//获取bookstore节点的任何子节</p>< p>点<br /> foreach(XmlNode xn in nodeList)//遍历任何子节点<br /> {<br /> XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型<br /> if(xe.GetAttribute(&quot;genre&quot;)==&quot;李赞红&quot;)//假如genre属性值为&ldquo;李赞红&rdquo;<br /> {<br /> xe.SetAttribute(&quot;genre&quot;,&quot;update李赞红&quot;);//则修改该属性为&ldquo;update李赞红&rdquo;</p>< p>XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的任何子节点<br /> foreach(XmlNode xn1 in nls)//遍历<br /> {<br /> XmlElement xe2=(XmlElement)xn1;//转换类型<br /> if(xe2.Name==&quot;author&quot;)//假如找到<br /> {<br /> xe2.InnerText=&quot;亚胜&quot;;//则修改<br /> break;//找到退出来就能够了<br /> }<br /> }<br /> break;<br /> }<br /> }</p>< p>xmlDoc.Save(&quot;bookstore.xml&quot;);//保存。</p>< p>//=================</p>< p>最后结果为:</p>< p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;<br />& lt;bookstore&gt;<br />& lt;book genre=&quot;fantasy&quot; ISBN=&quot;2-3631-4&quot;&gt;<br />& lt;title&gt;Oberons Legacy&lt;/title&gt;<br />& lt;author&gt;Corets, Eva&lt;/author&gt;<br />& lt;price&gt;5.95&lt;/price&gt;<br />& lt;/book&gt;<br />& lt;book genre=&quot;update李赞红&quot; ISBN=&quot;2-3631-4&quot;&gt;<br />& lt;title&gt;CS从入门到精通&lt;/title&gt;<br />& lt;author&gt;亚胜&lt;/author&gt;<br />& lt;price&gt;58.3&lt;/price&gt;<br />& lt;/book&gt;<br />& lt;/bookstore&gt;</p>< p>3、删除& lt;book genre=&quot;fantasy&quot; ISBN=&quot;2-3631-4&quot;&gt;节点的genre属性,删除& lt;book genre=&quot;update李赞红&quot;</p>< p>ISBN=&quot;2-3631-4&quot;&gt;节点。</p>< p>XmlNodeList xnl=xmlDoc.SelectSingleNode(&quot;bookstore&quot;).ChildNodes;</p>< p>foreach(XmlNode xn in xnl)<br /> {<br /> XmlElement xe=(XmlElement)xn;</p>< p>if(xe.GetAttribute(&quot;genre&quot;)==&quot;fantasy&quot;)<br /> {<br /> xe.RemoveAttribute(&quot;genre&quot;);//删除genre属性<br /> }<br /> else if(xe.GetAttribute(&quot;genre&quot;)==&quot;update李赞红&quot;)<br /> {<br /> xe.RemoveAll();//删除该节点的全部内容<br /> }<br /> }<br /> xmlDoc.Save(&quot;bookstore.xml&quot;);</p>< p>//====================</p>< p>最后结果为:</p>< p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;<br />& lt;bookstore&gt;<br />& lt;book ISBN=&quot;2-3631-4&quot;&gt;<br />& lt;title&gt;Oberons Legacy&lt;/title&gt;<br />& lt;author&gt;Corets, Eva&lt;/author&gt;<br />& lt;price&gt;5.95&lt;/price&gt;<br />& lt;/book&gt;<br />& lt;book&gt;<br />& lt;/book&gt;<br />& lt;/bookstore&gt;</p>< p>4、显示任何数据。</p>< p><br /> XmlNode xn=xmlDoc.SelectSingleNode(&quot;bookstore&quot;);</p>< p>XmlNodeList xnl=xn.ChildNodes;</p>< p>foreach(XmlNode xnf in xnl)<br /> {<br /> XmlElement xe=(XmlElement)xnf;<br /> Console.WriteLine(xe.GetAttribute(&quot;genre&quot;));//显示属性值<br /> Console.WriteLine(xe.GetAttribute(&quot;ISBN&quot;));</p>< p>XmlNodeList xnf1=xe.ChildNodes;<br /> foreach(XmlNode xn2 in xnf1)<br /> {<br /> Console.WriteLine(xn2.InnerText);//显示子节点点文本<br /> }<br /> }</p>< p>public static string DataToXml(string _ip,string _xmlType,bool _issavexml,string</p>< p>_contenttype,string _message,string _sendtime,string _toip)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return null;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataParser dp = new DataParser();<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.Message = _message;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.IP = _ip;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.XmlType = _xmlType;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.isSaveXml = _issavexml;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.ContentType = _contenttype;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.Sendtime = _sendtime;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.Toip = _toip;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument doc = new XmlDocument();<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlDeclaration newDec = doc.CreateXmlDeclaration(&quot;1.0&quot;,null,null);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.AppendChild(newDec);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlElement newRoot = doc.CreateElement(&quot;Requests&quot;);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.AppendChild(newRoot);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlElement newtitle = doc.CreateElement(&quot;Request&quot;);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtitle.SetAttribute(&quot;time&quot;, dp.Sendtime);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newRoot.AppendChild(newtitle);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlElement from = doc.CreateElement(&quot;from&quot;);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from.SetAttribute(&quot;ip&quot;, dp.IP);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from.SetAttribute(&quot;type&quot;, dp.XmlType);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from.SetAttribute(&quot;ctntype&quot;, dp.ContentType);<br />http://www.downcc.com/tech/174.htmlPHP编程2009/06/19 18:13:47<p>1、防止跳出web目录</p>< p>首先修改httpd.conf,如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行:</p>< p>php_admin_value open_basedir /usr/local/apache</p>< p>/htdocs</p>< p>这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打开的话会提示这样的错误:</p>< p>Warning: open_basedir restriction in effect. File is in wrong directory in</p>< p>/usr/local/apache/htdocs/open.php on line 4</p>< p>等等。</p>< p>2、防止php木马执行webshell</p>< p>打开safe_mode,</p>< p>在,php.ini中设置</p>< p>disable_functions= passthru,exec,shell_exec,system</p>< p>二者选一即可,也可都选</p>< p>3、防止php木马读写文件目录</p>< p>在php.ini中的</p>< p>disable_functions= passthru,exec,shell_exec,system</p>< p>后面加上php处理文件的函数</p>< p>主要有</p>< p>fopen,mkdir,rmdir,chmod,unlink,dir</p>< p>fopen,fread,fclose,fwrite,file_exists</p>< p>closedir,is_dir,readdir.opendir</p>< p>fileperms.copy,unlink,delfile</p>< p>即成为</p>< p>disable_functions= passthru,exec,shell_exec,system,fopen,mkdir,rmdir,chmod,unlink,dir</p>< p>,fopen,fread,fclose,fwrite,file_exists</p>< p>,closedir,is_dir,readdir.opendir</p>< p>,fileperms.copy,unlink,delfile</p>< p>ok,大功告成,php木马拿我们没辙了,遗憾的是这样的话,利用文本数据库的那些东西就都不能用了。</p>< p>如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限,这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。</p>< p>net user apache fuckmicrosoft /add</p>< p>net localgroup users apache /del</p>< p>ok.我们建立了一个不属于任何组的用户apche。</p>< p>我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码,重启apache服务,ok,apache运行在低权限下了。</p>< p>实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。</p>http://www.downcc.com/tech/173.htmlAsp编程2009/06/19 17:57:44<p>Form集合</p>< p>注意因为本ASP实例教程是关于表单的代码,为了省事,所以我不截图了!大家自行测试实例执行结果!</p>< p>一个Form集合的简单应用</p>< p>本例演示Form集合如何从表单取回值。此表单使用POST方法,这意味着发送的信息对用户来说是不可见的,并且对对所发送信息的量没有限制(可发送大量的信息)。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;form action=&quot;/example/aspe/demo_aspe_simpleform1.asp&quot; method=&quot;post&quot;&gt;<br /> First name:<br />& lt;input type=&quot;text&quot; name=&quot;fname&quot; value=&quot;Donald&quot; /&gt;<br />& lt;br /&gt;<br /> Last name:<br />& lt;input type=&quot;text&quot; name=&quot;lname&quot; value=&quot;Duck&quot; /&gt;<br />& lt;br /&gt;<br />& lt;input type=&quot;submit&quot; value=&quot;Submit&quot; /&gt;<br />& lt;/form&gt;<br />& lt;%<br /> Response.Write(Request.Form)<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>如何使用来自表单的信息</p>< p>本例演示如何使用从表单取回的信息。我们使用了Form集合。表单使用了POST方法。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;form action=&quot;/example/aspe/demo_aspe_simpleform.asp&quot; method=&quot;post&quot;&gt;<br /> 您的姓名:&lt;input type=&quot;text&quot; name=&quot;fname&quot; size=&quot;20&quot; /&gt;<br />& lt;input type=&quot;submit&quot; value=&quot;提交&quot; /&gt;<br />& lt;/form&gt;<br />& lt;%<br /> dim fname<br /> fname=Request.Form(&quot;fname&quot;)<br /> If fname&lt;&gt;&quot;&quot; Then<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;您好!&quot;& amp; fname& amp;& quot;!&lt;br /&gt;&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;今天过得怎么样?&quot;)<br /> End If<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>来自表单的更多信息</p>< p>本例演示假如若干的输入域使用了相同的名称,Form集合会包含什么信息。它将展示如何把这些相同的名称分割开来。它也会展示如何使用count关键词来对&quot;name&quot;属性进行计数。此表单使用POST方法。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;form action=&quot;/example/aspe/demo_aspe_form2.asp&quot; method=&quot;post&quot;&gt;<br /> First name:<br />& lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;Donald&quot; /&gt;<br />& lt;br /&gt;<br /> Last name:<br />& lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;Duck&quot; /&gt;<br />& lt;br /&gt;<br />& lt;input type=&quot;submit&quot; value=&quot;Submit&quot; /&gt;<br />& lt;/form&gt;<br />& lt;hr /&gt;<br />& lt;p&gt;来自上面的表单的信息:&lt;/p&gt;<br />& lt;%<br /> If Request.Form(&quot;name&quot;)&lt;&gt;&quot;&quot; Then<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;&lt;p&gt;&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;name=&quot;& amp; Request.Form(&quot;name&quot;))<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;&lt;/p&gt;&lt;p&gt;&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;name 属性的数目:&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(Request.Form(&quot;name&quot;).Count)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;&lt;/p&gt;&lt;p&gt;&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;First name=&quot;& amp; Request.Form(&quot;name&quot;)(1))<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;&lt;/p&gt;&lt;p&gt;&quot;)< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;Last name=&quot;& amp; Request.Form(&quot;name&quot;)(2))<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;&lt;/p&gt;&quot;)< br /> End if<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>带有单选按钮的表单</p>< p>本例演示如何使用Form集合通过单选按钮与用户进行交互。此表单使用POST方法。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;%<br /> dim cars<br /> cars=Request.Form(&quot;cars&quot;)<br /> %&gt;<br />& lt;body&gt;<br />& lt;form action=&quot;/example/aspe/demo_aspe_radiob.asp&quot; method=&quot;post&quot;&gt;<br />& lt;p&gt;请选择您喜欢的汽车:&lt;/p&gt;<br />& lt;input type=&quot;radio&quot; name=&quot;cars&quot;<br />& lt;%if cars=&quot;Volvo&quot; then Response.Write(&quot;checked&quot;)%&gt;<br /> value=&quot;Volvo&quot;&gt;Volvo&lt;/input&gt;<br />& lt;br /&gt;<br />& lt;input type=&quot;radio&quot; name=&quot;cars&quot;<br />& lt;%if cars=&quot;Saab&quot; then Response.Write(&quot;checked&quot;)%&gt;<br /> value=&quot;Saab&quot;&gt;Saab&lt;/input&gt;<br />& lt;br /&gt;<br />& lt;input type=&quot;radio&quot; name=&quot;cars&quot;<br />& lt;%if cars=&quot;BMW&quot; then Response.Write(&quot;checked&quot;)%&gt;<br /> value=&quot;BMW&quot;&gt;BMW&lt;/input&gt;<br />& lt;br /&gt;&lt;br /&gt;<br />& lt;input type=&quot;submit&quot; value=&quot;提交&quot; /&gt;<br />& lt;/form&gt;<br />& lt;%<br /> if cars&lt;&gt;&quot;&quot; then<br />& nbsp;&nbsp; Response.Write(&quot;&lt;p&gt;您喜欢的汽车是&quot;& amp; cars& amp;& quot;&lt;/p&gt;&quot;)<br /> end if<br /> %&gt;<br /> http://www.downcc.com/tech/170.htmlXml编程2009/06/14 15:11:05<p>XML Web Service 是在 Internet 上进行分布式计算的基本构造块。开放的标准以及对用户和应用程序之间的通信和协作的关注产生了这样一种环境,在这种环境下,XML Web Service 成为应用程序集成的平台。应用程序是通过使用多个不同来源的 XML Web Service 构造而成的,这些服务相互协同工作,而不管它们位于何处或者如何实现。<br /> 有多少个构建 XML Web Service 的公司,就可能有多少种 XML Web Service 定义。不过几乎所有定义都具有以下共同点:< br /> XML Web Service 通过标准的 Web 协议向 Web 用户提供有用的功能。多数情况下使用 SOAP 协议。< br /> XML Web Service 可以非常详细地说明其接口,这使用户能够创建客户端应用程序与它们进行通信。这种说明通常包含在称为 Web 服务说明语言 (WSDL) 文档的 XML 文档中。< br /> XML Web Service 已经过注册,以便潜在用户能够轻易地找到这些服务,这是通过通用发现、说明和集成 (UDDI) 来完成的。</p>< p>本文将介绍这三种技术,但首先需要解释一下为什么要关注 XML Web Service。<br /> XML Web Service 体系结构的主要优点之一是:允许在不同平台上、以不同语言编写的各种程序以基于标准的方式相互通信。对这一行业有所了解的用户可能马上会说:&ldquo;等一等,CORBA 和之前的 DCE 不是都做过相同的承诺吗?这和它们有什么区别?&rdquo;最重要的区别在于:SOAP 比以前的方法要简单得多,因此要实现与标准兼容的 SOAP,障碍也要少得多。Paul Kulchenko 在 http://www.soapware.org/directory/4/implementations(英文)上提供了一个 SOAP 实现方案的列表。上次统计时,该列表已经包含了 79 项。正如您所预料,多数大的软件公司都提供 SOAP 实现方案,但也有许多实现方案是由个别开发人员创建和维护的。相对以前的方案而言,XML Web Service 的另一大优点是使用标准的 Web 协议 - XML、HTTP 和 TCP/IP。许多公司都已经建立了 Web 基础结构,同时它们的员工在维护方面也都具备相应的知识和经验。因此,引入 XML Web Service 与引入以前的技术相比,其成本要低得多。<br /> 我们将 XML Web Service 定义为:通过 SOAP 在 Web 上提供的软件服务,使用 WSDL 文件进行说明,并通过 UDDI 进行注册。那么,您也许要问:&ldquo;使用 XML Web Service 能够做什么?&rdquo;最初的 XML Web Service 通常是可以方便地并入应用程序的信息来源,如股票价格、天气预报、体育成绩等等。我们很容易想到,可以构建一整类应用程序以分析和汇总所关心的信息,并以各种方式提供这些信息;例如,您可以使用 Microsoft&reg; Excel 电子表格来汇总所有的财务信息 - 股票、401K、银行存款、贷款等等。如果能够通过 XML Web Service 获得这些信息,Excel 就可以不断对其进行更新。这些信息中有些是免费的,有些则可能需要订阅才能获得相应服务。大部分这种信息现在已经可以在 Web 上找到了,但是 XML Web Service 可以使编程访问更简单,也更可靠。<br /> 以 XML Web Service 方式提供现有应用程序,可以构建新的、更强大的应用程序,并利用 XML Web Service 作为构造块。例如,用户可以开发一个采购应用程序,以自动获取来自不同供应商的价格信息,从而使用户可以选择供应商,提交订单,然后跟踪货物的运输,直至收到货物。而供应商的应用程序除了在 Web 上提供服务外,还可以使用 XML Web Service 检查客户的信用、收取货款,并与货运公司办理货运手续。<br /> 将来,某些最有趣的 XML Web Service 所支持的应用程序还可以利用 Web 完成目前无法完成的任务。例如,日历服务就是 Microsoft .NET My Services(英文)项目即将支持的服务之一。如果您的牙医和机械师通过这一 XML Web Service 提供其日程安排,您就可以通过网络与他们安排约会;如果您愿意,他们也可以直接在您的日历上约定清洁和日常保养的日期。不难想象,只要能够对 Web 进行编程,您就可以创建数以百计的应用程序。<br /> 有关 XML Web Service 及其可以构建的应用程序的详细信息,请参阅 MSDN Web 服务(英文)主页。< br /> SOAP</p>< p>Soap 是 XML Web Service 的通信协议。当把 SOAP 描述为一种通信协议时,多数人都会想到 DCOM 或 CORBA,并且会问&ldquo;SOAP 如何激活对象?&rdquo;或&ldquo;SOAP 使用什么样的命名服务?&rdquo;等问题。虽然 SOAP 实现方案可能会包含上述内容,但 SOAP 标准并未对其进行规定。SOAP 一种规范,用来定义消息的 XML 格式 - 这是规范中所必需的部分。包含在一对 SOAP 元素中的、结构正确的 XML 段就是 SOAP 消息。这是不是很简单?<br /> SOAP 规范的其他部分介绍如何将程序数据表示为 XML,以及如何使用 SOAP 进行远程过程调用 (RPC)。这些可选的规范部分用于实现 RPC 形式的应用程序,其中客户端将发出一条 SOAP 消息(包含可调用函数,以及要传送到该函数的参数),然后服务器将返回包含函数执行结果的消息。目前,多数 SOAP 实现方案都支持 RPC 应用程序,这是因为习惯于开发 COM 或 CORBA 应用程序的编程人员熟悉 RPC 形式。SOAP 还支持文档形式的应用程序,在这类应用程序中,SOAP 消息只是 XML 文档的一个包装。文档形式的 SOAP 应用程序非常灵活,许多新的 XML Web Service 都利用这一特点来构建使用 RPC 难以实现的服务。<br /> SOAP 规范的最后一个可选部分定义了包含 SOAP 消息的 HTTP 消息的样式。此 HTTP 绑定非常重要,因为几乎所有当前的 OS(以及许多以前的 OS)都支持 HTTP。HTTP 绑定虽然是可选的,但几乎所有 SOAP 实现方案都支持 HTTP 绑定,因为它是 SOAP 的唯一标准协议。由于这一原因,人们通常误认为 SOAP 必须使用 HTTP。其实,有些实现方案也支持 MSMQ、MQ 系列、SMTP 或 TCP/IP 传输,但由于 HTTP 非常普遍,几乎所有当前的 XML Web Service 都使用它。由于 HTTP 是 Web 的核心协议,因此大多数组织的网络基础结构都支持 HTTP,并且员工已经了解了如何对其进行管理。如今,已经建立了用于 HTTP 的安全保护、监视和负载平衡的基础结构。<br /> 开始使用 SOAP 时,最容易混淆的是 SOAP 规范及其许多实现方案之间的差异。多数使用 SOAP 的用户并不直接编写 SOAP 消息,而是使用 SOAP 工具包来创建和分析 SOAP 消息。这些工具包通常将函数调用从某种语言转换为 SOAP 消息。例如,Microsoft SOAP Toolkit 2.0 将 COM 函数调用转换为 SOAP,而 Apache Toolkit 将 JAVA 函数调用转换为 SOAP。函数调用的类型和支持的参数的数据类型随每个 SOAP 实现方案的不同而不同,因此适用于一个工具包的函数可能并不适用于另一个工具包。这并不是 SOAP 的限制,而是所使用的特定实现方案的限制。<br /> 到目前为止,SOAP 最引人注目的特征是它可以在许多不同的软件和硬件平台上实现。这意味着 SOAP 可用于链接企业内部和外部的不同系统。过去曾试过多种方法以提出一个可用于系统集成的通用通信协议,但它们都没有象 SOAP 一样获得广泛的认可。为什么呢?因为与许多早期的协议相比,SOAP 更小巧,而且更易于实现。例如,DCE 和 CORBA 的实现需要数年时间,所以只发布了很少几个实现方案。而 SOAP 可以利用现有的 XML 分析器和 HTTP 库完成大部分艰苦的工作,因此 SOAP 实现方案在数月内便可完成。这就是为什么现在已经有 70 多个 SOAP 实现方案的原因。当然,SOAP 并不具备 DCE 或 CORBA 的全部功能,虽然功能减少了,但由于其复杂程度大大降低了,因此 SOAP 更易于应用。<br /> HTTP 的普及和 SOAP 的简单性使您几乎可以从任何环境调用它们,因此成为 XML Web Service 的理想基础。有关 SOAP 的详细信息,请参阅 MSDN SOAP(英文)主页。< br /> 安全性如何?</p>< p>通常,刚接触 SOAP 的用户提出的第一个问题就是 SOAP 如何解决安全性问题。在其早期开发阶段,SOAP 被看作是基于 HTTP 的协议,所以认为 HTTP 的安全性对于 SOAP 已经足够了。毕竟目前有数以千计的 Web 应用程序都在使用 HTTP 安全性,所以这对于 SOAP 确实已经足够。因此,当前的 SOAP 标准假定安全性属于传输问题,而并不作为安全性问题处理。<br /> 当 SOAP 扩展至更为通用的协议,并运行于众多传输之上时,安全性问题就变得突出了。例如,HTTP 提供若干种方法对进行 SOAP 调用的用户进行身份验证,但是当消息从 HTTP 路由到 SMTP 传输时,怎样传播该身份标识呢?SOAP 是作为构造块协议进行设计的,所以幸运的是,已经有了相应的规范以基于 SOAP 为 Web 服务提供额外的安全保护功能。WS-Security 规范(英文)定义了一套完整的加密系统,而 WS-License 规范(英文)定义了相应的技术,以保证调用者的身份标识,并确保只有授权用户才可以使用 Web 服务。< br /> WSDL</p>< p>WSDL (Web Services Description Language) 表示 Web 服务说明语言。在本文中,我们可以认为 WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。换句话说,WSDL 对于 SOAP 的作用就象 IDL 对于 CORBA 或 COM 的作用。由于 WSDL 是 XML 文档,因此很容易进行阅读和编辑;但大多数情况下,它由软件生成和使用。<br /> 要查看 WSDL 的值,可以假设您要调用由您的一位业务伙伴提供的 SOAP 方法。您可以要求对方提供一些 SOAP 消息示例,然后编写您的应用程序以生成并使用与示例类似的消息,但这样很容易出错。例如,您可能看到一个 2837 的客户 ID,并假设它为整数,而实际上它是一个字符串。WSDL 通过明确的表示法指定请求消息必须包含的内容以及响应消息的样式。<br /> WSDL 文件用于说明消息格式的表示法以 XML 架构标准为基础,这意味着它与编程语言无关,而且以标准为基础,因此适用于说明可从不同平台、以不同编程语言访问的 XML Web Service 接口。除说明消息内容外,WSDL 还定义了服务的位置,以及使用什么通信协议与服务进行通信。也就是说,WSDL 文件定义了编写使用 XML Web Service 的程序所需的全部内容。有几种工具可以读取 WSDL 文件,并生成与 XML Web http://www.downcc.com/tech/169.htmlPHP编程2009/06/14 15:07:36<p>本文讨论的是如何彻底杜绝warning: Cannot add header information - headers already sent in......&nbsp; 这种令人莫明其妙的的错误。</p>< p>只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它...............</p>< p>看了PHP手册,回答如下:</p>< p>消息&ldquo;Warning: Cannot send session cookie - headers already sent。。。&rdquo;或者&ldquo;Cannot add header information - headers already sent。。。&rdquo;。</p>< p>函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。请参阅&ldquo;输出控制函数&rdquo;。</p>< p>意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这答案并不令人满意。因为往往程序在其他PHP环境下运行却正常。<br />& nbsp;</p>< p>首先:这错误是怎么产生的呢?让我们来看看PHP是如何处理HTTP header输出和主体输出的。</p>< p>PHP脚本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。而后继续发送主体数据。从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。</p>< p>好!那我们来解决它:</p>< p>笨方法:把错误警告全不显示!<br /> 掩耳盗铃之计,具体方法就不说了 ^_^#</p>< p>解决方案:</p>< p>1)适用于有权限编辑PHP。INI的人</p>< p>打开php。ini文件(你应试比我清楚你的php。ini在哪里),找到</p>< p>output_buffering =改为on或者任何数字。如果是IIS6,请一定改为ON,不然你的PHP效率会奇慢。</p>< p>2)使用虚拟主机,不能编辑PHP。INI,怎么办?</p>< p>简单:</p>< p>在你的空间根目录下建立一个。htaccess文件,内容如下:</p>< p>AllowOverride All< br /> PHP_FLAG output_buffering On</p>< p>不幸的情况是:还是不行?全部网页都不能显示啦?</p>< p>那么,你可以打电话骂一通空间商,然后让他给你把apache的。htaccess AllowOverride打开</p>< p>3)在PHP文件里解决</p>< p>ob_start()<br /> 启用output buffering机制。 Output buffering支持多层次 -- 例如,可以多次调用 ob_start() 函数。</p>< p>ob_end_flush()<br /> 发送output buffer(输出缓冲)并禁用output buffering机制。</p>< p>ob_end_clean()<br /> 清除output buffer但不发送,并禁用output buffering。</p>< p>ob_get_contents()<br /> 将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。</p>< p>原理:</p>< p>output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4。0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为header实际上并没有发送。当全部脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。</p>http://www.downcc.com/tech/168.htmlPHP编程2009/06/14 15:04:39http://www.downcc.com/tech/167.htmlAsp编程2009/06/14 15:00:42<p>变量用于存储信息。</p>< p>假如在子程序之外声明变量,那么这个变量可被 ASP 文件中的任何脚本改变。假如在子程序中声明变量,那么当子程序每次执行时,它才会被创建和撤销。</p>< p>实例:</p>< p>声明变量</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;</p>< p>&lt;body&gt;</p>< p>&lt;%</p>< p>dim name</p>< p>name=&quot;Donald Duck&quot;</p>< p>response.write(&quot;My name is:& quot;& amp; name)</p>< p>%&gt;</p>< p>&lt;/body&gt;</p>< p>&lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>变量用于存储信息。本例演示如何声明变量,为变量赋值,并在程序中使用这个变量</p>< p>声明数组</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;</p>< p>&lt;body&gt;</p>< p>&lt;%</p>< p>Dim fname(5),i</p>< p>fname(0) =& quot;George&quot;</p>< p>fname(1) =& quot;John&quot;</p>< p>fname(2) =& quot;Thomas&quot;</p>< p>fname(3) =& quot;James&quot;</p>< p>fname(4) =& quot;Adrew&quot;</p>< p>fname(5) =& quot;Martin&quot;</p>< p>For i = 0 to 5</p>< p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.write(fname(i)& amp;& quot;&lt;br /&gt;&quot;)<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;< br /> Next</p>< p>%&gt;</p>< p>&lt;/body&gt;</p>< p>&lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>数组用于存储一系列相关的数据项目。本例演示如何声明一个存储名字的数组。</p>< p>循环生成 HTML 标题</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;</p>< p>&lt;body&gt;</p>< p>&lt;%</p>< p>dim i</p>< p>for i=1 to 6</p>< p>&nbsp;&nbsp; response.write(&quot;&lt;h&quot;& amp; i& amp;& quot;&gt;Header& quot;& amp; i& amp;& quot;&lt;/h&quot;& amp; i& amp;& quot;&gt;&quot;)<br />& nbsp;&nbsp;< br /> next</p>< p>%&gt;</p>< p>&lt;/body&gt;</p>< p>&lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>如何循环生成 6 个不同的 HTML 标题。</p>< p>使用 Vbscript 制作基于时间的问候语</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;</p>< p>&lt;body&gt;</p>< p>&lt;%</p>< p>dim h</p>< p>h=hour(now())</p>< p>response.write(&quot;&lt;p&gt;&quot;& amp; now())</p>< p>response.write(&quot; (Beijing Time)& lt;/p&gt;&quot;)</p>< p>If h&lt;12 then</p>< p>&nbsp;&nbsp; response.write(&quot;Good Morning!&quot;)<br />& nbsp;&nbsp;< br /> else</p>< p>&nbsp;&nbsp; response.write(&quot;Good day!&quot;)<br />& nbsp;&nbsp;< br /> end if</p>< p>%&gt;</p>< p>&lt;/body&gt;</p>< p>&lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本例将根据服务器时间向用户显示不同的消息。</p>< p>使用 JavaScript 制作基于时间的问候语</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;%@ language=&quot;javascript&quot; %&gt;</p>< p>&lt;html&gt;</p>< p>&lt;body&gt;</p>< p>&lt;%</p>< p>var d=new Date()</p>< p>var h=d.getHours()</p>< p>Response.Write(&quot;&lt;p&gt;&quot;)</p>< p>Response.Write(d +& quot; (Beijing Time)&quot;)</p>< p>Response.Write(&quot;&lt;/p&gt;&quot;)</p>< p>if (h&lt;12)</p>< p>&nbsp;&nbsp; {<br />& nbsp;&nbsp;< br />& nbsp;&nbsp; Response.Write(&quot;Good Morning!&quot;)<br />& nbsp;&nbsp;< br />& nbsp;&nbsp; }<br />& nbsp;&nbsp;< br /> else</p>< p>&nbsp;&nbsp; {<br />& nbsp;&nbsp;< br />& nbsp;&nbsp; Response.Write(&quot;Good day!&quot;)<br />& nbsp;&nbsp;< br />& nbsp;&nbsp; }<br />& nbsp;&nbsp;< br /> %&gt;</p>< p>&lt;/body&gt;</p>< p>&lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本例同上,只是语法不同而已。</p>< p>变量的生存期</p>< p>在子程序外声明的变量可被 ASP 文件中的任何脚本访问和修改。</p>< p>在子程序中声明的变量只有当子程序每次执行时才会被创建和撤销。子程序外的脚本无法访问和修改该变量。</p>< p>如需声明供多个 ASP 文件使用的变量,请将变量声明为 session 变量或者 application 变量。</p>< p>Session 变量</p>< p>Session 变量用于存储单一用户的信息,并且对一个应用程序中的所有页面均有效。存储于 session 中的典型数据是姓名、id 或参数。</p>< p>Application 变量</p>< p>Application 变量同样对一个应用程序中的所有页面均有效。Application 变量用于存储一个特定的应用程序中所有用户的信息。</p>http://www.downcc.com/tech/166.htmlAsp编程2009/06/14 14:47:22<p>FileSystemObject 对象</p>< p>指定的文件存在吗?</p>< p>本例演示如何首先创建FileSystemObject对象,然后使用FileExists方法来探测某文件是否存在。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;%<br /> Set fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> If (fs.FileExists(&quot;c:\windows\cursors\xxx.cur&quot;))=true Then< br /> Response.Write(&quot;文件 c:\windows\cursors\xxx.cur 存在。&quot;)<br /> Else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;文件 c:\windows\cursors\xxx.cur 不存在。&quot;)<br /> End If<br /> set fs=nothing<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本实例运行结果如下:</p>< p>&nbsp;文件 c:\windows\cursors\xxx.cur 不存在。</p>< p>指定的文件夹存在吗?</p>< p>本例演示如何使用FolderExists方法探测某文件夹是否存在。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;%<br /> Set fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> If fs.FolderExists(&quot;c:\temp&quot;) = true Then<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;文件夹 c:\temp 存在。&quot;)<br /> Else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;文件夹 c:\temp 不存在。&quot;)<br /> End If<br /> set fs=nothing<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本实例运行结果如下:</p>< p>&nbsp;文件夹 c:\temp 不存在。</p>< p>指定的驱动器存在吗?</p>< p>本例演示如何使用DriveExists方法来探测某个驱动器是否存在。<br />& nbsp;<br /> 本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;%<br /> Set fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> if fs.driveexists(&quot;c:&quot;) = true then<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;驱动器 c: 存在。&quot;)<br /> Else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;驱动器 c: 不存在。&quot;)<br /> End If<br /> Response.write(&quot;&lt;br&gt;&quot;)<br /> if fs.driveexists(&quot;g:&quot;) = true then<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;驱动器 g: 存在。&quot;)<br /> Else<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&quot;驱动器 g: 不存在。&quot;)<br /> End If<br /> set fs=nothing<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本实例运行结果如下:</p>< p>&nbsp;驱动器 c: 存在。<br /> 驱动器 g: 存在。</p>< p>取得某个指定驱动器的名称</p>< p>本例演示如何使用GetDriveName方法来取得某个指定的驱动器的名称。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;%<br /> Set fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> p=fs.GetDriveName(&quot;c:\windows\cursors\abc.cur&quot;)<br /> Response.Write(&quot;驱动器名称是:&quot;& amp; p)<br /> set fs=nothing<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本实例运行结果如下:</p>< p>&nbsp;驱动器名称是:c:</p>< p>取得某个指定路径的父文件夹的名称</p>< p>本例演示如何使用GetParentFolderName方法来取得某个指定的路径的父文件夹的名称。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&nbsp;&lt;html&gt;<br />& lt;body&gt;<br />& lt;%<br /> Set fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> p=fs.GetParentFolderName(&quot;c:\winnt\cursors\3dgarro.cur&quot;)<br /> Response.Write(&quot;c:\windows\cursors\abc.cur 的父文件夹名称是:&quot;& amp; p)<br /> set fs=nothing<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>本实例运行结果如下:</p>< p>c:\windows\cursors\abc.cur 的父文件夹名称是:c:\winnt\cursors</p>< p>取得文件夹扩展名</p>< p>本例演示如何使用GetExtensionName方法来取得指定的路径中的最后一个成分的文件扩展名。</p>< p>本示例代码如下:</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted">< tbody>< tr>< td bgcolor="#fdfddf" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;html&gt;<br />& lt;body&gt;<br />& lt;%<br /> Set fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;)<br /> Response.Write(&quot;文件 3dgarro 的文件扩展名是:&quot;)<br /> Response.Write(fs.GetExtensionName(&quot;c:\windows\cursors\abc.cur&quot;))<br /> set fs=nothing<br /> %&gt;<br />& lt;/body&gt;<br />& lt;/html&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>&nbsp;本实例运行结果如下:</p>< p>&nbsp;文件 3dgarro 的文件扩展名是:cur</p>< p>取得文件名</p>< p>本例演示如何使用GetFileName方法来取得指定的路径中的最后一个成分的文件名。</p>http://www.downcc.com/tech/165.htmlXml编程2009/06/13 17:22:57<p>XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。</p>< p>上面这段是对XML的一个基本定义,一个被广泛接受的说明。简单说,XML就是一种数据的描述语言,虽然它是语言,但是通常情况下,它并不具备常见语言的基本功能&mdash;&mdash;被计算机识别并运行。只有依靠另一种语言,来解释它,使它达到你想要的效果或被计算机所接受。</p>< p>假如你是刚接触XML的新手,那么可能并无法从定义上是了解XML是什么。也许,你可以换个角度来认识XML是什么;从应用面来认识XML,从XML可以做些什么来认识它,这应该能比那更空洞的定义对你更有帮助。</p>< p>XML应用面主要分为两种类型,文档型和数据型。下面介绍一下几种常见的XML应用:</p>< p>1、自定义XML+XSLT=&gt;HTML,最常见的文档型应用之一。XML存放整个文档的XML数据,然后XSLT将XML转换、解析,结合XSLT中的HTML标签,最终成为HTML,显示在浏览器上。典型的例子就是CSDN上的帖子。</p>< p>2、XML作为微型数据库,这是最常见的数据型应用之一。我们利用相关的XML API(MSXML DOM、JAVA DOM等)对XML进行存取和查询。留言板的实现中,就经常可以看到用XML作为数据库。</p>< p>3、作为通信数据。最典型的就是WEB SERVICE,利用XML来传递数据。</p>< p>4、作为一些应用程序的配置信息数据。常见的如J2EE配置WEB服务器时用的web.XML。</p>< p>5、其他一些文档的XML格式。如WORD、EXCEL等。</p>< p>6、保存数据间的映射关系。如Hibernate。</p>< p>这里介绍的6种应用,基本涵盖了XML的主要用途。总之,XML是一种抽象的语言,它不如传统的程序语言那么具体。要深入的认识它,应该先从它的应用入手,选择一种你需要的用途,然后再学习如何使用。</p>http://www.downcc.com/tech/164.html.Net编程2009/06/13 17:19:32<p>ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点。Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论。我将在以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助。</p>< p>ASP.NET MVC设计的主要原则之一是可扩展性。处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的。因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中。</p>< p>在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点。</p>< p>1.RouteConstraint</p>< p>通常情况下你可以使用正则表达式对url参数进行约束,但如果您的约束不仅仅取决于单一参数,您可以实现IRouteConstrains的方法,并在其中添加你的验证逻辑。</p>< p>比如对日期的验证,url中可能会包含年、月、日,而你需要验证这三者是否可以组合成一个有效的日期。</p>< p>2.RouteHandler</p>< p>RouteHandler是在路由选择之后进行处理的组件,它并不仅仅针对ASP.NET MVC。显然,如果您改变了RouteHandler,那么对请求的处理将不再使用ASP.NET MVC,但这在您使用其他HttpHandler或经典的WebForm进行路由处理时却是非常有用的。</p>< p>3.ControllerFactory</p>< p>ControllerFactory是基于路由的组件,它选择正确的controller并对其实例化。default factory会查找实现了IController并且以Controller结尾的类,然后通过反射使用无参构造函数进行实例化。</p>< p>但如果您希望使用依赖注入,就不能再使用default factory,而必须使用支持IoC的controller factory。MvcContrib和Ninject Controller Factory都包含支持IoC容器的controller factory。</p>< p>4.ActionInvoker</p>< p>ActionInvoker顾名思义是负责调用(invoke)action的。默认的action invoker通过方法名、action名或其他可能的selector attribute来查找action,然后调用action方法以及定义的filter,最终执行得到action result。</p>< p>你会发现大部分执行管线存在于ControllerActionInvoker类的逻辑之中。因此,如果希望改变这些约定,如action方法的选择逻辑、http参数映射到action参数的方式、选择和执行filter的方式等,您需要扩展该类并重写需要修改的方法。</p>< p>可以参阅NinjectActionInvoker I developed to allow injection of dependencies inside filters。</p>< p>5.ActionMethodSelectorAttribute</p>< p>使用默认的action invoker时,action的选择是基于名称的。您也可以实现自己的Method Selector以改善对于action的选择。在框架中已经包含了AcceptVerbs特性,它允许您指定使用哪一个HTTP Verb来处理action的响应。</p>< p>例如,您也许会希望基于浏览器所支持的语言或浏览器类型(如移动设备的浏览器或桌面浏览器)来进行action的选取。</p>< p>6.AuthorizationFilter</p>< p>这种过滤器是在action执行之前执行的,用来确保请求是有效的。</p>< p>框架中已经包含了一些autorization过滤器,最有名的莫过于Authorize特性,它用来检查当前用户是否允许执行该action。另一个是用来阻止CSRF攻击的ValidateAntiForgeryToken。如果您希望实现自己的authorization,那么必须实现接口。例如,日期中的小时。</p>< p>7.ActionFilter</p>< p>Action Filters在action执行前后执行。OutputCache过滤器是几个核心过滤器之一。这可能是您最有可能使用的扩展点,并且在我看来,controller只关心它的主要工作,而view所需要的所有其他数据都必须从action过滤器内部获取,这样的实现对于一个组织良好的view来说,是十分关键的。</p>< p>8.ModelBinder</p>< p>默认的model binder使用参数名称进行HTTP参数到action方法参数的映射。例如,http参数user.address.city将映射到方法参数user的Address属性的City属性。DefaultModelBinder也同样适用于数组和其他列表类型。</p>< p>更进一步来说,例如,您可能希望从数据库中进行检索,直接根据person的id将其转换为Person对象。Timothy Khouri(网名SingingEels)在他的文章Model Binders in ASP.NET MVC中更好的阐述了这种方法。他的代码基于Preview 5,但其理念是一样的。</p>< p>9.ControllerBase</p>< p>所有的Controller均继承自基类Controller。要想在action中封装自己的逻辑和约定,创建自己的父类使所有Controller继承自该类,是一种很好的方式。</p>< p>10.ResultFilter</p>< p>与ActionFilter类似,ResultFilters在ActionResult前后执行。OutputCache过滤器也可以作为ResultFilter的示例。另外,比较常用的诠释这种过滤器的示例是日志记录。如果您希望在页面返回给用户时记录日志,可以编写自定义的RenderFilter,在ActionResult执行之后记录日志。</p>< p>11.ActionResult</p>< p>ASP.NET MVC提供了很多result用来呈现视图、JSON、纯文本、文件并重定向到其他action。如果您需要其他类型的result,可以自定义ActionResult,并实现ExecuteResult方法。例如,如果您希望将PDF文件作为结果发送,您需要使用PDF库编写能够生成PDF的ActionResult。又如RSS feed,可参见how to write a RssResult in this post。</p>< p>12.ViewEngine</p>< p>您可能不需要编写自己的view engine,但您也许可以考虑使用其他引擎来替代默认的WebForm view engine。在我看来,最有趣的引擎就是Spark。</p>< p>如果您确实希望编写自己的view engine,可以看一下Brad Wilson的文章: Partial Rendering& amp; View Engines in ASP.NET MVC。</p>< p>13.HtmlHelper</p>< p>视图必须十分简单整洁,它们只能包含html标记并调用HtmlHelper的辅助方法。视图中不能包含任何代码,所以辅助方法必须十分方便,使您可以将代码从视图中提取出来,放到一个可测试的环境中去。正如Rob Conery所说:如果有if,就构造辅助方法(If there's an IF, make a Helper)。</p>< p>什么是HtmlHelper辅助方法?其实就是HtmlHelper类的扩展方法,这是唯一的要求。</p>< p>你可以从Rob的文章Avoiding Tag Soup中了解到为什么说HtmlHelper是封装视图中代码的好方法。</p>< p>在您的应用中该使用哪个呢?</p>< p>正如您所猜测的那样,并不是所有的应用都需要扩展以上的13个扩展点。最可能在所有应用中进行扩展的是ActionFilter和HtmlHelper。另外,您很可能会使用其他人编写的扩展,如使用了IoC容器的ControllerFactory或用来摆脱WebForm的ViewEngine。</p>< p>但是,学习这些扩展点并进行尝试是十分重要的,这样您才会做出选择,并随时准备在必要的时候使用这些强大的扩展点。下周我将发表一些文章来阐述如何使用这些扩展点。</p>< p>如果您想详细了解更多关于该话题的内容,可以考虑购买即将出版的Beginning ASP.NET MVC(我是作者之一)或Professional ASP.NET MVC(ASP.NET MVC开发团队编写)或ASP.NET MVC in Action (Jeffrey Palermo和Ben Scheirman著)。</p>< p>我是否遗漏了某些您认为重要的扩展点呢?您是否使用过我上面提到的扩展点呢?我很想听听您所遇到的场景。</p>http://www.downcc.com/tech/163.htmlPHP编程2009/06/13 17:16:01<p>揭露 PHP 应用程序中出现的五个常见数据库问题& mdash;&mdash; 包括数据库模式设计、数据库访问和使用数据库的业务逻辑代码& mdash;&mdash; 以及它们的解决方案。</p>< p>如果只有一种 方式使用数据库是正确的&hellip;&hellip;</p>< p>您可以用很多的方式创建数据库设计、数据库访问和基于数据库的 PHP 业务逻辑代码,但最终一般以错误告终。本文说明了数据库设计和访问数据库的 PHP 代码中出现的五个常见问题,以及在遇到这些问题时如何修复它们。</p>< p>问题 1:直接使用 MySQL</p>< p>一个常见问题是较老的 PHP 代码直接使用 mysql_ 函数来访问数据库。清单 1 展示了如何直接访问数据库。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;?php<br /> function get_user_id( $name )<br /> {<br /> $db = mysql_connect( 'localhost', 'root', 'password' );<br /> mysql_select_db( 'users' );</p>< p>$res= mysql_query(& quot;SELECT id FROM users WHERE login='&quot;.$name.&quot;'&quot; );<br /> while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }</p>< p>return $id;<br /> }</p>< p>var_dump( get_user_id( 'jack' ) );<br /> ?&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>清单 1. Access/get.php</p>< p>注意使用了 mysql_connect 函数来访问数据库。还要注意查询,其中使用字符串连接来向查询添加 $name 参数。</p>< p>该技术有两个很好的替代方案:PEAR DB 模块和 PHP Data Objects (PDO) 类。两者都从特定数据库选择提供抽象。因此,您的代码无需太多调整就可以在 IBM&reg; DB2&reg;、MySQL、PostgreSQL 或者您想要连接到的任何其他数据库上运行。</p>< p>使用 PEAR DB 模块和 PDO 抽象层的另一个价值在于您可以在 SQL 语句中使用 ? 操作符。这样做可使 SQL 更加易于维护,且可使您的应用程序免受 SQL 注入攻击。</p>< p>使用 PEAR DB 的替代代码如下所示。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;?php<br /> require_once(&quot;DB.php&quot;);</p>< p>function get_user_id( $name )<br /> {<br /> $dsn = 'mysql://root:password@localhost/users';<br /> $db =&amp; DB::Connect( $dsn, array() );<br /> if (PEAR::isError($db)) { die($db-&gt;getMessage()); }</p>< p>$res= $db-&gt;query( 'SELECT id FROM users WHERE login=?',<br /> array( $name ) );<br /> $id = null;<br /> while( $res-&gt;fetchInto( $row ) ) { $id = $row[0]; }</p>< p>return $id;<br /> }</p>< p>var_dump( get_user_id( 'jack' ) );<br /> ?&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>清单 2. Access/get_good.php</p>< p>注意,所有直接用到 MySQL 的地方都消除了,只有 $dsn 中的数据库连接字符串除外。此外,我们通过 ? 操作符在 SQL 中使用 $name 变量。然后,查询的数据通过 query() 方法末尾的 array 被发送进来。</p>< p>问题 2:不使用自动增量功能</p>< p>与大多数现代数据库一样,MySQL 能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个 SELECT 语句来找到最大的 id,然后将该 id 增 1,并找到一个新记录。清单 3 展示了一个示例坏模式。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>DROP TABLE IF EXISTS users;<br /> CREATE TABLE users (<br /> id MEDIUMINT,<br /> login TEXT,<br /> password TEXT<br /> );</p>< p>INSERT INTO users VALUES ( 1, 'jack', 'pass' );<br /> INSERT INTO users VALUES ( 2, 'joan', 'pass' );<br /> INSERT INTO users VALUES ( 1, 'jane', 'pass' );</p>< /td>< /tr>< /tbody>< /table>< /p>< p>清单 3. Badid.sql</p>< p>这里的 id 字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如 CREATE 语句后面的几个 INSERT 语句中所示。清单 4 展示了将用户添加到这种类型的模式的 PHP 代码。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;?php<br /> require_once(&quot;DB.php&quot;);</p>< p>function add_user( $name, $pass )<br /> {<br /> $rows = array();</p>< p>$dsn= 'mysql://root:password@localhost/bad_badid';<br /> $db =&amp; DB::Connect( $dsn, array() );<br /> if (PEAR::isError($db)) { die($db-&gt;getMessage()); }</p>< p>$res= $db-&gt;query(& quot;SELECT max(id) FROM users&quot; );<br /> $id = null;<br /> while( $res-&gt;fetchInto( $row ) ) { $id = $row[0]; }</p>< p>$id+= 1;</p>< p>$sth= $db-&gt;prepare(& quot;INSERT INTO users VALUES(?,?,?)&quot; );<br /> $db-&gt;execute( $sth, array( $id, $name, $pass ) );</p>< p>return $id;<br /> }</p>< p>$id= add_user( 'jerry', 'pass' );</p>< p>var_dump( $id );<br /> ?&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>< p>清单 4. Add_user.php</p>< p>add_user.php 中的代码首先执行一个查询以找到 id 的最大值。然后文件以 id 值加 1 运行一个 INSERT 语句。该代码在负载很重的服务器上会在竞态条件中失败。另外,它也效率低下。</p>< p>那么替代方案是什么呢?使用 MySQL 中的自动增量特性来自动地为每个插入创建惟一的 ID。更新后的模式如下所示。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>DROP TABLE IF EXISTS users;<br /> CREATE TABLE users (<br /> id MEDIUMINT NOT NULL AUTO_INCREMENT,<br /> login TEXT NOT NULL,<br /> password TEXT NOT NULL,<br /> PRIMARY KEY( id )<br /> );</p>< p>INSERT INTO users VALUES ( null, 'jack', 'pass' );<br /> INSERT INTO users VALUES ( null, 'joan', 'pass' );<br /> INSERT INTO users VALUES ( null, 'jane', 'pass' );</p>< /td>< /tr>< /tbody>< /table>< /p>< p>清单 5. Goodid.php</p>< p>我们添加了 NOT NULL 标志来指示字段必须不能为空。我们还添加了 AUTO_INCREMENT 标志来指示字段是自动增量的,添加 PRIMARY KEY 标志来指示那个字段是一个 id。这些更改加快了速度。清单 6 展示了更新后的 PHP 代码,即将用户插入表中。</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top:http://www.downcc.com/tech/162.htmlAsp编程2009/06/13 17:13:40<p>整了个BaiDuMp3的Decode,Base64加上一些Unicode的变化,发现JS版和ASP版的Base64算法对中文支持都不理想,于是用了Php的,服务器是IIS6.0,要让它跑Php也是可以的 。</p>< p>1、准备好php.ini,php5ts.dll,php5isapi.dll这3个文件,其中的php5是你拥有的php版本的文件,不同的版本,数字也不一样,这没关系。</p>< p>2、将php.ini复制到windows目录</p>< p>如果要用session,先配置一下:</p>< p>打开该文件,找到extension_dir =& quot;./&quot; ,将其改为 extension_dir =& quot;C:\windows\extensions&quot; ;再找到 session.save_path = /tmp ,将其改为 session.save_path = C:\windows\sessions 。(注:此时你需要在C:\windows目录下建立sessions文件夹,以存放session 。)</p>< p>3、将php5ts.dll,php5isapi.dll复制到system32目录</p>< p>4、在IIS中,添加Web服务扩展,要求的文件选择复制到system32里的php5isapi.dll,勾选&ldquo;设置扩展状态为允许&rdquo;</p>< p>5、在要允许执行Php的站点上,设置其属性。</p>< p>【主目录】【配置】【应用程序扩展】</p>< p>点击【添加】按钮,可执行文件选择复制到system32里的php5isapi.dll,扩展名为php,动作限制为:GET,HEAD,POST,然后确定。</p>< p>重启IIS。</p>< p>现在,你设置的那个站点即可以运行ASP,又可以运行PHP了,同样,你还可以为它添加Asp.Net或其他WEB服务扩展。</p>< p>附上BaiDuMp3客户端Encode,Decode代码!</p>< p>< table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right: #0099cc 1px solid; table-layout: fixed; border-top: #0099cc 1px solid; border-left: #0099cc 1px solid; border-bottom: #0099cc 1px solid">< tbody>< tr>< td bgcolor="#ddedfb" style="word-wrap: break-word">< p><font color="#ff0000">以下为引用的内容:</font></p>< p>&lt;script type=&quot;text/javascript&quot;&gt;<br /> function bdmp3Url(){<br />& nbsp;&nbsp;&nbsp; this.I=[];<br />& nbsp;&nbsp;&nbsp; this.E=[];<br />& nbsp;&nbsp;&nbsp; this.init();<br /> }<br /> bdmp3Url.prototype = {<br />& nbsp;&nbsp;&nbsp; init:function(){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getkeys(0,9,48);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getkeys(10,35,55);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getkeys(36,61,61);<br />& nbsp;&nbsp;&nbsp; },<br />& nbsp;&nbsp;&nbsp; getkeys:function(Q,N,O){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var P=Q;P&lt;=N;P++){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.I[P]=String.fromCharCode(P+O);this.E[P+O]=P;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp; },<br />& nbsp;&nbsp;&nbsp; code:function(C,D,F){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //偏移量<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var K=D%26;K=K?K:1;K=C?K:-K;<br />& nbsp;&nbsp;&nbsp;< br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var N=F.length,I=this.I,E=this.E,R='',Q='';</p>< p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var P=0;P&lt;N;P++){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R=F.charAt(P);<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(/[A-Za-z0-9]/.test(R)){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var S=E[F.charCodeAt(P)]+K;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(C){<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(S&gt;61){S-=62;}<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(S&lt;0){S+=62;}<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R=I[S];<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Q+=R;<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Q;<br />& nbsp;&nbsp;&nbsp; }<br /> }</p>< p>var x = new bdmp3Url();</p>< p>document.write(x.code(1,1227148832,'http://www.wzms.net/UploadFiles/2007-1/115747297.wma')+'&lt;br/&gt;');</p>< p>document.write(x.code(0,1227148832,'iuuq://xxx.x0nt.ofu/VqmpbeGjmft/3118-2/2268583A8.xnb'));</p>< p>&lt;/script&gt;</p>< /td>< /tr>< /tbody>< /table>< /p>