分类目录归档:开发语言

php带小数取整的方法以及取具体位数的number_format

//1.php丢弃小数部分,保留整数部分
echo intval("3.14159");
//2.php向上取整,有小数就整数部分加1
echo ceil("3.14159");
//3,php四舍五入.
echo round("3.14159");
//4,php向下取整
echo floor("3.14159");
//5,php取具体小数位数
echo number_format("3.14159",2);
//number_format() 函数通过千位分组来格式化数字。
//number_format(number,decimals,decimalpoint,separator)
echo number_format("1000000"); //1,000,000
echo number_format("1000000",2); //1,000,000.00
echo number_format("1000000",2,",","."); //1.000.000,00

smarty中如何遍历一维数组和二维数组

(1)一维数组
可以使用foreach.
比如:
数组:$addr = array(
’01’ => ‘广州’,
’02’ => ‘韶关’,
’03’ => ‘深圳’,
’04’ => ‘珠海’,
’05’ => ‘汕头’,
’06’ => ‘佛山’,
’53’ => ‘云浮’,
’52’ => ‘揭阳’,
’51’ => ‘潮州’,
’20’ => ‘中山’,
’19’ => ‘东莞’,
’07’ => ‘江门’,
’08’ => ‘湛江’,
’09’ => ‘茂名’,
’12’ => ‘肇庆’,
’13’ => ‘惠州’,
’14’ => ‘梅州’,
’15’ => ‘汕尾’,
’16’ => ‘河源’,
’17’ => ‘阳江’,
’18’ => ‘清远’
);
可以通过
<!–{foreach from=$addr item=addre}–>
<option value=”<!–{$addre}–>”><!–{$addre}–></option>
<!–{/foreach}–>
输出
PS.
如果是$array = array(‘value1′,’value2’);这种形式的数组,也可以通过
{section name=id loop=$array}
{$array[id]}
{/section}
输出
(2)二维数组:
可能通过section 或 foreach
section 的用法如下:
$webs = array(
0 => array(
name => ‘牧羊城’,
addr => ‘http://www.muyangcheng.com’
),
1 => array(
name => ‘广州论坛’,
addr => ‘http://www.muyangcheng.com’
)
);
 
<!–{section name=usr loop=$webs}–>
<a href=”<!–{$webs[usr].addr}–>”><!–{$webs[usr].name}–></a>
<!–{/section}–>

Drupal

CMS内容管理系统 Drupal
+ 搜索引擎友好的URL
+ Drupal有一个优秀的模块化结构,提供了许多模块,包括短消息、个性化书签、网站管理、Blog、日记、电子商务、电子出版、留言簿、Job、网上电影院、论坛、投票等模块。Drupal模块的下载、安装、定制非常方便
+ Drupal提供了强大的个性化环境,每个用户可以网站内容和表现形式进行个性化设置
+ Drupal提供了基于角色的权限系统,没有必要对每个用户进行授权,只需要对角色进行授权
+ Drupal提供的站内搜索系统能对站内的所有内容进行索引和搜索
+ Drupal的模板系统将内容和表现分离,可以很方便地控制网站的外观
+ Drupal提供内建的新闻聚合工具
+ 提供完善的站点管理和分析工具
+ Drupal的Caching机制能有效减少数据库查询次数,从而提高站点性能,降低服务器负荷
+强大的多语言支持体系。能够支持很多国家的语言,让你的网站在世界上通行。
Drupal运行环境:
Drupal 基于PHP脚本语言,推荐使用mysql数据库,所以要运行Drupal必须先安装好PHP支持程序,推荐apache + mysql + php的安装和配置环境。linux系统下推荐采用lamp安装套件或windows系统下推荐安装wamp套件。
Drupal的安装:
1.运行环境:
1.建立数据库:用mysql命令行、phpmyadmin、mysql-front等工具新建一个数据库,并记住数据库的名称。
2.将Drupal代码根目录放入apache的web服务目录(www或htdocs等),通过http协议在浏览器运行Drupal的对应http 服务,例如http://mydomain/drupal,再出现的页面中按提示填入数据库的名称,用户,密码等信息。
3.首次执行,可以设置相应的个性化参数,如帐户,首页,简介链接等。
4.注:第一个注册的帐户拥有系统的最高权限。
基于Drupal平台的网站设计成功案例
很多全球知名的商业公司、社团组织、大学及政府机构都从传统的网站设计系统转向了Drupal,或者利用Drupal构建内部交流站点及社区网站。部分基于Drupal的应用包括:
跨国公司-联邦快递、诺基亚、Adobe、Sun
国际著名娱乐公司-华纳兄弟、索尼/BMG、Fox、环球唱片、迪斯尼/ABC
互联网媒体网-Google、Novell、雅虎
新闻杂志-福布斯、The Fast Company、Now Public、花花公子(德国)、The Onion,以及纽约观察报等。
网上社区-Team Sugar、FireFox
高等学府-哈佛大学、MIT
政府机构-法国政府、纽约市长Mike Bloomberg、联合国
最近奥巴马政府的经济恢复网站也采用Drupal搭建
这些成功的合作案例证明,Drupal不但适合个人站点及网上社区类网站,而且已被国际著名大公司和组织机构所接受和采纳。相信在国内,Drupal也会很快流行起来,成为主流网站设计和开发平台。
下载地址:http://drupal.org/download
drupal花园:http://drupalgarden.cn/
开源中国社区 – CMS内容管理系统 Drupal:http://www.oschina.net/p/drupal/
Drupal中文学习实践开发网:http://hellodrupal.info/

Call-time pass-by-reference has been deprecated In

Warning: Call-time pass-by-reference has been deprecated in E:PhpWebSiteMyPHPUpload.Class.php on line 154
用PHPNow搭建建站环境的注意了。
如果你写代码的时候出现这个问题,按下面方法处理:
找到PHPNow安装目录Phpnowphp-5.2.14-Win32 下的php-apache2handler.ini文件
修改文件中的

allow_call_time_pass_reference = Off

allow_call_time_pass_reference = On

即可

msxml3.dll错误,80070005拒绝访问解决方法

msxml3.dll错误,80070005 此问题一般出现在“采集程序”中。没错,本人的采集程序就出现了这样的错误。
方案一、适合对服务器有绝对管理权限者
解决办法:
赋予程序所在文件夹 internet 来宾帐号(IUSR_WEB)可写。
做法:
选择cachefile-属性-安全-添加(IUSR_WEB)-写入
方案二、更改程序(推荐方案)
用Msxml2.ServerXMLHTTP替换掉Microsoft.XMLHTTP
详细:昨天在采集某一个网站的时候,采集程序出错了。
是自写的采集程序。
经过搜索以后,查到一些没有用的结果,后来发现,用Msxml2.ServerXMLHTTP替换掉Msxml2.XMLHTTP,问题成功解决。
以下是分析排错过程。
老是采集一段时间就挂了,指定资源下载失败,或者拒绝访问。
后来直接全部是拒绝访问。
一开始,认为,对方服务器做了防采集设置,比如有时间限制之类的。
于是更改程序,原先是直接获取列表页,然后持续循环获得文章列表。改了采集文件结构,
原来是就一个文件,类,数据库连接,数据处理全部在一个文件里,再采集某一篇文章的时候,后天加了一个时间循环。等待5秒的。代码如下
sTime=Timer()
dTime=Timer()-sTime
do while dTime < 5
dTime=Timer()-sTime
loop
确实是能等待5秒钟,但是很快就发现,这个循环太过消耗CPU资源,一到这个循环,CPU占用率持续100%,于是马上放弃这个方案。
另做了一个文件。只根据文章URL抓取文章的相关内容并写入数据库,写入完毕后输出自动跳转代码。
核心思想就是用了
这是一个定时跳转的代码,相信大家都很熟悉。
我的原理做法就是,用一开始的文件,抓取所有的文章连接地址,以及相关导航代码,保存到数据库中。
然后用新做的抓取文章内容的程序,读取数据库记录,逐条进行采集。
数据库记录中有一个flag标记,tinyint类型,默认是0,采集成功更新为1,失败更新为2
这样,每次从数据库中读取一条未采集的数据,也就是读取flag=0的数据,进行操作。操作完毕等待5秒跳转到自身。
想法跟思路是很好的。文章URL数据库也采集准备好了,一上采集文章具体内容,又出错了。一直是msxml3.dll 错误 ‘80070005’
拒绝访问的错误。
那个郁闷,想开一晚上机器,自动采集,破灭。
今天早上来搜索查询资料,查询到的绝大多数都是无用信息。
基本上都是说权限问题。
msxml3.dll 错误 ””80070005””
拒绝访问。
解决办法:
赋予程序所在文件夹 internet 来宾帐号(IUSR_WEB)可写。
做法:
选择cachefile-属性-安全-添加(IUSR_WEB)-写入
都是这么说的。莫名其妙的,我的是FAT32的不存在NTFS格式的那种安全权限问题,IIS设置也正常,
我的问题是采集一部分就拒绝访问。肯定不是这个问题。
继续搜索,找到另一个方案说是,用Msxml2.XMLHTTP替换掉Microsoft.XMLHTTP,我本来用的就是Msxml2.XMLHTTP的
继续搜索。找到最终解决方案应该是用Msxml2.ServerXMLHTTP
其实有时候问题很显然,但是ASP的错误提示做不到那么详细。比如我自己的网站,知道是因为网络访问超级慢出现的错误,它却给出msxml3.dll出错的提示。木然!
 
 

错误:ASP 0156 : 80004005

今天一客户联系我说使用的网站添加新闻等操作时候突然报错,提示为
答复对象 错误 ‘ASP 0156 : 80004005’
头错
/nanraocheng/news/admin_news_add_save.asp,行146
HTTP头已经写入到客户浏览器。任何 HTTP 头的修改必须在写入页内容之前。
到达现场后调试发现该ASP程序在本机调试错误,上传后即出现改错误,检测后得出结论为缓冲输出的错误,解决方法及原理如下:
原因是
iis5.0   默认使用网页缓存,pws或iis4.0(winnt系统)   默认不使用网页缓存   。
所以<%response.buffer   =   true%>放在顶部或response.redirect   语句放在任何html语句前面。即在使用Response.Redirect之前不要输出任何客户端(Browse)的   HTML   或   Script!
一般都是在最前面加上 <%response.buffer=true%>
 

使用ASP的Scripting.Dictionary对象打造完美购物车

一直不习惯用Dictionary,但是有时候却很有用。
Dictionary 对象
Dictionary 对象用于在结对的名称/值中存储信息((等同于键和项目)。Dictionary 对象看似比数组更为简单,然而,Dictionary 对象却是更令人满意的处理关联数据的解决方案。
比较 Dictionary 和数组:

  • 键用于识别 Dictionary 对象中的项目
  • 无需调用 ReDim 来改变 Dictionary 对象的尺寸
  • 当从 Dictionary 删除一个项目时,其余的项目会自动上移
  • Dictionary 不是多维,而数组是
  • Dictionary 与数组相比,有更多的内建对象
  • Dictionary 在频繁地访问随机元素时,比数组工作得更好
  • Dictionary 在根据它们的内容定位项目时,比数组工作得更好

Dictionary 对象的属性和方法描述如下:

属性
CompareMode:设置或返回用于在 Dictionary 对象中比较键的比较模式。
Count:返回 Dictionary 对象中键/项目对的数目。
Item:设置或返回 Dictionary 对象中一个项目的值。
Key:为 Dictionary 对象中已有的键值设置新的键值。
方法
Add:向 Dictionary 对象添加新的键/项目对。
Exists:返回一个逻辑值,这个值可指示指定的键是否存在于 Dictionary 对象中。
Items:返回 Dictionary 对象中所有项目的一个数组。
Keys:返回 Dictionary 对象中所有键的一个数组。
Remove:从 Dictionary 对象中删除指定的键/项目对。
RemoveAll:删除 Dictionary 对象中所有的键/项目对。

<%
Dim oDic,aItems,aKeys 
Set oDic = Server.CreateObject("Scripting.Dictionary")  '添加 
oDic.Add "aaa",111 
oDic.Add "bbb",222 
oDic.Add "ccc",333 
oDic.Add "ddd",444  '修改 
If oDic.Exists("aaa") Then 
  oDic.key("aaa") = "eee" 'key属性,只读 
  oDic.item("eee") = 555 'item属性,可读写 
End If  '列表 
aKeys = oDic.Keys 
aItems = oDic.Items
For i=0 To oDic.Count-1 
 Response.Write(aKeys(i) & "," & aItems(i)) 
Next  '删除 
Response.Write(oDic.Count) 
oDic.Remove("eee") '从 Dictionary 对象中删除键和项目对 
Response.Write(oDic.Count) 
oDic.RemoveAll() '删除 Dictionary 对象中的所有键和项目对 
Response.Write(oDic.Count)
Set oDic = Nothing
%>

购物车具体用法:

1、为客户建立购物车,名为shop
set session(“shop”)= CreateObject(“Scripting.Dictionary”)
2、检查客户当前购物车商品个数
session(“shop”).count=0
如果为0,那么自然表示购物车现在是空的
3、客户订购某一商品
session(“shop”).add id,num
id表示数据库中商品的ID或编号等,num表示客户订购此商品的
个数
4、客户查看购物车列表(客户确认当前已购买了的商品列表)
id=session(“shop”).keys
num=session(“shop”).items
以上2句均返回的是数组型数据,分别付给id(商品ID组)和num(
商品数量组)这2个变量
聪明的你马上就会想到只要通过循环把它们一一对应起来就OK了:
for i=0 to session(“shop”).count-1
…id(i)
…这里可以结构操作数据库把商品的信息取出来,通过操作商品编
号数组id(i)
do while not rs.eof
…num(i)
…然后循环结果集,使价格等与商品对应,通过操作商品个数数组
num(i)
rs.movenext
loop
next
数组的下标是从0开始,所以要count-1哦
这部可能有点乱,不过如果你有点经验的话应该是很容易读懂的。
5、客户更改某一商品的订购数量
session(“shop”)(id)=num
太简单了,我不多解释了。
6、客户删除某一商品
session(“shop”).remove(id)
7、客户清空购物车
session(“shop”).removeall
 

PHP die() 函数

die() 函数输出一条消息,并退出当前脚本。该函数是 exit() 函数的别名。
die(status)
status 必需。规定在退出脚本之前写入的消息或状态号。状态号不会被写入输出。
如果 status 是字符串,则该函数会在退出前输出字符串。
如果 status 是整数,这个值会被用作退出状态。退出状态的值在 0 至 254 之间。退出状态 255 由 PHP 保留,不会被使用。状态 0 用于成功地终止程序。
注释:如果 PHP 的版本号大于等于 4.2.0,那么在 status 是整数的情况下,不会输出该参数。
一个例子:

<?php
$site = "http://www.hec8.com/";
fopen($site,"r") or die("Unable to connect to $site");
?>

ASP读取xls格式的Excel文件

Excel也是一种数据库,跟Access类似,其读取方法也类似。
这里有一个简单的Excel表,文件名字为Excel.xls:

咱就这个为例子来说明。
创建Excel连接代码:

Dim XlsConn,xrs
Set XlsConn=Server.CreateObject("Adodb.Connection")
XlsConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("Excel.xls")&";Extended Properties=Excel 8.0"

是不是跟连接Access文件很像呢?呵呵~
连接创建好了,就可以创建记录集查询Excel里面的数据了。

Set xrs=XlsConn.Execute("Select * From [Sheet1$]")

跟其他数据库的查询几乎是一样的,要注意的地方就是表名,Excel里面,默认会有三张表,Sheet1、Sheet2、Sheet3,从上面的例子也可以看到,需要注意查询时表名后面要加“$”符;查询结果:

xrs(0)="数据列0"
xrs(1)="1"
xrs(2)="2"
xrs(3)="3"
xrs(4)="4"
xrs(5)="5"

这里有一点需要注意,如果一列中有多行,有的行的值是数字,有的行是字符,ASP去取值的时候数字行会读取出错,是为空的。所以得想办法把数字行也变成字符型,比如加个’号去,读取出来之后再替换回去。
 
多行自然是用xrs.Movenext去循环取得了。够简单吧!
最后贴一段代码:

Dim rs
Set rs=Server.CreateObject("Adodb.Recordset")
rs.Open "Select Top 1 * From Pro Where 1=2",Conn,3,2
Dim XlsConn,xrs
Set XlsConn=Server.CreateObject("Adodb.Connection")
XlsConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("Excel.xls")&";Extended Properties=Excel 8.0"
Set xrs=XlsConn.Execute("Select * From [Sheet1$]")
Do While Not xrs.Eof
rs.Addnew
rs("iClear")= xrs(0)
rs("Detail")= xrs(1)
rs.Update
xrs.Movenext
Loop
xrs.Close()
Set xrs=Nothing
XlsConn.Close()
Set XlsConn=Nothing
rs.Close()
Set rs=Nothing