PHP中Header转向问题

M6上有人问了一个这样的问题:

header(“Location:$url”)
$url从GET传过来时会转到http://127.0.0.1/$url
谁知道原因?

出现这种转向不正确的原因是通过GET方法获取的URL后缀有可能是不正确的,比如带了其他参数等等,而且指定一个准确的相对地址也不容易,所以我们有必要先获取服务器URL,然后再获取后面的字符串地址,再加上我们需要访问的文件名

主要代码如下:

 
<?php
/* Redirect to a different page in the current directory that was requested */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

PHP手册中也有讲到,具体请点击:PHP手册

最后解释一下为什么要用rtrim()方法,这样做是为了过滤一些被编码的URL,比如查询符号“?”等,具体用法请参考PHP手册里面的解释,我就不罗嗦了。

发表在 Programming | 标签为 | 留下评论

ghs.google.com被封解决办法

刚看了一下我的访问统计,发现很多是通过ghs.google.com这个关键词来的,看来最近ghs.google.com被和谐了之后还是很多人着急的,这里提供一个解决办法,到现在为止还是可以用的,以后会不会被和谐就不知道了。

这个惊天地泣鬼神的方法就是用A记录绑定IP(看官应该知道什么是A记录而且知道怎么绑定的吧,不会请留言 :) )

目前还能用的几个IP

216.239.34.21
216.239.36.21
216.239.38.21

只需选一个就可以了

访问速度请看:用GAE做了个小应用,欢迎大家来玩

更新:2009-3-4

已经全部失效,正在寻找其他解决方案

2009-6-24更新:

72.14.232.215 可以使用

如果IP失效,可以ping 一下

ghs.xiao3.co.cc 会得到最新的IP

如果你为了省麻烦,直接把自己的域名CNAME到ghs.xiao3.co.cc 域名也行
发表在 Study & Reading | 标签为 | 10 条评论

对PHP记事本程序(二)的修订

刚才发现我贴在博客上的那段代码是有误的,现郑重变更如下:

if($db=mysql_connect( $host,$userName,$passwd))

应该变更成:

 
if($db=mysql_connect( $this->host,$this->userName,$this->passwd))
发表在 Programming | 标签为 | 留下评论

PHP记事本程序(三)—-持续改进

经过测试,上篇发布的数据库操作代码,在数据库连接上效率出现很大的问题,原因是过多的使用了try……catch语句,消耗了更多的内存资源,经过优化,其代码如下:

<?php
/**
 * 数据库操作类
 */
 
class MySql {
 
	var $user,$pass,$host,$db;
	var $id,$data,$fields,$row,$row_num,$insertid,$version,$query_num=0;
 
	function MySql($host,$user,$pass,$db)
	{
		$this->host = $host;
		$this->pass = $pass;
		$this->user = $user;
		$this->db = $db;
		$this->dbconnect($this->host, $this->user, $this->pass);
		$this->selectdb($this->db);
 
	}
	function dbconnect($host,$user,$pass)
	{
		$this->id = @ mysql_connect($host,$user,$pass) OR
		sysMsg("连接数据库失败,可能是mysql数据库用户名或密码错误");
	}
	function selectdb($db)
	{
		@ mysql_select_db($db,$this->id) OR sysMsg("未找到指定数据库");
	}
 
	function query($sql)
	{
		$query = @ mysql_query($sql,$this->id)
		OR sysMsg("SQL语句执行错误:$sql <br />".$this->geterror());
		$this->query_num();
		return $query;
	}
 
	function fetch_array($query)
	{
		$this->data = @mysql_fetch_array($query);
		return $this->data;
	}
	function query_num()
	{
		$this->query_num++;
	}
	function num_fields($query)
	{
		$this->fields = @mysql_num_fields($query);
		return $this->fields;
	}
	function fetch_row($query)
	{
		$this->row = @mysql_fetch_row($query);
		return $this->row;
	}
 
	function num_rows($query)
	{
		$this->row_num = @mysql_num_rows($query);
		return $this->row_num;
	}
 
	function insert_id()
	{
		$this->insertid = mysql_insert_id();
		return $this->insertid;
	}
 
	function fetch_one_array($sql)
	{
		$query = $this->query($sql);
		$this->data = $this->fetch_array($query);
		return $this->data;
	}
	function geterror()
	{
		return mysql_error();
	}
}
 
?>
发表在 Programming | 标签为 | 留下评论

PHP记事本程序(二)—–面向对象设计

为了使程序拥有更好的扩展性,重用性以及可读性,我对涉及数据库的代码进行了改进,这种改进是并不是浪费时间,因为公司所有的代码都是在团队协作下完成的,你至少让你伙伴读懂你的代码,而不是使他疯掉。
良好的程序结构能大幅降低后期的维护费用,这也是对客户和公司负责,否则您将失去更多的客户,因为你本来可以给他们带来更多的让渡价值,而没有做。
废话不说了,照例看源代码:

<?php
  class OperateDB
  {
  // 	var 	$db;
   	static $host="localhost";
   	static $user="root";
   	static $passwd="";
 
 
   	//连接数据库
    public	function OpenDB()
    {
    	try
    	{
    		if($db=mysql_connect( $host,$user,$passwd))
    		{
    			return $db;
    		}
    		else
    		{
    			throw new exception("Sorry,could not connect to mysql.");
    		}
    	}
    	catch(exception $e)
    	{
    		echo $e->getmessage();
    	}
    }
    //选择数据库
    public function SelectDB($whichdb,$db)
    {
    	try
    	{
 
    		if(!mysql_select_db($whichdb,$db))
    		{
    			throw new exception("Sorry,database could not be opened.");
    		}
 
    	}
    	catch(exception $e)
    	{
    		echo $e->getmessage();
    	}
 
    }
    public function CloseDB($db)
    {
    	mysql_close($db);
    }
 
    public function Query($queryString)
    {
    	if($mysquery=mysql_query("$queryString"))
    	{
    		return $mysquery;
    	}
    	else
    	{
    		echo mysql_error();
    	}
    }
 
 
 
  }
?>
发表在 Programming | 标签为 | 留下评论

PHP记事本程序(一)

趁着今天还有点时间,学习一下PHP,说来惭愧,一年前我已经能读懂PHP程序了,但是到现在写过的代码也没超过100行,都是光说不练的,理论知识一大堆,时间的没有。

说来好笑,在数据库查询语句中,我照搬了Java中的样式,结果总是出现“unknown collum”,原来,PHP中就算传入的是参数信息,查询语句中依然要加上单引号。

下面是源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
<html>
<title>
记事本程序
</title>
<body>
<form method="POST" action="#">
标题:<input type="text" name="title" >
<br/>
内容:<br />
			<textarea rows="10" cols="30"  name="content"></textarea>
		<br />
		<input type="submit" value="提交" name="submit" >
	<input type="reset"  value="取消" name="cancel">
 
</form>
 
 
</body>
</html>
<?php
 
	$ti=$_POST["title"];
	$co=$_POST["content"];
	$th=date("Y-m-d");
	//下面定义数据库信息
	$host="localhost";
	$username="root";
	$passwd="";
 
		if($db=mysql_connect($host,$username,$passwd))
		{
			echo "sucessfully connect to database.";
 
			//mysql_close($db);
		}
		else
		{
			throw new exception("sorry ,could not connect to mysql.");
		}
 
	if(!mysql_select_db("test",$db))
	{
		echo "选择表失败";
	}
	//一定要有单引号,否则出错
	$queryString="INSERT INTO notepad (biaoti,neirong,shijian) VALUES ('$ti','$co','$th')";
 
	if(mysql_query($queryString,$db))
	{
		echo"插入成功!";
	}
	else
	{
 
 
		$str=mysql_error();
		echo $str;
	}
	mysql_close($db);
?>
发表在 Programming | 标签为 | 留下评论

学生选课系统—C#语言实现—-三层架构

花了三十个小时写的winform程序,采用了标准的三层架构实现,并写了到目前为止最完整的文档,包括需求分析报告,测试方案,数据字典,测试报告等等文档,这要归功于我们三位的女同胞,她们完成了报告,我十分的感谢她们

代码结构

登录框

教师界面

管理员界面

学生界面

源代码下载地址:http://code.google.com/p/selectcourse/
源代码SVN地址:svn checkout http://selectcourse.googlecode.com/svn/trunk/ selectcourse-read-only

发表在 Programming, Tools | 标签为 , | 7 条评论

ghs.google.com

最近一些事情忙,再加上本来就懒,很少上网,就算上也只是看下新闻就撤。从今天开始有点空了,准备晚上 回来写一下python,用于Google app engine,写几个有意思的东西玩玩。

世界上伟的事情不知道什么时候又发生了一次,发现自己绑定在Google的域名居然不能用了,第一反应就是Google被盾了,ping了一下,全都是request time out。很早以前想把域名绑在blogspot上,有人告戒我要死掉的,最后出于安全考虑没绑,现在Google推出了Google apps 和Google app engine,个人觉得很有意思,特别是Google app engine和Google apps中的calendar。

我从不在博客上发牢骚,但是今天真的很气愤,我真搞不懂某些心理阴暗的家伙到底怎么了,这些服务碍你事了吗?你们家有亲戚卖虚拟主机的吗?当年百度和Google竞争的时候你们打着爱国的旗号,ok,你们阴谋得逞了,培养了一个太监,最后Google为了生存,也不得不自宫,虽然自宫的程度没有完全令你们满意。

Google blogspot上有XX内容,令你们不爽,可你也不能连其他的一起封了吧!你们的技术是多么的先进啊,每天我上网的内容总是从某个IP上redirect来的,难道这点技术还能难道你们?

不过这也不算荒唐,更好笑的是:把Google earth也封了,说爆露了军事秘密,:)  哈哈,真是个笑话,Google earth 在全球用户超过五千万,就算中国人伟大,不看这些资本主义的东西,外国人不是看了吗?那就不爆露军事机密?不让中国人看就不爆露军事机密了?

Allen说了一句令我佩服的话:谁让你生活在中国呢!对啊,谁让我生活在中国这么伟大而古老的国家呢!

发表在 Tools | 标签为 | 3 条评论

帮助Firefox创造世界纪录

为什么要帮助firefox创造世界纪录?

1.firefox完全遵从W3C标准,而不是像微软那样以为自己是老大,自己搞一套标准单干

2、firefox从来都不会恶意推广,而IE通过捆绑销售来占领市场

3、firefox对于开源的贡献远远大于微软

4、firefox需要支持

5、使用firefox可以显著改善您的浏览体验

下载体验:Firefox

Download Day - Chinese

发表在 Tools | 标签为 | 一条评论

编程新手应该知道的

学习基础也是有窍门的,对于大部分概念来说,都相对符合人的思维逻辑,因此你可以轻易的理解它们,也不容易发生混淆;但对于初入编程世界的朋友们来 说,仍有一些是规则是陌生的,甚至是难以理解的。这时候,你所要做的就是学习并接受它们,如果你不顾这些规则而随意在这个世界中驰骋,我想编译器一定会给 你好看。 : )
以下是我所总结的在学习编程基础知识的时候你所应该注意的要点,有挂一漏万之嫌,但至少颇具代表性。看看你是否已经熟练的掌握了它们:

1、标识符规则:

这里的规则不仅仅指那些由编译器老大管辖的条条框框:不能以数字开头,可以包含数字、字母、下划线、美元符号……等等。同样也包含一些“民间”的约 定,例如变量、函数命名以小写字母开头,类命名以大写字母开头,常量命名均使用大写字母等等…..你不遵守这些约定,编译器不会对你亮红灯,但会造成你的 程序可读性下降。这样我想起《thinking in java》的译著作者侯捷先生,就是因为忽视了大陆读者的阅读习惯,自创了一些生涩的词汇,结果被很多读者以此为借口抛掷鸡蛋(当然我明白更主要的原因是 大多数读者嫌这本书实在太贵了: )。

2.=与==

如果你正在读小学一年级,你可以告诉我“=”与“==”的区别就是一个等号和两个等号的区别,但作为一个程序员,你应该理解它们从根本上不是一类事 物,“=”是赋值运算符,而“==”是比较运算符。所以不要再问我if(a=b) a=1;这样的代码为什么不对。但我承认,在刚开始接触程序的时候(c语言),我也犯过不少次这样的错误,而且很长时间找不到问题所在,等到发现了错误, 又总是自责自己为什么会如此愚蠢。我现在特别提醒你注意这一点,如果仍然犯下这样的错误,那只能说明你比我更加愚蠢。:)

3.运算符优先级

一个经常被人忽视的问题!的确,它可以通过另一种方式来完全避免优先级带来的困扰,那就是频繁的使用“()”,通过“()”来决定你每一步的运算顺 序。只要你不怕麻烦,你完全可以这么做,而且也增加了程序的可读性。但不是所有的人都喜欢这样,一个老资格的程序员通常愿意在一大长串表达式中使用数个优 先级各不相同的运算符且不包含任何的小括号,这种情况就是对你对运算符优先级的掌握的一个考验了。但不管怎么说,使用“()”来明确你的运算顺序并不是一 件坏事,甚至值得推荐。

4.i++与++i

我在前面的文章中就已经提到这个问题,尽管现在看起来简单无比,但当时的确给我们带来了一些困扰,这个问题也是非常普遍的。充分理解它的方法就是写几个包含i++和++i的表达式,然后观察表达式的运算结果及i的值。很快,这对于你来说将不再是个问题。

5.数据类型转换

你可能不经常用到数据类型转换,但你至少该知道它们的原理,那些转换是隐式的,而那些转换必须显式地进行,而且有可能造成数据的损坏。了解了这些,可以让你避免一些奇怪的错误。因为通常由数据类型转换所带来的程序问题很难被觉察到。

6.数组

严格的说,数组不是一种数据类型,而是一种数据结构。这是一个值得你认真研究的概念。因为在实际应用中,数组的使用率大大超过其他集合类型甚至是某 些原始类型。你需要了解构造和初始化数组的各种有效的格式,同时也应该对二位数组有所了解。数组与循环控制的配合可能已经可以一个完整的程序中一半的工 作。

发表在 Excellence Article | 标签为 | 留下评论