b95902HW 板


LINE

接下来的一系列会稍微把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)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP