燕之庐网站建设 - 优质网站设计公司

Archive for 11月, 2009

php

2009/11/30

ecshop二次开发指南

Tags: , ,

Ecshop文件结构

ecshop文件架构说明
/*
ECShop 2.5.1 的结构图及各文件相应功能介绍
ECShop2.5.1_Beta upload 的目录
┣ activity.php 活动列表
┣ affiche.php 广告处理文件
┣ affiliate.php 生成商品列表
┣ article.php 文章内容
┣ article_cat.php文章分类
┣ auction.php 拍卖前台文件
┣ brand.php 品牌列表
┣ captcha.php 生成验证码
┣ catalog.php 列出所以分类及品牌
┣ category.php 商品分类
┣ comment.php 提交用户评论
┣ compare.php 商品比较程序
┣ cycle_image.php 轮播图片程序
┣ feed.php RSS Feed 生成程序
┣ flow.php 购物流程
┣ gallery.php 商品相册
┣ goods.php 商品详情
┣ goods_script.php 生成商品列表
┣ group_buy.php 团购商品前台文件
┣ index.php 首页文件
┣ myship.php 支付配送DEMO
┣ pick_out.php 选购中心
┣ receive.php 处理收回确认的页面
┣ region.php 地区切换程序
┣ respond.php 支付响应页面
┣ robots.txt
┣ search.php 搜索程序
┣ sitemaps.php google sitemap 文件
┣ snatch.php 夺宝奇兵前台页面
┣ tag_cloud.php 标签云
┣ topic.php 专题前台
┣ user.php 会员中心
┣ vote.php 调查程序
┣ wholesale.php 批发前台文件
┣ admin文件夹
┃ ┣ account_log.php 管理中心帐户变动记录
┃ ┣ admin_logs.php 记录管理员操作日志
┃ ┣ ads.php 广告管理程序
┃ ┣ adsense.php 站外JS投放的统计程序
┃ ┣ ad_position.php广告位置管理程序
┃ ┣ affiliate.php 程序说明
┃ ┣ affiliate_ck.php 程序说明
┃ ┣ agency.php 管理中心办事处管理
┃ ┣ area_manage.php 地区列表管理文件
┃ ┣ article.php 管理中心文章处理程序文件
┃ ┣ articlecat.php 文章分类管理程序
┃ ┣ article_auto.php
┃ ┣ attention_list.php
┃ ┣ attribute.php 属性规格管理
┃ ┣ auction.php 管理中心拍卖活动管理
┃ ┣ bonus.php 红包类型的处理
┃ ┣ brand.php管理中心品牌管理
┃ ┣ captcha_manage.php
┃ ┣ card.php 贺卡管理程序
┃ ┣ category.php 商品分类管理程序
┃ ┣ check_file_priv.php 系统文件检测
┃ ┣ comment_manage.php 用户评论管理程序
┃ ┣ convert.php 转换程序
┃ ┣ cron.php 计划任务
┃ ┣ database.php 数据库管理
┃ ┣ ebao_commend.php 易宝推荐
┃ ┣ edit_languages.php 管理中心语言项编辑(前台语言项)
┃ ┣ email_list.php 邮件列表管理
┃ ┣ favourable.php 管理中心优惠活动管理
┃ ┣ flashplay.php
┃ ┣ flow_stats.php 综合流量统计
┃ ┣ friend_link.php 友情链接管理
┃ ┣ gen_goods_script.php 生成显示商品的js代码
┃ ┣ get_password.php 找回管理员密码
┃ ┣ goods.php 商品管理程序
┃ ┣ goods_auto.php
┃ ┣ goods_batch.php 商品批量上传、修改
┃ ┣ goods_booking.php 缺货处理管理程序
┃ ┣ goods_export.php
┃ ┣ goods_type.php 商品类型管理程序
┃ ┣ group_buy.php 管理中心团购商品管理
┃ ┣ guest_stats.php 客户统计
┃ ┣ index.php 控制台首页
┃ ┣ integrate.php 第三方程序会员数据整合插件管理程序
┃ ┣ magazine_list.php
┃ ┣ mail_template.php 管理中心模版管理程序
┃ ┣ message.php 管理中心管理员留言程序
┃ ┣ navigator.php

┃ ┣ order.php 订单管理
┃ ┣ order_stats.php 订单统计
┃ ┣ pack.php 包装管理程序
┃ ┣ payment.php 支付方式管理程序
┃ ┣ picture_batch.php 图片批量处理程序
┃ ┣ privilege.php 管理员信息以及权限管理程序
┃ ┣ sale_general.php 销售概况
┃ ┣ sale_list.php 销售明细列表程序
┃ ┣ sale_order.php 商品销售排行
┃ ┣ searchengine_stats.php 搜索引擎关键字统计
┃ ┣ search_log.php
┃ ┣ shipping.php 配送方式管理程序
┃ ┣ shipping_area.php 配送区域管理程序
┃ ┣ shophelp.php 帮助信息管理程序
┃ ┣ shopinfo.php 网店信息管理页面
┃ ┣ shop_config.php 管理中心商店设置
┃ ┣ sitemap.php 站点地图生成程序
┃ ┣ sms.php 短信模块 之 控制器
┃ ┣ snatch.php 夺宝奇兵管理程序
┃ ┣ sql.php sql管理程序
┃ ┣ tag_manage.php 后台标签管理
┃ ┣ template.php 管理中心模版管理程序
┃ ┣ topic.php 专题管理
┃ ┣ users.php 会员管理程序
┃ ┣ users_order.php 会员排行统计程序
┃ ┣ user_account.php 会员帐目管理(包括预付款,余额)
┃ ┣ user_msg.php 客户留言
┃ ┣ user_rank.php 会员等级管理程序
┃ ┣ view_sendlist.php
┃ ┣ virtual_card.php 虚拟卡商品管理程序
┃ ┣ visit_sold.php 访问购买比例
┃ ┣ vote.php 调查管理程序
┃ ┣ wholesale.php 管理中心批发管理
┃ ┣ help 的目录 后台操作帮助文件
┃ ┣ images 的目录
┃ ┣ includes 的目录
┃ ┃ ┣ cls_exchange.php 后台自动操作数据库的类文件
┃ ┃ ┣ cls_google_sitemap.php Google sitemap 类
┃ ┃ ┣ cls_phpzip.php ZIP 处理类
┃ ┃ ┣ cls_sql_dump.php 数据库导出类
┃ ┃ ┣ inc_menu.php 管理中心菜单数组
┃ ┃ ┣ init.php 管理中心公用文件
┃ ┃ ┣ lib_goods.php 管理中心商品相关函数
┃ ┃ ┣ lib_main.php 管理中心公用函数库
┃ ┃ ┗ lib_template.php 管理中心模版相关公用函数库
┃ ┣ styles 的目录
┃ ┣ templates 的目录
┃ ┗ js 的目录
┃ ┣ colorselector.js
┃ ┣ common.js
┃ ┣ listtable.js
┃ ┣ md5.js
┃ ┣ selectzone.js
┃ ┣ tab.js
┃ ┣ todolist.js
┃ ┣ topbar.js
┃ ┗ validator.js 表单验证类
┣ api 的目录
┃ ┣ checkorder.php 检查订单 API
┃ ┣ cron.php
┃ ┗ init.php API 公用初始化文件
┣ cert 的目录
┣ data 的目录
┃ ┣ ffiliate.html
┃ ┣ goods_script.html
┃ ┣ order_print.html
┃ ┣ afficheimg 的目录
┃ ┣ brandlogo 的目录
┃ ┣ captcha 的目录 验证码背景图片存放位置
┃ ┣ cardimg 的目录
┃ ┣ feedbackimg 的目录
┃ ┣ images 的目录
┃ ┣ packimg 的目录
┃ ┗ sqldata 的目录
┣ images 的目录
┃ ┗ upload 的目录
┃ ┣ File 文件上传存放处
┃ ┣ Flash flash上传存放处
┃ ┣ Image 图片上传存放处
┃ ┗ Media 视频上传存放处
┣ includes 的目录
┃ ┣ cls_captcha.php 验证码图片类
┃ ┣ cls_ecshop.php 基础类
┃ ┣ cls_error.php 用户级错误处理类
┃ ┣ cls_iconv.php 字符集转换类
┃ ┣ cls_image.php 后台对上传文件的处理类(实现图片上传,图片缩小, 增加水印)
┃ ┣ cls_json.php JSON 类
┃ ┣ cls_mysql.php MYSQL 公用类库
┃ ┣ cls_rss.php RSS 类
┃ ┣ cls_session.php SESSION 公用类库
┃ ┣ cls_sms.php 短信模块 之 模型(类库)
┃ ┣ cls_smtp.php SMTP 邮件类
┃ ┣ cls_sql_executor.php SQL语句执行类。
┃ ┣ cls_template.php 模版类
┃ ┣ cls_transport.php 服务器之间数据传输器
┃ ┣ inc_constant.php 常量
┃ ┣ init.php 前台公用文件
┃ ┣ lib.debug.php
┃ ┣ lib_article.php 文章及文章分类相关函数库
┃ ┣ lib_clips.php ECSHOP 用户相关函数库
┃ ┣ lib_code.php 加密解密类
┃ ┣ lib_common.php 公用函数库
┃ ┣ lib_goods.php 商品相关函数库
┃ ┣ lib_insert.php 动态内容函数库
┃ ┣ lib_main.php 前台公用函数库
┃ ┣ lib_order.php 购物流程函数库
┃ ┣ lib_passport.php 用户帐号相关函数库
┃ ┣ lib_payment.php 支付接口函数库
┃ ┣ lib_time.php 时间函数
┃ ┣ lib_transaction.php ECSHOP 用户交易相关函数库
┃ ┣ codetable 的目录
┃ ┃ ┣ big5-gb.table
┃ ┃ ┣ big5_utf8.php
┃ ┃ ┣ gb-big5.table
┃ ┃ ┣ gb_utf8.php
┃ ┃ ┗ ipdata.dat
┃ ┣ fckeditor 的目录 fckeditor编辑器目录
┃ ┗ modules 的目录
┃ ┣ convert 的目录
┃ ┃ ┣ shopex46.php vshopex4.6转换程序插件
┃ ┃ ┗ shopex47.php shopex4.7转换程序插件
┃ ┣ cron 的目录
┃ ┃ ┣ auto_manage.php 自动上下架管理
┃ ┃ ┗ ipdel.php 定期删除
┃ ┣ integrates 的目录
┃ ┃ ┣ bmforum.php 会员数据处理类
┃ ┃ ┣ discuz.php
┃ ┃ ┣ discuz55.php
┃ ┃ ┣ dvbbs.php
┃ ┃ ┣ ecshop.php
┃ ┃ ┣ integrate.php
┃ ┃ ┣ ipb.php
┃ ┃ ┣ molyx.php
┃ ┃ ┣ phpbb.php
┃ ┃ ┣ phpwind.php
┃ ┃ ┣ phpwind5.php
┃ ┃ ┗ vbb.php
┃ ┣ payment 的目录
┃ ┃ ┣ alipay.php 支付宝插件
┃ ┃ ┣ balance.php 余额支付插件
┃ ┃ ┣ bank.php 银行汇款(转帐)插件
┃ ┃ ┣ cappay.php 首信易支付插件
┃ ┃ ┣ chinabank.php 网银在线插件
┃ ┃ ┣ cncard.php 云网支付插件
┃ ┃ ┣ cod.php 货到付款插件
┃ ┃ ┣ ctopay.php Ctopay 支付插件
┃ ┃ ┣ express.php express支付系统插件
┃ ┃ ┣ ips.php ips支付系统插件
┃ ┃ ┣ kuaiqian.php 快钱插件
┃ ┃ ┣ nps.php NPS支付插件
┃ ┃ ┣ pay800.php 800pay 支付宝插件
┃ ┃ ┣ paypal.php 贝宝插件
┃ ┃ ┣ paypalcn.php 贝宝中国插件
┃ ┃ ┣ post.php 邮局汇款插件
┃ ┃ ┣ tenpay.php 财付通插件
┃ ┃ ┣ udpay.php 网汇通插件
┃ ┃ ┣ xpay.php 易付通插件
┃ ┃ ┗ yeepay.php YeePay易宝插件
┃ ┗ shipping 的目录
┃ ┣ cac.php 上门取货插件
┃ ┣ city_express.php 城际快递插件
┃ ┣ ems.php EMS插件
┃ ┣ flat.php 邮政包裹插件
┃ ┣ fpd.php 到付运费插件
┃ ┣ post_express.php 邮政包裹插件
┃ ┣ post_mail.php 邮局平邮插件
┃ ┣ presswork.php 挂号印刷品插件
┃ ┣ sf_express.php 顺丰速运 配送方式插件
┃ ┣ sto_express.php 申通快递 配送方式插件
┃ ┣ yto.php 圆通速递插件
┃ ┗ zto.php 中通速递插件
┣ install 的目录 安装文件目录
┣ js 的目录
┃ ┣ auto_complete.js
┃ ┣ calendar.php
┃ ┣ common.js
┃ ┣ compare.js
┃ ┣ global.js
┃ ┣ lefttime.js
┃ ┣ myship.js
┃ ┣ region.js
┃ ┣ shopping_flow.js
┃ ┣ transport.js
┃ ┣ user.js
┃ ┣ utils.js
┃ ┗ calendar 的目录
┣ languages 的目录 语言风格文件
┃ ┣ zh_cn 的目录
┃ ┃ ┣
┃ ┃ ┣ admin 的目录
┃ ┃ ┣ convert 的目录
┃ ┃ ┣ cron 的目录
┃ ┃ ┣ payment 的目录
┃ ┃ ┗ shipping 的目录
┃ ┗ zh_tw 的目录
┃ ┣ admin 的目录
┃ ┣ convert 的目录
┃ ┣ cron 的目录
┃ ┣ payment 的目录
┃ ┗ shipping 的目录
┣ plugins 的目录
┣ templates 的目录
┃ ┣ backup 的目录
┃ ┃ ┗ ibrary 的目录
┃ ┣ caches 的目录
┃ ┗ compiled 的目录
┃ ┗ admin 的目录

┣ themes 的目录
┃ ┣ default 的目录
┃ ┃ ┣ images 的目录
┃ ┃ ┗ library 的目录
┃ ┗ sport 的目录
┣ wap 的目录
┃ ┣ article.php
┃ ┣ brands.php
┃ ┣ buy.php
┃ ┣ category.php
┃ ┣ comment.php
┃ ┣ goods.php
┃ ┣ goods_list.php
┃ ┣ index.php
┃ ┣ user.php
┃ ┣ includes 的目录
┃ ┃ ┣ init.php
┃ ┃ ┣ lib_main.php
┃ ┗ templates 的目录
┃ ┣ article.wml
┃ ┣ article_list.wml
┃ ┣ brands.wml
┃ ┣ buy.wml
┃ ┣ category.wml
┃ ┣ comment.wml
┃ ┣ goods.wml
┃ ┣ goods_img.wml
┃ ┣ goods_list.wml
┃ ┣ index.wml
┃ ┣ login.wml
┃ ┣ order_list.wml
┃ ┗ user.wml
┗ widget 的目录
┣ blog_sohu.php
┣ blog_sohu.xhtml
┗ images 的目录

引用
ecshop数据结构

ecs_account_log // 用户账目日志表
ecs_activity // 活动表(代码,名称,开始,结束,描述)
ecs_ad // 广告表(位置,类型,名称,链接,图片,开始,结束,广告主相关信息,点击,
是否显示)
ecs_admin_action // 管理权限分配(父类ID,权限代码)
ecs_admin_log // 管理日志(登陆时间,登陆管理员ID,操作描述,IP)
ecs_admin_message // 管理员留言(发送者ID,接收者ID,发送日期,阅读日期,是否
已读,是否删除,标题,内容)
ecs_admin_user // 管理员管理(用户名,email ,密码,加入时间,最后登陆时间,最后
登陆IP,权限等)
ecs_adsense // 广告相关统计(来源广告,来源位置,点击)
ecs_ad_position // 广告位(名称,宽,高,描述,样式)
ecs_area_region // 配送区域关联(配送区域ID,具体地址ID)
ecs_article // 文章(分类ID,标题,内容,作者,作者email ,关键字,类型,是否显示,
添加时间,文件地址,打开类型)
ecs_article_cat // 文章分类(名称,类型,关键字,描述,排序,是否导航显示)
ecs_attribute // 商品属性(分类,名称,选择样式,类型,值,检索类型,排序,是否关
联)
ecs_bonus_type // 红包(名称,金额,发放起始日期,发放结束日期,使用起始日期,使
用结束日期,发放类型,金额下限(按订单发放),金额上限)
ecs_booking_goods // 缺货登记(登记用户ID,email ,电话,商品ID,描述,数量,登
记时间,是否已处理,处理管理员,处理时间,处理备注)
ecs_brand // 品牌(名称,logo,描述,链接,排序,是否显示)
ecs_card // 祝福贺卡(名称,图片,费用,免费额度,描述)
ecs_cart // 购物车(用户ID,session_id ,商品ID,商品编号,商品名称,市场价,购买
价,数量,属性,是否真实商品,扩展代码,父类ID,类型,是否赠品,能否处理)
ecs_category // 商品分类(名称,关键字,描述,父类ID,排序,是否有子类,模板文件,
数量单位,是否导航显示)
ecs_collect_goods // 收藏(用户ID,商品ID,收藏时间)
ecs_comment // 评论(类型,类型ID,email ,用户名,内容,评星,添加时间,IP,状
态,父类ID)
ecs_feedback // 用户留言(父类ID,用户ID,用户名,email,标题,类型,内容,时间,
图片,是否回复)
ecs_friend_link // 友情链接(名称,链接,logo,排序)
ecs_gift // 赠品(送赠品活动ID,商品ID,赠品价格)
ecs_gift_type // 送赠品活动(名称,发送类型,相关参数,数量,开始,结束)
ecs_goods // 商品(分类ID,名称,点击,品牌ID,供应商名称,库存,重量,市场价,
售价,fitting_price(未知),促销价,促销开始日期,结束日期,警告数量,关键字,简介,
描述,缩略图,图,原图,是否真实商品,扩展代码,是否上架,是否单独销售,是否关联,
配件关联,是否赠品,能否成为赠品,单位,添加时间,排序,是否回收,精品,新品,推
荐,热销,红包ID,更新日期,商品类型,商品备注,首页轮播)
ecs_goods_article // 商品文章关联(gid,aid )
ecs_goods_attr // 商品属性(商品ID,属性ID,属性值,属性附加价)
ecs_goods_cat // 未知
ecs_gallery // 商品相册(商品ID,图片,描述,缩略图,原图)
ecs_goods_type // 商品类型(名称,状态)
ecs_group_buy // 团购(商品ID,结束日期,价格阶梯,限购数量,描述,订购量,订单,
赠送积分数,流程,押金,是否完成)
ecs_group_goods // 配件(父类ID,商品ID,配件价格)
ecs_link_goods // 商品关联(商品ID,关联ID,单双向)
ecs_mail_templates // 邮件样式(代码,是否html,名称,样式,最后修改日期)
ecs_member_price // 会员价(商品ID,会员等级,会员价)
ecs_order_action // 订单处理(订单ID,处理用户,订单状态,配送状态,支付状态,处
理时间,备注)
ecs_order_goods // 订单-商品(订单ID,商品ID,商品名称,商品编号,商品数量,市
场价,订单价,商品属性,配送数量,是否真实商品,扩展代码,父类ID,是否赠品)
ecs_order_info // 订单信息(好多(-_-|||略…)
ecs_pack // 包装(名称,图片,费用,免费额,描述)
ecs_payment // 支付工具(代码,名称,费用,描述,排序,配置,状态,is_cod(未知))
ecs_pay_log // 支付记录(略)
ecs_plugins // 插件(代码,版本,库,签名,安装日期)
ecs_region // 地方数据(没什么好说的)
ecs_sessions // 保存session 的(也没什么好说的(嗯?为什么要加个“也”呢))
ecs_shipping // 配送(代码,名称,描述,保价费,support_cod(未知),状态)
ecs_shipping_area // 配送区域(序列配置)
ecs_shop_config // 设置(父类ID,代码,类型,范围,文件夹,值)
ecs_snatch // 夺宝奇兵(活动ID,商品ID,最小价,最大价,定价,积分消耗)
ecs_snatch_log // 夺宝奇兵出价记录(还是没什么好说的)
ecs_stats // 访问记录(时间,IP,访问次数,浏览器,系统,语言,地区,来源域名,来
源地址,关键字,进入链接)
ecs_tag // 用户标签(不说)
ecs_template // 模板区域(文件名,区域,模板库,排序,id,数量,类型,模板)也不
怎么清楚
ecs_users // 会员(一些会员信息)
ecs_user_account // 会员帐户(用户ID,管理员,总额,添加时间,支付时间,管理备注,
用户备注,处理类型,支付工具,是否支付)
ecs_user_address // 用户收货地址(略)
ecs_user_bonus // 用户红包(红包ID,红包编号,用户ID,使用时间,订单ID,是否已
发邮件)
ecs_user_rank // 会员等级(名称,积分最小限额,最大限额,折扣,是否显示价格,特
殊会员)
ecs_virtual_cart // 虚拟卡(商品ID,卡号,密码,添加时间,失效时间,是否已卖完,
编号,crc32 校验码)
ecs_vote // 投票(名称,开始,结束,能否多选,统计)
ecs_vote_log // 投票记录(投票ID,IP,时间)
ecs_vote_option // 投票内容(投票ID,条目名称,条目统计)

php

关于AJAX的N篇贴子整理

Tags: ,

[ZT]老技术新外衣 如何设计一个包含javascript:;” onClick=”javascript:tagshow(event, ‘Ajax’);” target=”_self”>Ajax技术的PHP网页

掌握 Ajax,第 1 部分: Ajax 简介[转帖]

掌握 Ajax,第 2 部分: 使用 javascript 和 Ajax 发出异步请求[转帖]

AJAX实例学习手记

AJAX学习实例(二)

无刷新上传

[技术交流]Ajax & PHP without using the XmlHttpRequest Object

网站建设

php

PHP中引用&的使用注意事项

Tags: ,

之前一个朋友的帖子提到过这方面的疑问,这里简单整理一下,希望能让更多新学php的朋友得到帮助。

php的引用(就是在变量或者函数、对象等前面加上&符号)是个高级话题,新手多注意,正确的理解php的引用很重要,对性能有较大影响,而且理解错误可能导致程序错误!

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的,比如下面的代码:
$a = array(’a',’c'…’n');
$b = $a;
如 果程序仅执行到这里,$b和$b是相同的,但是并没有像C那样,$a和$b占用不同的内存空间,而是指向了同一块内存,这就是php和c的差别,并不需要 写成$b=&$a才表示$b指向$a的内存,zend就已经帮你实现了引用,并且zend会非常智能的帮你去判断什么时候该这样处理,什么时候不 该这样处理。

如果在后面继续写如下代码,增加一个函数,通过引用的方式传递参数,并打印输出数组大小。
function printArray(&$arr) //引用传递
{
print(count($arr));
}

printArray($a);

上面的代码中,我们通过引用把$a数组传入printArray()函数,zend引擎会认为printArray()可能会导致对$a的改变,此时就会自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。这就是前面提到的“写时拷贝”概念。

如果我们把上面的代码改成下面这样:
function printArray($arr)  //值传递
{
print(count($arr));
}

printArray($a);

上面的代码直接传递$a值到printArray()中,此时并不存在引用传递,所以没有出现写时拷贝。

大家可以测试一下上面两行代码的执行效率,比如外面加入一个循环1000次,看看运行的耗时,结果会让你知道不正确使用引用会导致性能下降30%以上。

抛砖引玉,欢迎大家讨论!

网站设计公司

php

菜鸟编程十大好习惯

Tags: ,

假如你和我一样是一只正在学习编程的菜鸟,那么下面的十个好习惯与你共勉之。
1、设计规划

现在是模块化程序设计的天下,应用程序要实现的目标就是金字塔尖,进行程序设计规划的意义就在于,对构成金字塔的基础模块进行划分,规划得越详细,模块 分工越明确,越容易明白下一步该做什么,这好比搭积木的游戏,你可以把你的积木块组合成各种各样的形状,但首先要熟悉每个积木块的功能。

2、有备无患

实战之前,先找几个样例程序研究研究,最起码明白怎么开头,怎么结尾,别打无准备之仗。

3、葵花宝典

做一份所用程序语言的精简列表,包括基本数据类型、各类运算符说明、基本语句结构、常用关键词(保留字)、常用函数(控件)说明等等。

4、自由独立

为你的应用程序建立一个单独的目录,这样既方便应用程序文件的管理,而且如果你要给程序搬“家”,卷起铺盖就可以走人了。

5、见名知意

程序再小,用的变量也不会少,变量起名应当见名知意是个老话题了,好处是显而易见的。推荐程序员使用“匈牙利命名法”,它会使你的起名工作变得轻而易举,而且相当专业。

6、对称之美

中国人讲究对称之美,用在编程里也很合适,如果程序里用到A循环嵌套B判断,B判断又包含C循环之类的结构,记着使用缩进法,让A:ENDDO对齐A:ENDDO,B:ENDIF对齐B:IF……诸如此类,依次缩进,总之对称就等于美观加易读。

7、多加注解

对程序中自定义的变量、函数、子程序加以功能性的注释说明,别嫌麻烦。如果过了三月五月,连自己写的东西都看不明白了,那才大麻烦。

8、环境保护

如果应用程序需要修改系统设置,记着应用开始前先保存设置,应用结束后要恢复设置,千万别污染环境。

9、拿来主义

一个人的力量是有限的,大家的力量是无限的,平时多看看《中国电脑教育报》,如果碰巧有好的经验,巧的方法,用得上的段子,不妨拿来。

10、忍者无敌

当你认为程序代码写的“百分百”正确,而程序编译执行百分百有毛病,你基本属于晕菜的时候,千万要忍,歇口气,重头来,别放弃!相信最终的胜利是属于你的!

网站设计公司

php

用AJAX实现聊天功能(part 1)

Tags: ,

网站建设

如何用AJAX实现聊天功能

AJAX planetphp Tutorials javascript:;” target=”_self”>Zend Framework  zendhomepage

bymaugrim| 0 comments | Monday, November 20, 2006

概述

实话实说,创建一个聊天的程序不是一个很艰难的程序!

写这篇文章的目的是教你一步一步地用XML作为传输载体来创建一个轻量级的聊天程序。这是一个很有趣的应用,而我写这篇文章的动机也是来自于我平时很喜欢PHP。同时,通过业余时间的钻研,我发现通过Web提供了一个稳定的论坛以后,人们往往希望通过Web能够时间即时的聊天室。这是因为虽然IRC和其它的一些即时的聊天工具已经很普及了,但是许多的用户仍然喜欢基于Web的聊天方式。原因有许多,比如这些基于Web的聊天工具可以通过一些合作的代理与那些即时聊天工具联系起来,或者Web的聊天工具使用很方便。

本文讨论的聊天程序的源代码你可以通过这两个链接进行下载:chat.tar.gz/chat.zip。源代码在本文中基本上都讨论到了(除了一些随后附加的补丁)。

为了创建这个聊天程序,我决定采用标准的第三方的库。因为我觉得既然这些第三方的库已经很好地解决了问题,我就没有必要自己来重新编写。可能有些人会认为使用这些库我们的程序就不是原创的,但是我们不必去理会这种没有意义的争论。

在服务器端,我决定采用Zend Framework 0.20 (发布于2006年10月31号)。客户端那边,通过采用原型的库,我们可以简化AJAX和Javascript的处理。其它的资源我决定使用Scriptaculous。当然,你可以使用其它的如jQuery,Dojo or或者其它类似的库来实现。

这次我们编写的聊天工具主要基于Zend Framework (PHP5),Javascript和协议库实现,目的是创建一个简单的便捷的聊天程序。另外,我们提供的源代码使用的是新的BSD的许可证,读者可以根据自己的需要自由地修改它。其它的细节我们就不讨论了,我们开始吧!

Zend Framework介绍

Zend Framework(Zend的开发框架)虽然出现的时间不长,但是很快就成为我最喜欢的PHP库之一了。从个人的角度来说,我不是很喜欢一些大型的框架,因为它们往往构建大型的架构,然后强迫你去使用没有必要的功能。但是,Zend Framework却是众多库文件的一个包,包里面的每一个类都是单独运行而且易于使用,同时又能够很方便地与我自己的代码结合起来。

你可以从http://framework.zend.com去下载Zend的代码。另外,使用文档也写得很丰富,同时我从邮件列表了解到Zend的开发框架一直在丰富中。除了官方的文档,我还推荐http://www.akrabat.com/zend-framework-tutorial/它是一个不错的使用手册,而且易于阅读。这里我们感谢Rob Allen为此所作的贡献。

文件夹分布

首先,下载Zend Framework的0.20版本,可以从http://framework.zend.com/download下载。在你的Web的发布目录下创建一个新的文件夹叫”chat-tutorial”。在这个新的文件夹里面,我们将创建新的资文件夹以便放置这个聊天程序需要的各种脚本。我们推荐使用的文件夹分布如下:

chat-tutorial/

/application

/controllers

/views

/library

/incubator

/public

/javascript

/styles

/javascript

/data

从网上下载的Zend开发框架的“./library/Zend”文件夹里面的文件需要拷贝到我们的“library”文件夹里面。所以现在“chat-tutorial/library”文件夹里面包含了一个Zend文件夹,里面包含了核心的库文件和Zend.php。你还可以单独下载”incubator”文件夹。”incubator”文件夹里面包含了Zend Framework里面的新的组件。这些组件很多是未定版、未注释的,但是最起码它们都是公开发布的版本。在0.20版本中,”incubator”包含了新的MVC组件,而且在本次的聊天室程序中我们会用到它。

把“./incubator/library” 文件夹复制到我们的“./library/incubator”文件夹当中。

我们将把“./application”文件夹作为我们存放程序的主要的一个文件夹。例如,我们要用它存放controllers和models。所谓的controllers(控制器)就是一个包含了应用主逻辑的类。它包含了最高运行级别的代码,并引入许多功能库文件、处理模型、建立视图和对用户数据进行过滤/认证有效性。这些应用主逻辑被分开放置在具体的类的方法中,我们通过访问具有特殊意义的URL(脚本文件名)来引入这些控制器和方法。

如果刚才的讲述中,让你有些不明白,不用担心。我们很快用具体的例子来阐述。

Library的文件夹当中,我们将存放所有的库文件,例如Zend Framewrok(包括了核心文件和扩展功能文件)。这里我们暂时不需要其它的PHP库文件,但是请注意,如果你在其它别的项目中同时使用到Zend Framework和别的PHP库的时候,你可以把那些PHP库文件也放入Library文件夹当中。

在“public”的文件夹当中,我们放置所有需要的脚本文件。这些脚本文件都可以通过URL在Web中访问到。它们包括图片文件、css文件和javascript脚本文档。另外,为了便于管理和使用,我增加了一个javascript脚本文件的根目录,并把我们自己创建的javascript脚本文件放置进去。从本质上说,你需要了解“public”和“javascript”两个目录是用户唯一能够访问的目录。其它所有的脚本文件必须放置在用户无法访问的目录当中(我们不希望用户能访问到)。所以我们将对其它的目录设置访问权限—这是出于最低的安全级别考虑的。我们可以通过配置Apache的.htaccess文件来实现这个权限控制。

最后,因为我们将采用XML来作为数据的存储载体来传递聊天信息。所以我们使用“./data”文件夹来存储XML文件。所以为了保证Apache(PHP的运行脚本程序)能够在这个目录中写文件,你需要注意Apache在这个目录的权限设置。这里我们建议只允许PHP来写XML文件。当然,如果你不是很了解Linux,你也可以简单地把目录的权限设置为777。Windows平台的开发工程师就无需要注意这点了。

从Zend Framework使用开始我们的聊天程序

Zend Framework运行的概念是通过调用的url包含的字符串去找到一个相对应的类,即控制器。我想你能猜到了,包含控制器的类的脚本文件都被放置./application/controllers目录当中。一个控制器类包含了运行动作的许多方法,也是因为这个原因我们刚才叫它们动作。例如,这样的一个urlhttp://www.example.com/chat/refresh可能会指向RefreshAction()方法。而这个方法所在的类是在”application/controllers”目录下的ChatController.php文件中声明的。值得注意的是通过url的格式Zend Framework是怎么找到控制器并找到方法的呢。这个技术上的映射过程,我们在这里就不详细讨论了(你可以从官方的技术文档或者手册看到详细的说明)。

这个映射过程是由Zend_Controller类来处理的,它用来解析所有的url地址。为了让Zend_Controller类来解析所有的url,所有的请求都必须通过一个统一的index.php文件(映射文件)来实现。这个映射文件所做的事情就是启动这个Framework并且把其它的初始化需要的代码加入进来,例如我们通过url寓意的。在这里我们同样需要.htaccess文件来保证所有的访问都指向index.php文件。这种把所有的请求转向到一个固定的入口的想法来源于前段控制器设计模式。如果你并不是很了解这个思想,你可以通过google了解下它具体的信息,而且如果你是一个好奇心强的人的话,你会喜欢上它的。

首先,关于.htaccess文件。我们需要在根目录“chat-tutorial”创建一个.htaccess文件。文件的内容是:

RewriteEngine on

RewriteCond %{REQUEST_URI} !/public.*

RewriteCond %{REQUEST_URI} !/javascript.*

RewriteRule .* index.php

php_flag magic_quotes_gpc off

php_flag register_globals off

以上的设置告诉Apache使用mod_rewrite模块来进行转向处理。当一个请求访问本目录或者本目录下任何一个子目录的时候,Aapche将自动进行转向。配置中的RewriteRule配置告诉Apache转向的地址是index.php(也就是我们实现固定转向的地方)。最后两个php_flag的条目的配置比较简单,它们只是确保“magic_quotes” 和 “register_globals”这两个PHP的配置关闭的。这样的配置是用来降低潜在的安全风险,但是我们这样做的目的是无论是有意还是无意,我们不用依靠系统自己的配置是否关闭。当然,在PHP6发布以后,这两个功能将被彻底关闭。我想Web安全专家听到这个消息后,会放心地去参加聚会了…

另外,我们在.htaccess中还有两个条件规则。它告诉mod_rewrite模块,当请求./public或者./javascript的时候,不需要进行转向处理。所以放置在这两个目录下面的文件是可以被直接访问的,而且这两个目录下面的文件对项目本身不能有什么安全的风险。

在这里,index.php这个映射文件基本上就是在做初始化、加载类或者是对我们调用Zend Framework的类进行初始化。

让我们来看看index.php脚本的代码:

php

<?php

/**

* Bootstrap file for Chat Tutorial

*/

/*

* The basics…

*/

error_reporting(E_ALL|E_STRICT);

ini_set(’display_errors’, 1); //disable on production servers!

date_default_timezone_set(’Europe/London’);

/*

* Start our session

*/

session_start();

/*

* Setup the include_path to the ZF library.

* We set the incubator first so the

* incubator classes are loaded in preference

* to core ZF classes where two versions exist.

*

* When 0.21 is released, the MVC classes in

* Incubator will move to the core library.

*/

set_include_path(

‘./library/incubator/library’

. PATH_SEPARATOR . ‘./library’

);

include ‘Zend.php’;

/*

* Use Zend::loadClass() to load essentials

* Probably a good idea to use require_once()

* elsewhere to avoid unnecessary coupling.

*/

Zend::loadClass(’Zend_Registry’);

Zend::loadClass(’Zend_Controller_Front’);

Zend::loadClass(’Zend_Controller_RewriteRouter’);

Zend::loadClass(’Zend_View’);

/*

* Load and register our View for later use

*/

$view = new Zend_View();

$view->setScriptPath(’./application/views’);

Zend_Registry::getInstance()->set(’view’, $view);

/*

* Instantiate a Request to set BaseURL

* See later…

*/

$request = new Zend_Controller_Request_Http();

/*

* Instantiate a RewriteRouter

*/

$router = new Zend_Controller_RewriteRouter();

/*

* On my platform, I need to set the BaseURL for ZF 0.20

* RewriteBase is assumed to be $_SERVER['PHP_SELF'] after

* removing the trailing “index.php” string.

*

* PHP_SELF can be user manipulated. Avoided using SCRIPT_NAME

* or SCRIPT_FILENAME because they may differ depending on SAPI

* being used.

*/

$base_url = substr($_SERVER['PHP_SELF'], 0, -9);

$request->setBaseUrl($base_url);

/*

* Setup and run the Front Controller

*

* Set Controller Dir, add the RewriteRouter, dispatch the

* modified Request (with updated BaseURL) and finally

* get the resulting Response object.

*/

$controller = new Zend_Controller_Front;

$controller->setControllerDirectory(’./application/controllers’);

<P style=”MARGIN: 0cm 0cm 0pt; TEXT-ALIG

php

实例应用:使用PHP来进行加密与解密

Tags: ,

<?php
$key = “This is supposed to be a secret key !!!”;
function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = “”;
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}
function encrypt($txt,$key)
{
srand((double)microtime()*1000000);
$encrypt_key = md5(rand(0,32000));
$ctr=0;
$tmp = “”;
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($encrypt_key,$ctr,1) .
(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
$ctr++;
}
return keyED($tmp,$key);
}
function decrypt($txt,$key)
{
$txt = keyED($txt,$key);
$tmp = “”;
for ($i=0;$i<strlen($txt);$i++)
{
$md5 = substr($txt,$i,1);
$i++;
$tmp.= (substr($txt,$i,1) ^ $md5);
}
return $tmp;
}
$string = “Hello World !!!”;
// encrypt $string, and store it in $enc_text
$enc_text = encrypt($string,$key);
// decrypt the encrypted text $enc_text, and store it in $dec_text
$dec_text = decrypt($enc_text,$key);
print “Original text : $string <Br>”;
print “Encrypted text : $enc_text <Br>”;
print “Decrypted text : $dec_text <Br>”;
?>

网站设计公司

php

简单示例:AJAX结合PHP代码实现登录

Tags: ,

<html>
<head>
<scrīpt language=”javascrīpt”>
function postRequest(strURL){
var xmlHttp;
if(window.XMLHttpRequest){ // For Mozilla, Safari, …
var xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject){ // For InternetExplorer
var xmlHttp = new ActiveXObject(”Microsoft.XMLHTTP”);
}
xmlHttp.open(’POST’, strURL, true);
xmlHttp.setRequestHeader(’Content-Type’, ‘application/x-www-form-urlencoded’);
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState == 4){
updatepage(xmlHttp.responseText);
}
}
xmlHttp.send(strURL);
}

function updatepage(str){
if(str==”yes”){
alert(”Welcome User”);
}else{
alert(”Invalid Login! Please try again!”);
}
}

function call_login(){
var username = window.document.f1.username.value;
var password = window.document.f1.password.value;
var url = “login.php?username=” + username + “&password=” +password ;
postRequest(url);
}
</scrīpt>
</head>

<body>
<Center>

<form name=”f1″ ōnSubmit=”return call_login();”>
<table border=”0″ bgcolor=”#CCCCCC” cellspacing=”1″ cellpadding=”3″ width=”316″>
<tr>
<td align=”left” colspan=”2″><b><font size=”5″ color=”#000080″>Login</font></b></td>
</tr>
<tr>
<td align=”right” width=”124″><b><font color=”#000080″>User
Name:</font></b></td>
<td width=”177″><input type=”text” name=”username” id=”user” size=”20″ value=”" /></td>
</tr>
<tr>
<td align=”right” width=”124″><b><font color=”#000080″>Password:</font></b></td>
<td width=”177″><input type=”password” name=”password” size=”20″ value=”" /></td>
</tr>
<tr>
<td colspan=”2″ align=”center”><input type=”button” name=”a1″ value=”Login” ōnClick=”call_login()”></td>
</tr>
</table>
</form>

</center>
</body>
</html>

javascript:;” onClick=”javascript:tagshow(event, ‘PHP’);” target=”_self”>PHP脚本部分login.php:

<?
$username=$_GET["username"];
$password=$_GET["password"];
if($username==”admin” && $password==”admin”){
echo “yes”;
}else{
echo “No”;
}
?>

网站设计公司

php

用PHP写mail函数 配置好后需要重启apache

Tags: ,

今天看书,看到mail函数,就自己练着写了个简单的程序。
<?php

$tomail=’boy805@tom.com’;
$name=’liuyu’;
$text=’you win!!’;

if(mail($tomail,$name,$text)) //函数有5个参数前3个是必填参数。第一个参数表示目的地址,第二个                                参数表示为主题,第三个参数表示内容。
{
echo ‘ok’;
}
else
{
echo ‘no’;
}

?>
要注意的一点是,mail函数的使用,需要在php.ini里边配置。
[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from =me@example.com

配置后
[mail function]
; For Win32 only.
SMTP = smtp.tom.com //指定你的邮箱smtp
smtp_port = 25

; For Win32 only.
sendmail_from =boy805@tom.com//你所使用的邮箱

配置好后要记得重启apache啊!

不过真是怪了,在单位写的就发送成功了,在家写一样一样的就没成功,大家来看看~~

网站设计

php

五个成功习惯 让正则表达式经受的起反复试验

正则表达式难于书写、难于阅读、难于维护,经常错误匹配意料不到的文本或者错过了有效的文本,这些问题都是由正则表达式的表现和能力引起的。每个元字符(metacharacter)的能力和细微差别组合在一起,使得代码不借助于智力技巧就无法解释。

许多包含一定特性的工具使阅读和编写正则表达式变得容易了,但是它们又很不符合习惯。对于很多程序员来说,书写正则表达式就是一种魔法艺术。他们坚持自己 所知道的特征并持有绝对乐观的态度。如果你愿意采用本文所探讨的五个习惯,你将可以让你设计的正则表达式经受的住反复试验。
本文将使用Perl、PHP和Python语言作为代码示例,但是本文的建议几乎适用于任何替换表达式(regex)的执行。

一、使用空格和注释
对于大部分程序员来说,在一个正则表达式环境里使用空格和缩进排列都不成问题,如果他们没有这么做一定会被同行甚至外行人士看笑话。几乎每个人都知道把代码挤在一行会难于阅读、书写和维护。对于正则表达式又有什么不同呢?
大部分替换表达式工具都具有扩展的空格特性,这允许程序员把他们的正则表达式扩展为多行,并在每一行结尾加上注释。为什么只有少部分程序员利用这个特性呢?Perl 6的正则表达式默认就是扩展空格的模式。不要再让语言替你默认扩展空格了,自己主动利用吧。
记住扩展空格的窍门之一就是让正则表达式引擎忽略扩展空格。这样如果你需要匹配空格,你就不得不明确说明。
在Perl语言里面,在正则表达式的结尾加上x,这样“m/foo|bar/”变为如下形式:
m/
foo
|
bar
/x
在PHP语言里面,在正则表达式的结尾加上x,这样“”/foo|bar/””变为如下形式:
“/
foo
|
bar
/x”
在Python语言里面,传递模式修饰参数“re.VERBOSE”得到编译函数如下:
pattern = r”’
foo
|
bar
”’
regex = re.compile(pattern, re.VERBOSE)
处理更加复杂的正则表达式时,空格和注释就更能体现出其重要性。假设下面的正则表达式用于匹配美国的电话号码:
\(?\d{3}\)? ?\d{3}[-.]\d{4}
这个正则表达式匹配电话号码如“(314)555-4000”的形式,你认为这个正则表达式是否匹配“314-555-4000”或者“555- 4000”呢?答案是两种都不匹配。写上这么一行代码隐蔽了缺点和设计结果本身,电话区号是需要的,但是正则表达式在区号和前缀之间缺少一个分隔符号的说 明。
把这一行代码分成几行并加上注释将把缺点暴露无疑,修改起来显然更容易一些。
在Perl语言里面应该是如下形式:
/
\(?     # 可选圆括号
\d{3} # 必须的电话区号
\)?     # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-.]    # 另一个分隔符号
\d{4} # 四位数电话号码
/x
改写过的正则表达式现在在电话区号后有一个可选择的分隔符号,这样它应该是匹配“314-555-4000”的,然而电话区号还是必须的。另一个程序员如果需要把电话区号变为可选项则可以迅速看出它现在不是可选的,一个小小的改动就可以解决这个问题。

二、书写测试
一共有三个层次的测试,每一层为你的代码加上一层可靠性。首先,你需要认真想想你需要匹配什么代码以及你是否能够处理错误匹配。其次,你需要利用数据实例来测试正则表达式。最后,你需要正式通过一个测试小组的测试。
决定匹配什么其实就是在匹配错误结果和错过正确结果之间寻求一个平衡点。如果你的正则表达式过于严格,它将会错过一些正确匹配;如果它过于宽松,它将会产 生一个错误匹配。一旦某个正则表达式发放到实际代码当中,你可能不会两者都注意到。考虑一下上面电话号码的例子,它将会匹配“800-555-4000  = -5355”。错误的匹配其实很难发现,所以提前规划做好测试是很重要的。
还是使用电话号码的例子,如果你在Web表单里面确认一个电话号码,你可能只要满足于任何格式的十位数字。但是,如果你想从大量文本里面分离电话号码,你可能需要很认证的排除不符合要求的错误匹配。
在考虑你想匹配的数据的时候,写下一些案例情况。针对案例情况写下一些代码来测试你的正则表达式。任何复杂的正则表达式都最好写个小程序测试一下,可以采用下面的具体形式。
在Perl语言里面:
#!/usr/bin/perl

my @tests = ( “314-555-4000″,
“800-555-4400″,
“(314)555-4000″,
“314.555.4000″,
“555-4000″,
“aasdklfjklas”,
“1234-123-12345″
);

foreach my $test (@tests) {
if ( $test =~ m/
\(?     # 可选圆括号
\d{3} # 必须的电话区号
\)?     # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-\s.]  # 另一个分隔符号
\d{4} # 四位数电话号码
/x ) {
print “Matched on $test\n”;
}
else {
print “Failed match on $test\n”;
}
}

在PHP语言里面:
<?php
$tests = array( “314-555-4000″,
“800-555-4400″,
“(314)555-4000″,
“314.555.4000″,
“555-4000″,
“aasdklfjklas”,
“1234-123-12345″
);

$regex = “/
\(?     # 可选圆括号
\d{3} # 必须的电话区号
\)?     # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-\s.]  # 另一个分隔符号
\d{4} # 四位数电话号码
/x”;

foreach ($tests as $test) {
if (preg_match($regex, $test)) {
echo “Matched on $test<br />;”;
}
else {
echo “Failed match on $test<br />;”;
}
}
?>;

在Python语言里面:
import re

tests = ["314-555-4000",
"800-555-4400",
"(314)555-4000",
"314.555.4000",
"555-4000",
"aasdklfjklas",
"1234-123-12345"
]

pattern = r”’
\(?                 # 可选圆括号
\d{3} # 必须的电话区号
\)?     # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-\s.]  # 另一个分隔符号
\d{4} # 四位数电话号码
”’

regex = re.compile( pattern, re.VERBOSE )

for test in tests:
if regex.match(test):
print “Matched on”, test, “\n”
else:
print “Failed match on”, test, “\n”

运行测试代码将会发现另一个问题:它匹配“1234-123-12345”。
理论上,你需要整合整个程序所有的测试到一个测试小组里面。即使你现在还没有测试小组,你的正则表达式测试也会是一个小组的良好基础,现在正是开始创建的 好机会。即使现在还不是创建的合适时间,你也应该在每次修改以后运行测试一下正则表达式。这里花费一小段时间将会减少你很多麻烦事。

三、为交替操作分组
交替操作符号(|)的优先级很低,这意味着它经常交替超过程序员所设计的那样。比如,从文本里面抽取Email地址的正则表达式可能如下:
^CC:|To:(.*)
上面的尝试是不正确的,但是这个bug往往不被注意。上面代码的意图是找到“CC:”或者“To:”开始的文本,然后在这一行的后面部分提取Email地址。
不幸的是,如果某一行中间出现“To:”,那么这个正则表达式将捕获不到任何以“CC:”开始的一行,而是抽取几个随机的文本。坦白的说,正则表达式匹配 “CC:”开始的一行,但是什么都捕获不到;或者匹配任何包含“To:”的一行,但是把这行的剩余文本都捕获了。通常情况下,这个正则表达式会捕获大量 Email地址,所有没有人会注意这个bug。
如果要符合实际意图,那么你应该加入括号说明清楚,正则表达式如下:
(^CC:)|(To:(.*))
如果真正意图是捕获以“CC:”或者“To:”开始的文本行的剩余部分,那么正确的正则表达式如下:
^(CC:|To:)(.*)
这是一个普遍的不完全匹配的bug,如果你养成为交替操作分组的习惯,你就会避免这个错误。

四、使用宽松数量词
很多程序员避免使用宽松数量词比如“*?”、“+?”和“??”,即使它们会使这个表达式易于书写和理解。
宽松数量词可以尽可能少的匹配文本,这样有助于完全匹配的成功。如果你写了“foo(.*?)bar”,那么数量词将在第一次遇到“bar”时就停止匹 配,而不是在最后一次。如果你希望从“foo###bar+++bar”中捕获“###”,这一点就很重要。一个严格数量词将捕获“###bar++ +”。
假设你要从HTML文件里面捕获所有电话号码,你可能会使用我们上文讨论过的电话号码正则表达式的例子。但是,如果你知道所有电话号码都在一个表格的第一列里面,你可以使用宽松数量词写出更简单的正则表达式:
<tr>;<td>;(.+?)<td>;
很多刚起步的程序员不使用宽松数量词来否定特定种类。他们能写出下面的代码:
<tr>;<td>;([^>;]+)</td>;
这种情况下它可以正常运行,但是如果你想捕获的文本包含有你分隔的公共字符(这种情况下比如</td>;),这将会带来很大麻烦。如果你使用了宽松数量词,你只要花上很少的时间组装字符种类就能产生新的正则表达式。
在你知道你要捕获文本的环境结构时,宽松数量词是具有很大价值的。

五、利用可用分界符
Perl 和PHP语言常常使用左斜线(/)来标志一个正则表达式的开头和结尾,Python语言使用一组引号来标志开头和结尾。如果在Perl和PHP中坚持使用 左斜线,你将要避免表达式中的任何斜线;如果在Python中使用引号,你将要避免使用反斜线(\)。选择不同的分界符或引号可以允许你避免一半的正则表 达式。这将使得表达式易于阅读,减少由于忘记避免符号而潜在的bug。
Perl和PHP语言允许使用任何非数字和空格字符作为分界符。如果你切换到一个新的分界符,在匹配URL或HTML标志(如“http://”或“<br/>;”)时,你就可以避免漏掉左斜线了。
例如,“/http:\/\/(\S)*/”可以写为“#http://(\S)*#”。
通用分界符是“#”、“!”和“|”。如果你要使用方括号、尖括号或者花括号,只要保持前后配对出现就可以了。下面就是一些通用分界符的示例:
#…# !…! {…} s|…|…| (Perl only) s[…][…] (Perl only) s<…>;/…/ (Perl only)
在Python中,正则表达式首先会被当作一个字符串。如果你使用引号作为分界符,你将漏掉所有反斜线。但是你可以使用“r””字符串避免这个问题。如果针对“re.VERBOSE”选项使用三个连续单引号,它将允许你包含换行。例如 regex = “(file://w+)(//d+)”可以写出下面的形式:
regex = r”’
(\w+)
(\d+)
”’

小结
本文的建议主要着眼于正则表达式的可读性,在开发中养成这些习惯,你将会更加清晰的考虑设计和表达式的结构,这将有助于减少bug和代码的维护,如果你自己就是这个代码的维护者你将倍感轻松。

网站建设

php

精确到每一秒钟 如何实现在线人数的显示?

Tags: ,

网站建设

<?php
session_start();
$dat_now1=date(”H+i+s”);//取时间
$p2=explode(”+”, $dat_now1);
$dat_number1=$p2[0]*3600+$p2[1]*60+$p2[2];//取秒

if($online_time<>”")//上次刷新时间
{$dat_h=substr($online_time,11,2);
$dat_i=substr($online_time,14,2);
$dat_s=substr($online_time,17,2);
$dat_number=$dat_h*3600+$dat_i*60+$dat_s;
}

$tmptime=$dat_number1-$dat_number;//上次到现在的间隔秒数
if(session_is_registered(username)&&(($tmptime>300)&brvbar;&brvbar;($tmptime<0)))//如果不到5分钟
{
$online_time=date(”Y-m-d H:i:s”);
$str=”replace lt_t_online set lt_username=’$username’,lt_lasttime=now()”;//写入数据库
$res=mysql_query($str);
}
?>
以上文件每分钟自动刷新一次
以下是5分钟运行一次的守护进程
<?
$str = “delete from lt_t_online where UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(lt_lasttime)>300″;
mysql_query($str);