作者joehuang92 (++红色世界++)
看板b95902HW
标题[分享] PHP小教学(基本概念、档案存取)
时间Sat Dec 30 01:34:36 2006
接下来的一系列会稍微把PHP的一些小观念阐释清楚,会的人就跳过吧XD
<什麽是PHP?>
PHP是一种伺服器端的程式语言。与Javascript不同,Js是在用户端的电脑执行程式,而
PHP则是在伺服器端被执行,而结果则再透过伺服器送到用户端。
浏览器基本上只会看的懂HTML的语言,并不懂PHP,那麽PHP是怎麽被内嵌到网页的呢?
在一个内嵌PHP语言的网页中,当用户对伺服器提出浏览网页的要求,伺服器会先"看过"
一次网页,执行其中的PHP程式,并将结果写入网页的HTML,最後将整个HTML原始码给
送到用户端。於是,用户端可以看到的是PHP经过伺服器处理後的纯HTML,并不会看到其
中的程式。
此外,PHP的优势也有很多:高效能、支援资料库、免费、易学,可携性也高。尤其是
易学这点,只要有C或是Perl的基础,就几乎不太需要学新的东西了。
可惜的是,PHP并不是想用就可以使用的。PHP的网页必须让"看的懂PHP"的伺服器阅读,
也就是伺服器端必需拥有"PHP引擎"。像我之前说过的Apache Server就是拥有PHP引擎的
伺服器软体,现在也有越来越多的网路空间支援PHP。
<表单>
学过HTML的人多少应该也会知道表单,也就是将使用者输入的资讯提交给伺服器的区块。
当时我并没有明确解释表单的传送,现在再将其做个解释:
一个可处理资料的表单通常是这样写的:
<form method="post" action="processor.php">
......
</form>
其中注意到form的两个重要属性,method跟action。method属性是描述表单的传送方式,
而action则是表单传送的目标网页,也就是原始码中的processor.php。
於是,当使用者填写表单并送出,所有表单内的资料会被传送到processor.php当作变数
,然後伺服器执行processor.php中的程式,并将结果写在processor.php的html部分,然
後再送回用户端。
<开始使用PHP>
如同很多的HTML标签,如果要在HTML原始码中嵌入PHP的程式,必须要有特殊的对应标
签:
<html>
<head></head>
<body>
<?
里面是php程式码
?>
</body>
</html>
如果还记得<script>这个标签,也可以使用这个标签:
<script language="php">
程式码
</script>
既然有了预备知识了,现在来开始写第一个php程式。
<?
echo "hello!";
?>
这样子就是一个简短的程式,其中echo的作用类似於C的printf,用法等一下在解释。
如果html内的body标签只有这段程式,那麽在执行了这段程式之後,用户端看到的原始
码将会是:
<html>
<head></head>
<body>
hello! <!--这行是被php程式写入的-->
</body>
</html>
所以在用户端就会看到hello!的文字。
所以说,php可以用来"写html",例如我们要再网页中放入一张图,利用php,可以:
<?
echo "<img src='abc.jpg'>";
?>
这样的话,在执行过这段程式之後,那个位置就会出现<img>的标签。
不过这样的程式,不用写光用html就够了,现在再加入一些动态的内容:
<?
echo "<p>The time now is:<br>";
echo date('H:i, jS F');
echo "</p>"
?>
这样就会印出当时的时间了,当然,是写入html的。
<从表单得到变数>
当然,大部分的PHP应用会是从某个地方得到一些资料的,而资料的来源经常是表单,
那麽现在稍微解释一下变数的概念。
有写过C应该就不会对变数的概念陌生,PHP中当然也免不了会使用很多变数。在PHP中变
数的使用比起C来说更为自由,PHP的变数不需要宣告型别,甚至不需要宣告。一切就是
"爱用就用",唯一和C不同的地方,就是PHP的变数必须在前方加上$的符号。
因此:
<?
$num = 5;
echo $num;
?>
会输出5。
现在进入正题:要怎麽从表单取得资料。
现在先看看表单的html页:
...
<form method="post" action="process.php">
<input name="word" type="text">
</form>
...
这个表单包含了一个文字栏位,name属性则是word。记得当时曾经提过,这个属性在php中十
分重要。接下来我们看看process.php的原始码:
<?
$word = $_POST['word'];
?>
<html>
<head></head>
<body>
<?
echo "You have typed word" . $word . "in the form.";
?>
</body>
</html>
注意前三行,我们用变数word(也可以改名)接收了由原表单传来的"word栏位"资料,方式
则是post。在我们接收了这笔资料并存入变数之後,这个变数就可以在程式中自由使用
了。在上面的范例,我们用echo混合变数做出输出。
根据表单传送方法的不同(get或post),我们在程式中接收变数的方式也不同,大概大
家也猜的出来,如果当时表单的method属性是get,一开始的那段程式就会是:
<?
$word = $_GET['word'];
?>
get方法跟post方法有什麽不一样?有的时候我们可能常常看到有的网页在网址列会长的
这个样子:
http://bbs.wefong.com/forumdisplay.php?fid=135
(这是微风的某论坛分页)
网页名称是php,这表示里面有php的程式语言。要注意的是後面的?fid=135,这代表的是
get的传送方法,变数以get方式出现在网址列并被程式接收,所以:
<?
$num = $_GET['fid'];
?>
这个时候,$num的值就会是135了。
如果使用post方法,在网页上就不会看到这些资讯,而是以幕後的方式来取得这些变数。
不过,如果网页使用的是页框,由於使用者不会看到页框内连结的网页网址,这两种方法
是没有差异的。
<PHP的其他架构>
如果我们把PHP跟C做比较,两者实在是非常相似的,包括所有的操作和程式结构,规则等
,都几乎跟C一样。举例:
<?
if($reply=='yes')
echo "your reply is yes";
elseif($reply=='no')
echo "your reply is no";
for( $i=0 ; $i<10 ; $i++ )
echo $i . "<br>";
?>
想必大家也都知道这两段程式在做什麽了,一段是熟悉的if/else结构,另一个则是for
回圈,用法完全相同。在之後,还会有更多像这样完全雷同的使用状况。
看了几段程式,大家想必也发现PHP也有使用分号的规定,不使用也一样会造成编译错误
(在网页被执行时会显示,而且也会有贴心的错误提示)。
这里把echo的使用概念作一解释:
echo主要是用来输出东西到html上,使用的时候只需要在echo後方隔着一个空白然後接上
欲输出的东西。在php中,双引号跟单引号都代表字串,而echo後面可以直接接上字串。
要注意的是输出变数,在输出变数的时候不需要加上任何引号,程式会自动判断你的变
数来输出。不过,在字串跟变数之间,必须加入连结运算子"."。
那麽,如果我们要输出型如 hello "everybody"!这类的文字该怎麽输出?
echo "hello "everybody"!";
这样的表示肯定行不通,程式只会把它看成两个分开的字串。在这种状况下,我们可以
把单引号跟双引号交替的作使用。
echo 'hello "everybody"!';
这样就可以输出了。
<档案处理>
PHP不一定只能把储存的资料作输出,也可以透过档案将其储存。
要写入一个档案,步骤跟C也完全一样:打开档案、写入、关闭档案。
要打开档案,方式更是完全相同:
<?
$fin =
fopen("...","w");
?>
这个就是熟悉的fopen,关闭档案的时候,一样使用C中的fclose把档案指标关掉就好。
这里不做参数的说明。
值得注意的是其中的档案路径,PHP预设以$DOCUMENT_ROOT作为网页所在资料夹路径的
常数,所以,假设要读入同资料夹下的file.txt我们会这样写:
fopen("$DOCUMENT_ROOT/../file.txt","r");
※12/30新增:根据测试,其实直接输入档名也是可以的。
至於写入档案,在PHP中我们使用的是fwrite函式,做法如下:
fwrite($fin,$string);
这样,就会把存在$string中的变数内容存到档案了。
此外,存入的档案内容一样可以使用C中的一些存入法,例如:
$string = $date . "\t" . $name . "\n";
如果把上面的$string存进档案,就可以相同的制造出tab或是换行动作。
至於读取档案,我们则使用fgets函式,方法则是:
fgets($fin,1001);
fgets函式会一次从档案读取到换行字元、EOF,或是读取到後面参数所指定的位元组为
止。要注意的是,所谓读到指定位元为止,就是指每次只会读取参数减1的位元组。
另外介绍另一个类似的函式fgetss,它跟fgets相同,但是会忽略读取档案中的html标签
,这对防止有人在留言中放入恶意的html程式码有很大的助益。如果要在fgetss中建立
例外,可以照这样写:
fgetss($fin,1001,"<br>");
这样会代表要留下html中的<br>标签,其他的标签则予以删除。
另一个很有用的读取函式是fgetcsv,这个标签可以把读取的字串做分割处理,譬如:
fgetcsv($fin,1001,"\t");
这样会代表把读进来的字串以tab键为分割,分开成数个字串,再以阵列的方式回传,至於
PHP的阵列,以後就会提到。
如果只要读取单一字元的话,可以使用fgetc函式,用法很简单:
fgetc($fin);
这个用法的一个小缺陷是它可能会回传不是文字的字元,譬如换行或EOF,处理时要小
心。
此外还可以一次读取整个档案,如果要读取完之後直接输出到html,我们可以使用
readfile函式,如果只是要存成变数,则使用file函式,file函式会把读进来的档案以行
为范围来分割字串,并以阵列回传。这两个函式的用法分别如下:
readfile("...filepath");
file("...filepath");
如果只是想要单纯的读取数个位元组,则可以使用fread函式:
fread($fin,1001);
当然,如果读取的档案小於指定的位元也会造成读取结束。
接下来再介绍一些可能会用到的函式:
feof($fin) 档案结尾
测定目前档案的读取指标是否是EOF,传回值是布林值。
file_exist(...filepath) 档案是否存在
测定档案是否存在,传回值是布林值。
filesize(...filepath) 档案大小
测定目标档案大小,传回值是位元组(整数)。
如果把这个函式跟fread混合使用,可以一次读入整个档案,配合echo之後更可以一次
输出内容。
ex: echo nl2br(fread($fin,filesize("$DOCUMENT_ROOT/../myfile.txt")));
其中
nl2br函式会将字串中所有换行符号改以<br>输出。
unlink(...filepath) 删除档案
删除目标档案,失败时传回false的布林值。
rewind($fin) 档案指标归0
将目前的档案读取指标回到起点。
flock($fin, int operation ) 锁定档案
因为PHP会读取的档案往往会频繁读写,为了避免在A读取档案的时候B却开始写入档案,
有的时候必须加上锁定的动作。格式如上所述,後面的参数可以有这些值:
LOCK_SH / 1 锁定读取
LOCK_EX / 2 锁定写入
LOCK_UN / 3 解除锁定
LOCK_NB / 4 排除无法锁定的状况
要注意的是,通常如果对一个档案进行锁定,请记得在每个用到这个档案的网页都加上
锁定函式。
PHP暂时先讲到这里,其他几个重要的东西慢慢讲XD
接下来稍微补遗几个HTML的小知识:
<色码>
在HTML中常常频繁的使用颜色,而RGB16进位色码又是最常用的方式。
RGB的色码表示很简单,主要是由一个#号跟6个数字构成,6个数字分成三组,每组两个,
分别代表了RGB中的三个颜色值。因为是16进位,两个数字可以表示的状况从0~255都行
。
RGB,分别表示的是Red Green Blue,也就是光的三原色,颜色的构成遵从物理的叠加。
因此,白色会是(255,255,255),也就是三个颜色都是最大值。这个数值把它换成色码之
後,由於255会是FF,白色的色码表示就是#FFFFFF。
以此类推,几个熟悉的色码分别如下:
红色
(255,0,0)→#FF0000
绿色
(0,255,0)→#00FF00
蓝色
(0,0,255)→#0000FF
黄色(绿+红)
(255,255,0)→#FFFF00
紫红色(蓝+红)
(255,0,255)→#FF00FF
青色(蓝+绿)
(0,255,255)→#00FFFF
灰色(红蓝绿等值)
(170,170,170)→#AAAAAA
黑色(红蓝绿皆为0)
(0,0,0)→#000000
所以,基本上只要有配色观念,什麽颜色都可以尝试配出来。
这个网页有不少页面配色建议,给大家做做参考:
http://www.colorschemer.com/online.html
<HTML的标签无法使用!>
有的时候,可能会发现有些标签读不出来,或者是排版不如预期,这可能是正常的。
原因是因为浏览器不同,所以可能会有些标签的判读或支援不一样。对这样的状况,有
几种处理方式,一种是给他死不管了,只要顾及大部分的浏览器支援。另一种则是设定
两种以上的网页,在对方浏览器不支援的状况下可以使用支援该浏览器的网页。後者的
方法往往可以配合侦测浏览器的Javasrcipt使用。
<路径>
在很多标签中,往往必须连结外部档案或是网页,而需要用到路径。在了解路径前,先分
清楚何谓
相对路径,何谓
绝对路径。
先说明绝对路径,绝对路径是清楚的描述该档案或网页的完整路径,譬如:
<a href=
"http://www.google.com">
<img src=
"c:\new\pic.jpg">
之类的就是绝对路径。
至於相对路径,则是指目标"相对於"此网页的路径,譬如:
<a href=
"main.htm">
<img src=
"..\pic.jpg">
此即所谓相对路径。对相对路径来说,有几个情况:
1.目标与网页再同一资料夹:直接打档名
2.目标在子资料夹: 透过资料夹往下搜寻并指定路径
3.目标在父资料夹: ..\之後输入路径
什麽情况会用到这两种不同的路径?
试想,如果一开始在电脑写的档案都是以绝对路径来命名,那麽在上线到伺服器之後,
往往会因为路径的改变而找不到档案,而相对路径则不会有这种困扰。
通常,绝对路径只建议用在连结往不同伺服器的档案或连结用,至於自己的网站内,则
一律使用相对路径,可以减少困扰。
<书签、邮件连结>
在讲连结的时候,曾经提过有一种连结叫页内连结,透过书签的方式来在页内移动到特定
位置。这在很多网页都会看到,尤其是大篇幅的网页。这种方式是怎麽做的呢?
请注意<a>标签其实也是有name属性的,如同<a>标签可以透过target属性指定页框name
值来连结,<a>标签也可以透过其他<a>标签的name做连结:
(me.htm)
...
<body>
hello!
My name is <a href="me.htm
#birthday">joe</a>.
My registration number is b95902066.
My star sign is scorpio.
<a
name="birthday">My birthday is 10/27</a>.
</body>
连结的方式就是在网页的後方加注#符号,然後在後方指定<a>标签的name值。
此外<a>的href属性也可以指定邮件信箱,这样的话这个联结就会开启预设的邮件软体
了。就像这样:
<a href="mailto:
[email protected]">写信给我</a>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.20.41
※ 编辑: joehuang92 来自: 59.121.20.41 (12/30 01:41)
※ 编辑: joehuang92 来自: 59.121.20.41 (12/30 09:46)
1F:推 ybite:相对路径是 ../ 不是 ..\ 吧? :P 12/30 13:52
2F:→ joehuang92:对电脑内部的档案路径而言,是使用\而非/ 12/30 17:03
3F:→ joehuang92:不过对上线的伺服器而言则是/ 12/30 17:04
4F:推 waterwinds:布林值? 12/30 22:31
5F:→ joehuang92:TRUE或FALSE的值叫布林值 12/30 22:45
※ 编辑: joehuang92 来自: 59.121.20.41 (12/30 23:03)
6F:推 waterwinds:谢谢>< 12/31 00:29
7F:推 scan33scan33:乔乔大谢 >w< , 你把上次的打上来了....真辛苦... 12/31 09:26
8F:推 springgod:boolean 12/31 16:16
9F:推 eric20000:大推~~不过if里面那个不用==(2个=)吗? 01/01 21:21
10F:→ joehuang92:感谢指正>"<,已经修改了 01/01 22:56
※ 编辑: joehuang92 来自: 59.121.20.41 (01/01 22:56)