基础知识
新版论坛采用了最经典的 LAPM(linux+apache+php+mysql) 的架构。总的而言,用到了如下的各种基础知识。
你需要理解如下语言:
还需要了解如下知识:
下面将逐一对上述进行说明。
现在的服务器是建立在Linux (Cent OS)环境下的,你只能通过远程的命令行操作来对服务器上面的文件进行修改。
- 登录远程服务器
- 如果本地就是linux环境,那么请打开命令行,输入 "ssh 用户名@www.chexie.net" ,再输入登录密码即可访问服务器;用户名和密码请联系上帝获取。
- 如果本地是Windows环境,那么请下载putty,然后打开这个软件输入用户名密码,同样也能模拟ssh进行访问。
- 如果是mac系统,可以直接在Terminal里面进行ssh访问。
- 基本服务器上操作 参考资料:http://www.oschina.net/translate/useful-linux-commands-for-newbies
- ls : 查看当前目录下的文件。后面如果加参数 -l 代表查看详细信息; -a 代表查看隐藏文件。
- tab : 文件名补全。 输入一小部分文件名后按tab可以进行自动补全;如果有多个项目可以补全的,在再按一次tab后将列出所有可选项。
- cd : 更换目录。比如如果当前目录下有一个test文件夹,那么输入 cd test 可以进入这个文件夹。 注意 .. 表示上级目录,即 cd .. 表示返回上级目录。
- mkdir : 创建一个目录。 使用方法: mkdir 目录名。
- cp : 复制文件。 使用方法: cp 文件名 复制到的文件名 ;比如 cp temp.php temp2.php 代表将temp.php复制到temp2.php。如果需要复制的是一个文件夹,请加 -r 参数。
- mv : 移动文件/修改文件名。 使用方法: mv 文件名 新的文件名 ; 此操作会删除原有文件然后建立一个新的文件;你可以用此方法移动文件位置,或者修改原来文件的文件名。
- rm : 删除文件。使用方法: rm 文件名。 如果需要删除一个文件夹,请加 -r 参数; 请注意:删除文件是不可逆操作,删除后将无法恢复,请慎用此操作。
- find : 查找文件。使用方式:find -name '文件名' ; 将从当前文件夹下开始递归查找。
- grep : 全文查找。 使用方式:grep -r '文本内容' 目录名 ; 将从指明的目录开始递归往下查找所有包含输入的文本内容的文件;注意这里文本内容是正则表达式的;因此特殊字符需要在前面加上\
- vim : 打开/编辑文件。 使用方法: vim 文件名。 vim你可以就理解为一个像记事本一样的东西,下面将对vim的部分操作进行简介。
- Vim的部分操作 参考资料: http://blog.csdn.net/niushuai666/article/details/7275406
- i -> 进入编辑模式
- ESC -> 退出编辑模式,进入正常模式
- x -> 删除一个字符
- :wq -> 保存并退出(:w 保存,:q退出)
- :q! -> 不保存而退出
- dd -> 删除当前行,并将其保存到剪切板
- yy -> 复制当前行
- p -> 粘贴
- u -> 撤销;可以多次u直到你打开文件那时候。
- Ctrl+u -> 重做
- 0 -> 到行头
- $ -> 到行尾
- /pattern -> 搜索 pattern 字符串;如果搜索到多个,可以按n进入到下一个。
简单概括一下,对于我们普通的网站访问,涉及到的技术就是:
- 用户操作浏览器访问,浏览器向服务器发出一个 HTTP 请求;
- 服务器接收到 HTTP 请求,Web Server (Apache) 进行相应的初步处理,找到对应的php文件;
- php脚本调用本地和客户端传来的数据,处理,然后生成页面;
- Web Server (Apache) 将生成的页面作为http响应的body,根据不同的结果生成http header,然后发送回浏览器;
- 浏览器接收到http响应,得到html代码,进行解析;
- 解析过程中遇到引用的服务器上的资源(额外的 CSS、JS代码,图片、音视频,附件等),再向 Web Server 发送请求,Web Server 找到对应的文件,发送回来;
- 浏览器解析 HTML 包含的内容,用得到的 CSS 代码进行外观上的进一步渲染,JS 代码也可能会对外观进行一定的处理;
- 用户与页面交互(点击,悬停等等)时,JS 代码对此作出一定的反应,添加特效与动画;
- 交互的过程中可能需要向服务器索取或提交额外的数据(局部的刷新,比如注册时检查用户名是否被注册),通过 JS 代码向 Web Server 发送请求(即ajax),Web Server 再用服务器脚本进行处理(生成资源or写入数据之类的),把资源返回给客户端,客户端用得到的资源来实现动态效果或其他改变。
强烈推荐各位使用chrome浏览器,这里将对其开发者工具(F12)进行简单介绍。
- * Elements - 审查元素;可以看到页面上每个元素所对应的源代码,并可以在右端修改其css并立即反映到页面上。
- * Network - 网络;可以看到浏览器发出的所有请求,以及每个请求的具体信息包括时间,http头,post传递的数据内容,返回信息,返回具体内容等等。特别是在ajax的调试上会有很大的作用。
- Sources - 脚本调试;在这里你可以对javascript的脚本进行调试,比如断点调试,单步运行等等,来找到javascript中的bug。
- Timeline - 加载渲染各元素时间;以及响应/监听用户操作的时间;暂时对我们无用。
- Profiles - 对我们无用,可忽略
- Resources - 所有的资源都在这里,包括各种图片资源等;cookie内容也可以在此查看。
- Audits - 对我们无用,可忽略
- Console - 控制台;可以查看各种元素,调试js等等;参考资料:http://blog.csdn.net/codetomylaw/article/details/14485461
掌握对开发者工具的使用,尤其是Elements和Network的使用,会对调试网页带来巨大的便利。
- html/html5; css/css3 回到顶端
- 什么是html?
- HTML 指的是超文本标记语言 (Hyper Text Markup Language),用来描述网页。
- HTML 标记标签通常被称为 HTML 标签 (HTML tag)。
- HTML 标签是由尖括号包围的关键词,比如 <html> 或者 </span> ,且通常成对出现;第一个标签为开始标签;第二个为结束标签。
- HTML 文档就是网页。
- 如果你没接触过html,请在http://www.w3school.com.cn/html/html_basic.asp进行学习;该网站讲的十分详细,你只需要花很短的时间就能掌握html的基本使用。
- 什么是html5?
- html5是html的一些扩展,本质上就是html新加了几个标签,并把一些东西给标准化。
- 无需进行额外学习其内容
- 什么是css?
- css是指层叠样式表,由其来控制元素的各种属性。
- 当我们需要控制一个元素的状态,比如说,颜色,大小,相对位置,等等的时候,就需要用到css
- 浏览器会根据css将一个元素画出来,达到令人满意的效果。
- 学习css前需要先学习html
- 如果你没有接触过css,请在http://www.w3school.com.cn/css/index.asp进行学习;不用全部掌握,事实上只需要基本了解,然后需要什么的时候再去查。
- 什么是css3?
- css3就是在css的基础上加了一部分内容;本质上就是css
- 我们仅在首页上使用了css3的内容。
- 无需进行额外学习其内容。
- javascript; jquery; ajax; bootstrap回到顶端
- 什么是javascript?
- javascript是浏览器的脚本语言,可被所有浏览器执行。
- javascript的许多语法和C非常像;因此当你学过C以后再来学习javascript就会非常容易。
- javascript是嵌入在html中的,以<script>标签所分隔;或者单独抽出来写在外部然后引用进来;浏览器会按照需求执行这些函数。
- js的主要目的就是交互;浏览器和用户的交互,即响应用户操作。
- 学习javascript前需要先学习html
- 如果你没有接触过javascript,请在http://www.w3school.com.cn/js/index.asp上进行学习;该网站对于js讲的非常好,简洁很容易让人理解;而且在有C语言的基础上,学习起来会非常快也很容易。
- 什么是jquery?
- jquery是一个javascript库;会在页面内被引入(<script src="/assets/js/jquery.min.js"></script>)
- 其最大的作用就是html元素选取与操作;css操作;js的调用;ajax的简易化;等等
- 有了jquery,你再也不需要写document.getElementById(...)之类的内容;隐藏或显示元素也简化成hide()和show()函数;ajax简化成一个简单的可调用的函数;等等。大大简化了操作。
- 学习jquery前需要了解html/css/javascript
- jquery无需花大量时间学习;只需要了解一些最基本的使用(主要是元素选择器,和post请求);如果从未接触过jquery,可以参见http://www.w3school.com.cn/jquery/index.asp。
- 什么是ajax?
- ajax的全称是Asynchronous JavaScript and XML,即异步javascript和xml
- ajax不是一种语言,而是一种方法。其目的是,不在刷新整个页面的情况下,进行和服务器的交互功能,而修改一小部分页面上的内容。
- 比如日历,当我点击某一天后,就需要通过ajax向服务器发送请求获取该天的数据(请求你可以在F12控制台的Network看到),然后得到返回信息并修改页面上有关日历的一小部分。这期间,整个页面是没有重新加载和刷新的。
- ajax最初都是使用XMLHttpRequest来进行处理。不过强烈建议直接使用jquery的函数 $.post(url,data,function,type);事实上,我们网站基本上ajax请求都是使用的jquery的。
- 有关jquery的ajax,可以参见http://www.w3school.com.cn/jquery/jquery_ajax_intro.asp
- 什么是bootstrap?
- bootstrap仅在首页上才进行使用;论坛中没有任何地方使用了bootstrap
- bootstrap本质上就是一个javascript库和一个css库;我们直接调用对应的class就能得到对应的效果,而不需要自己手工再编写相应的html,css和js。
- bootstrap基于jquery,学习前需要了解html/css/javascript;文档地址:http://v3.bootcss.com/
- http请求;post/get;cookie回到顶端
- 什么是http请求?
- HTTP,全称HyperText Transfer Protocol,其目的是浏览器可以通过http来向web服务器请求信息和服务。
- 在chrome浏览器下,按F12进入开发者工具,然后随便输入一个页面打开或者刷新当前页面;找到最上面的一个请求,点一下,你就能看到请求的详细内容。
- 一般来说,我们只需要掌握如下几个请求头就可以了:
- Request Method - 请求方式(get/post)
- Cookie - 上传的cookie内容
- Query String Parameters - 上传的参数(get参数和post参数)
- Set-Cookie - 服务器返回的设置cookie的要求
- 最核心的还是要了解get和post请求。
- 什么是get请求?
- Get请求:获取一个文档。
- Get请求只应该用来信息获取,而不应该用来修改服务器上的任何数据。
- 对同一个URL的多次get请求应该返回同一个结果。
- Get请求会把请求的数据附在URL之后,以?来分隔url和数据,参数之间以&相连,每个参数以=分隔key和value;例如,我随意访问一个帖子 http://www.chexie.net/bbs/content/?bid=28&tid=28&p=1 那么,?之前的内容就是url地址;?之后的内容就是请求的数据,以&分隔为bid=28, tid=28, p=1,然后服务器就可以得到这个请求的参数。
- Get请求的所有传递数据都是可见的,是附在浏览器地址栏的;如果是特殊字符比如中文字符,则需要进行转义;比如你任意访问一个贴吧 http://tieba.baidu.com/f?ie=utf-8&kw=%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6 就是如此。由于浏览器地址栏是有长度限制,因此Get的参数请求也是有长度限制。
- 什么是post请求?
- Post请求:修改服务器数据。
- Post请求的目的就是修改服务器上面的数据。比如,发帖,删除,置顶,注册,登录,等等,都应该采用post请求。
- 对同一个URL的多次Post请求得到的结果不应该相同。
- Post请求的数据是不可见的,应该只能通过F12的开发者工具的Network看到请求的具体参数内容。
- Post请求只能通过Form(表单)或者ajax的$.post(...)进行,不可以从浏览器地址栏输入地址进行。
- Post请求无需对特殊字符进行转义而是直接原样上传;且上传的参数没有长度限制。
- Post请求比Get请求安全;因此请尽量采用Post请求而不是Get请求。
- 什么是cookie?
- Cookie: 存在浏览器内部的数据。
- 当服务器觉得有必要在用户的浏览器保存一些数据的时候,就会使用cookie。
- 例如,当我登录后,服务器就会在我的浏览器上设置两个cookie,一个是username值,即ID;一个是token,即令牌或者说是暗号。
- 每次http请求,不论是get还是post,浏览器都会上传cookie值;例如发帖时上传了token,服务器就会知道是谁发的帖子;个人中心上传token,服务器就会知道是谁的个人中心;从而根据不同的人返回不同的结果。
- cookie可以进行时间限制;在本论坛中,cookie有效时间是30分钟。
- php回到顶端
- php全称是PHP: Hypertext Preprocessor,是服务器端的一个脚本语言。
- php可以完美嵌套在html内部:当浏览器对一个php文件发起请求时,服务器找到这个php文件,然后调用php解释器(可类比于C的编译执行),将文件从头到尾进行扫描,编译处理所有的<?php 到 ?>的内容,而<?php与?>之外的所有内容都会原封不动。
- 浏览器端只能看到经过php解释器解释之后的结果,而不可能知道原本php代码内容;就像你运行一个C程序只能看到结果而不知道C的源代码。
- php和C的语法非常非常相似。你可以在 http://www.w3school.com.cn/php/index.asp上学习php。
- 下面将只列举出php和C语法的区别,仅供参考。没列出的基本上就和C的语法相同。
- php变量全部要以$开头。php为弱类型语言,无需申明变量即可使用;我们无需告知php变量的数据类型,系统会自动把变量转换成正确的类型。
- php可以使用echo和print来输出信息,比如 echo 'Hello PHP!'; 输出 Hello PHP! ;echo比print快,但是有字数上限,貌似是几万字。
- php的单引号字符串和双引号字符串没有区别,可以通用,即 'aa'=="aa"
- php字符串连接是使用点,比如"ab"."cc"得到"abcc";有关php字符串的函数可以参见http://www.w3school.com.cn/php/php_ref_string.asp
- foreach循环:只适用于数组,遍历数组中的每个键/值对。语法如下: foreach ($array as $value) {echo $value;}
- php的函数定义是如下的: function functionName($param[,$param2,...]) {...} ;无需指定返回类型和参数类型;函数只有调用时才会被执行。
- php不存在指针的说法;函数参数传递是按值传递,如果要按引用传递则需要在参数前加上&。
- php数组为如下形式: $array=array("11","22","33");其等价于如下的: $array=array(0=>"11",1=>"22",2=>"33"); 我们访问就可以如下访问: $array[1],得到"22"。 当然,php数组还支持关联数组,即可以如下定义: $array=array("11"=>"1111","22"=>"2222","33"=>"3333"); 那么访问就如下访问: $array['11'],得到"1111"。
- php通过如下方式得到请求的一些值: $_SERVER['REMOTE_ADDR']得到远程ip地址。 $_POST[$key]可以得到传递的post请求中$key对应的值;如我传递bid=1那么$_POST['bid']返回结果为1; $_GET[$key]相应得到get请求的参数; $_COOKIE[]获取cookie值; $_REQUEST[]可以三者全部获取。 更多的超全局变量请参见 http://www.w3school.com.cn/php/php_superglobals.asp上查看。
- php语法非常容易,比C更容易;看懂了上面几条就可以说你已经学会了php。
- sql回到顶端
- sql是一个结构化的查询语言,目的是访问数据库,进行查询/修改等操作。
- sql语句非常容易学习,你可以在http://www.w3school.com.cn/sql/index.asp上学习。
- 如果想访问数据库,地址、用户名和密码请咨询论坛上帝;下面默认你可以看到数据库表的内容。
- 我们可以看到,数据库就是一个个的表;每个表都有若干列,每一列都有其意义;如userinfo表中的username列就代表用户名;每个表还有若干行,每一行都代表一个记录,多少行对应多少个记录;如userinfo每一行就代表一个用户。
- 有关具体数据库中每一个表的每一列的意义,将在数据库这一章进行介绍;这里只介绍sql语句的语法,和php是如何使用sql的。
- sql的语法如下,你可以在phpmyadmin的test表进行实际操作测试。
- 查询记录: select 列名称 from 表名称 where 条件 [order by 想排序的列] [limit x,y] ;该语句意思是,从表中根据对应的条件获取对应的列(列名称也可以换成*代表返回所有列),并将其按照某列进行排序,返回x到y行之间的数据。其中如果省略条件where则返回所有行;而后面的排序order by和limit可以省略;
- where 操作运算符支持 =/</>/<=/>=/like 等内容。如我的条件是 where id=1 那么只返回所有id为1的内容。
- where 可以有多个子句,之间可以用and/&&,或者or/||连接。
- 文本值的传递请加单引号。比如where语句请使用 where username='admin'
- 如果排列需要倒序,则要加上desc;多项排序也用逗号分隔,比如 order by top desc, pid 的意思是,先按照top倒序排,然后如果top值相同则按照pid顺序排。
- 举几个例子说明,"select * from capubbs.userinfo where username='admin'" 将返回userinfo表中username列值为admin的所有行; "select title,text from capubbs.posts where bid=4 && tid=18105 order by pid desc limit 0,30" 这个句子将取出posts表中,bid列值为4,tid列值为18105的所有行,然后将其按照pid倒序排列,取前30行,然后返回得到的这些行的title列和text列。
- 插入记录: insert into 表名称 values (值1, 值2, ...) ; 你也可以仅指定对应插入: insert into 表名称 (列1, 列2, ...) values (列1对应值, 列2对应值, ...)
- 插入时,字符串需要加上单引号;数字不用。
- 如果第二种插入方式(指定列插入),那么未指定的列将被赋值为NULL
- 举例说明: "insert into capubbs.test values (1,'test','This is a message','field value~','text content')" 语义为在test表中插入如上值的一行。
- 删除记录:delete from 表名称 where 条件
- 记录删除后将不可恢复。
- 例如, "delete from capubbs.test where username='test'" 将删除所有username是test的行。
- 更新记录: update 表名称 set 列名称=新值 [, 列2=新值2 , ...] where 条件
- 列名称=新值时是可以采用原来的值; 比如reply=reply+1代表表中reply的那一列对应的值加一。
- 举例说明。 "update capubbs.userinfo set reply=reply+1, rights=4, sig1='这是签名档1' where username='admin' || code='12345678'" 将会把userinfo表中,username为'admin'或者code为'12345678'的所有行的reply值加一,rights值变成4,sig1的值变成'这是签名档1'。
- 学会了上述的四个语法,你就可以进行数据库操作了。本论坛95%以上的数据库操作都只用了这四个操作方式。
- php中使用sql语句
- 在本论坛中,主要使用四个函数来进行和数据库的交互。
- $con=mysql_connect("localhost",用户名,密码),连接数据库。
- $results=mysql_query($statement,$con),进行数据库操作;其中$statement为sql语句(参见上一点)。不论是上述四种操作的任何一种,都是使用这个函数进行操作;如果是查询的话将会有返回值,记录在$results中。
- $number=mysql_num_rows($results), 如果是查询语句,将得到查询的数据行数。
- $res=mysql_fetch_row($results) / $res=mysql_fetch_array($results) ;获取下一行的内容并存进$res这个数组中。
- mysql_fetch_row和mysql_fetch_array很类似但是也大有不同;区别请自行百度。
- mysql_fetch_row会获取一行内容;同时将指针向下移动一行;即再次调用此函数将返回下一行内容;直到到了底部则返回null; 因此可用 while (($res=mysql_fetch_row($results))!=null) {...} 来对每一行内容进行循环处理。
- xml回到顶端
- xml全称是可扩展标记语言(EXtensible Markup Language),是一种标记语言;没有预先定义的标签,一切标签需要自己定义。
- xml是一种数据结构,其目的只有一个:储存和传输数据。
- xml是树结构,其有一个根;然后每个节点下面都可能会有若干节点;一些叶子节点则存储了具体的数据。
- 下面将以 http://www.chexie.net/api/client.php?ask=show&bid=2 为例介绍xml的结构。
- 当一个客户端去请求查看行者足音版面时,将会给客户端的接口client.php发送这个请求(ask=show&bid=2);服务器的php文件会去查询数据库,然后生成这样一个文件返回给客户端。
- 我们可以看到,capu就是一个根节点;然后每个info都是其一个子节点,代表一个主题帖的信息;在每个info下面又是一些子节点,比如code为-1代表请求成功;pages为237代表总页数为237;text则代表每一个主题帖的标题,time表示最后回复时间,top表示是否置顶,等等。
- 当客户端去向服务器发送这么一个请求,服务器就会返回这样一个xml,然后客户端逐个解析每个info的内容,获得标题啊作者啊时间啊等信息,然后在客户端上填充对应位置的内容,输出给用户看,用户就可以知道具体数据内容了。
- <![CDATA[ ]]> 的含义是,被这个套在里面的各种<>将不被作为节点而是作为内容进行解析。
- xml无需进行学习;不过如果你想更多了解xml内容,可以参见: http://www.w3school.com.cn/xml/index.asp
- Android/IOS回到顶端
- 安卓需要了解java语言和xml;
- IOS需要了解Objective-C语言;
- 有关这两个在网上或者书店/图书馆可以找到大量资料,在此不赘述了。
>>点此进入下一章:基本架构<<回到文档首页