写在前面:本文是为了用TinkPHP搭建服务端而学习的php基础,后面会更新ThinkPHP学习笔记,敬请期待~~
针对读者:本文写得较略,适合有一门编程语言基础的童鞋阅读
静态网站:不支持数据交互的网站吗,(html html)
动态网站:支持数据交互的网站。动态网站中是可以操作静态网页的
实现动态网站技术 | 网站后缀 |
---|---|
ASP | .PHP |
PHP | .php |
.NET | .asqx |
JAVA | .jsp |
除了ASP不要学外,其它三种随便学。因为asp是永远链接,链接了就不断了,所以只能做小网站。
php容易且开源,最快的时候可以30分钟一个网站,直接套模板非常非常快。
客户端给服务器发送一个请求——(http请求),服务器会把静态资源(HTML代码、图片、js、CSS),客户端通过浏览器解析
端口号范围是0-65535,1024以下的端口号留给系统.。80端口一般留给WEB服务用,21端口留给FTP用。25端口留给邮件服务器用。端口类似一道门,端口号就是门牌号。服务器就是一幢大厦。
所以如果将来要用端口的话,把端口调大一点
(在本地把网站做好了,要传到服务器上就用flashfxp工具,是一款ftp工具。)
如何查询端口号占用情况:
开始-运行-cmd 【command命令】
在命令行输入 netstat -ano
CS架构,比如qq,Mysql数据库。
前台是给浏览者,后台由管理员操纵,后台用来操作前台数据,比如我们在qq空间发说说,编辑的时候就在后台操作,
将与网站有关的素材都存放到一个文件夹,此文件夹就是站点。
思考:语言的运行要不要环境
答:语言的运行都需要环境,Apache为PHP运行提供了环境。IIS也可以为PHP运行提供环境,IIS是微软公司开发的,为asp和aspx提供环境。但一般php还是选apache。
注:在apache的安装路径中不能出现中文
为了便于管理,在F盘新建wamp文件夹(Windows,Apache,MySQL,PHP)在此文件夹下再并列建立apache,mysql,php文件夹
the feature and all subfeatures will be installed on local head drive:将功能和所有子功能都安装到本地硬盘上。
安装完毕后,状态栏的右下角会出现一个羽毛状的图标,这就事Apache的图标
在浏览器的地址栏中输入http://localhost,如果看到it works表示服务器正常
localhost:本地主机 ip地址是127.0.0.1
所以测试时写http://127.0.0.1也可以。
这里就得注意服务器的概念,搞网络的人说去买台服务器吧,那是指一台机子,但是说到客户端请求服务器,就可以具体化,就是请求这个apache也叫服务器软件。
一台电脑其实可以做多个服务器,可以做邮电服务器,做数据库服务器,还可以做php服务器。人家让你把服务器重启一下,你总不能把这台机子重新启动吧。说的重启服务器只需要移到俺怕车图标上点击restart。
我们说的服务器是apache。
副武器的操作有:
操作方法一:点击apache图标(状态栏)
apache2.2-启动(start)/停止(stop)/重启(restart)
操作方法二:双击apache图标,会打开apache的控制面板,在面板上可以启动/停止/和重启
操作方法三:控制面板-管理工具-服务
win10是:控制面板——系统和安全——管理工具——服务
本机apache装在D盘APM文件夹下,与之并列的还有mysql和php-5.6.36
bin——apache的命令文件夹(二进制命令)
conf——apache的配置文件夹,里面的httpd.conf就是apache的配置文件。
htdocs——虚拟目录(就是站点,比站点强大点)站点可以随便放,比如放到c盘d盘之类的,但虚拟目录不能,这个文件定死了就在这里,如果要改还得该配置文件
装apache是装PHP的运行环境,php是一门语言,还得装它的运行规则,有点类似jdk
php-5.2.8-win32-installer.msi这个版本虽然地点,但是装完不用配置,因为装的过程中会让你指向apache配置文件夹。其他版本要配置
安装完毕后,要重启服务器,点一下restart
在虚拟目录中新建一个php页面test.php,代码入下:
在浏览器的地址栏中输入http://localhost/test.php见到php信息就可以
php文件结构
它的配置文件是php.ini
数据库在网站中的地位,用来保存数据。MySQL默认端口3306,
在任务管理器中可以查看,带d的是服务器端
如mysql.exe是客户端,mysqld.exe是服务器端。关闭了mysql client这个命令行只是关闭了客户端还有服务端在,所以从这里也能看出MySQL是CS架构,可以在我这台机上只启动服务器,你那台机子上启动客户端,就能远程访问了。
L:Linux 操作系统(开源),多用户操作系统《》 W:Windows操作系统。
A:Apache 开源
P:PHP 开源
M:MySQL 开源的数据库
LAMP组合
可以安装WAMP.exe一套。
因为PHP的运行需要apache的支持,所以,php的目录要告知apache。在apache的配置文件中配置php虚拟目录的位置。
打开apache的配置文件
ctrl+f查找Documentroot,修改,如C:/web。
本机是DocumentRoot “D:\WorkSpace\PHP\Default”
配置文件是不区分大小写的
测试:
在浏览器地址栏中输入http://localhost/test.php发现,无法打开指定页面(此页面在c盘web文件夹下)
原因:没有给更改的目录设置访问权限
解决:在httpd.conf中,将指定文件夹的权限设定为allow from all
这时再次测试,成功。
到这时,就能发现虚拟目录和站点的区别了
站点:就是一个文件夹(里面放了网站素材)
虚拟目录:文件夹+权限
在apache的配置文件中查找DirectoryIndex这个指令是设置网站首页。
在DirectoryIndex指令后面添加test.php就可以了。
配置文件的Listen,进行修改或添加
浏览器请求的格式:
http://网址:端口号/php页面。
如果端口号是80,那么这个端口号可以省略
DNS:Domain Name System
在互联网上唯一标识的一台计算机的是IP地址。但是IP地址不方便记忆,我们通过一个域名对应一个IP地址
客户端输入www.sina.com,会变为202.108.33. 60,也即是说会先请求最近的DNS服务器,将域名解析成IP地址,对这几年的DNS。最近的DNS解析服务就是本机·。
本机的DNS解析数据库“C:\Windows\System32\drivers\etc\hosts
一台主机(服务器)差不多1万,托管一年也差不多一万
一个apache支持多个网站,从浏览者的角度看起来,每个网站都是一个独立的主机,(实际上只有一个主机,一个apache),所以称为虚拟主机。
开启虚拟主机的配置:进入apache的conf目录下,进入httpd.conf文件
#Virtual hosts
Include conf/extra/httpd-vhosts.conf:把这行的注释符去掉就开启了虚拟主机
再找到conf目录下的extra目录进入,找到httpd-vhosts.conf文件,这就是虚拟主机的配置文件
站点-虚拟目录-虚拟主机的本质都是那个文件夹。
站点:
配置文件中只有目录声明, DucumentRoot “C:/web2“
虚拟目录:
除了有目录还有权限,
DocumentRoot :"C:/web2"
allow from all
虚拟主机
除了以上还有网址。
DocumentRoot :"C:/web2"
ServerName www.sohu.com
<Directory "C:/web2">
allow from all
</Directory>
静态网站和动态网站
不支持数据交互的网站(.html htm)
a. 优点:速度快(因为服务器不用执行,而是浏览器解析),最安全(服务器都不执行,黑客无法攻击)
b.缺点:更改不方便
支持数据交互的网站
a. 优点:更改方便
b. 缺点:效率和安全性都没有静态网站高
客户端和服务器端
端口和端口号
前台和后台
站点、虚拟目录、虚拟主机
更改虚拟目录
更改首页
更改监听器端口
Listen
配置文件的指令不区分大小写
PHP:Hypertext Preprocessor,中文名:超文本预处理器。是一种通用的开源脚本语言,运行在服务器端。
php底层使用c语言开发的,MySQL底层使用c++开发的
//php代码
?>
默认是不支持短标记风格,要在php的配置文件中(php.ini)中开启支持短标记,将short_open_tag值设置为on。重启服务器
[外链图片转存失败(img-dvaLeBsP-1562311878608)(C:\Users\Luckyrin\AppData\Roaming\Typora\typora-user-images\1561533337384.png)]
//php代码
?>
默认是不支持asp风格定界符,要在php.ini中开启,asp_tags的值设置为on
<%
//php代码
%>
<script language="php">
//php代码
</script>
?>
PHP支持省略结束标记,PHP开始定界符后面一直到最后没有全部都是PHP代码的情况下可以省略PHP结束符。
客户端想服务器发送一个请求,如果请求的是一个HTML页面,服务器直接将HTML 页面发送给客户端给浏览器解析,如果请求的是PHP页面,则服务器会运行PHP页面然后生成标准的HTML,将生成的HTML代码发送到客户端。
php语句以分号结尾
PHP的关键字不区分大小写(编程里要用的字为关键字,如if和IF都可以),但是变量名是区分大小写的。JavaScript的变量大小写也是区分的。
其实除了sql和vb其他语言基本都区分大小写。
变量是计算机内存中的一段空间
必须以 开 头 , 开头, 开头,不是变量名的组成部分,仅仅表示PHP的变量名从这里开始。除了$以外,字母、下划线开头,后面跟的是字母、数字、下划线。
用=来做赋值运算
变量可以传值也可以传地址,&,取址,
通过unset()来销毁变量。unset()销毁的是变量名。值是由PHP的垃圾回收机制销毁的。
$a='锄禾日当午;
$b='a';//$b中存放的是变量名
echo $$b;
?>
b 保 存 的 是 变 量 名 a , 所 以 b保存的是变量名a,所以 b保存的是变量名a,所以 b 就 是 b就是 b就是a,最后输出$a的值
当一个值在脚本执行周期内不发生变化,就可以将值声明成常量,用define()关键字
常量名不能以$开头。
默认情况下,常量名是区分大小写的,可以通过define的第三个参数设置是否区分大小写。
Ture:不区分,FALSE:区分
define('name','李白',ture);
echo Name;//还是能输出
常量不能重复定义。
类型 | 描述 |
---|---|
整数类型 | 范围 − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1 |
浮点数 | 存放整数和小数 |
布尔型 | Ture和FALSE |
字符串型 | 双引号字符串和单引号字符串 |
类型 | 描述 |
---|---|
数组 | array |
对象 | object(以后再讲) |
数组:计算机内存中一段连续的空间,通过下表来区分数组
数组的分类:索引数组和关联数组
//索引数组:通过元素的位置做下标,默认从0开始,每次增长1,可以更改数组的起始下标。
$stu=arrray('tom','beerry','ketty','rose')
echo $stu[0],'br'
echo $stu[1],'br'
//=>这个符号是数组的赋值号,把李白赋值给name
//关联数组,通过字符串做下标,元素的值与字符串有某种关联
$emp=array('name'=>'李白','sex'=>'男','age'=>22);
echo $emp[name],'
';
echo $emp[sex],'
';
echo $enp[age],'
;
?>
思考:请写出数组的下标
$stu=array(1=>'a','b','c','d');
print_r($stu);//输出结果是Array([1]=>a[2]=>b[3]=>c[4]=>d),这种应该叫关联数组吧
再思考
$stu=array('a',2=>'b','c',5=>'d');
print_r($stu);//输出Array([0]=>a[2]=>b[3]=>c[5]=>d)
再来
$stu=array(1=>'a',1=>'b',1=>'c','d');
print_r($stu);//输出Aray([1]=>c[2]=>d)
键值对
数组的下标我们可以称为键,下标和对应的值称为“键值对”
resource(资源)
PHP的外部数据称为资源类型
如php要访问的mysql数据,或者text文本这种东西。
NULL(无类型)
单引号字符串是真正的字符串,双引号字符串要将变量给替换。因为单引号字符串不需要运算,所以单引号字符串执行效率高些。
变量如果在字符串的前面或中间,要用{}括起来,{和$符可以调换位置
echo
只能输出数字、字符串,对弈布尔型,TURE输出为1,FALSE输出为空
可以一次输出多个参数,没有返回值。
和echo语句很类似
一次只能输出一个参数
输出成功会返回1,失败会返回0
print_r()
用来输出数组,输出的内容包括数组的键和值,不包括数据类型。
var_dump()
若传入参数变量,则输出变量的值和变量的类型。
若传入参数为数组,则输出包括键、值和值的数据类型。
单行注释:
//,#
多行注释:
/*
*/
算术运算符
一元运算符 | 二元运算符 |
---|---|
-(负号) | + |
++自增 | - |
–自减 | * |
/ | |
% |
注意:
echo '10'+'20'//结果是30,在php中,+只能做数字运算
echo '10aa'+'20bb'//结果还是30,
echo 'aa'+'bb'//结果是0
?>
比较运算符
运算符 | 描述 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
=== | 全等 |
!== | 不全等 |
和=的区别,==只比较值,===比较值和数据类型
$a=10;
$b='10';
if($a==$b) {
echo '相等';
}else {
echo '不相等';
}
echo '
';
if($a===$b) {
echo '全等';
}else {
echo '不全等';
}
?>
//输出 相等 不全等
$a='abc';
$b=0;
if($a==$b) {
echo '相等';
}else {
echo '不相等';
}
?>
//输出 相等(把字符串转为0再比较,这个在js中是不等的)
//所以在php中要做相等的话,建议用===(全等符)
逻辑运算符
运算符 | 描述 |
---|---|
&& | 与:并且 |
|| | 或:或者 |
! | 非:取反 |
逻辑运算符是用来连接比较运算符的。
字符串连接符
在PHP中,字符串连接符是点(.);
$a=10;
$b=20;
echo $a.$b;//输出1020,字符串连接
?>
赋值运算符
运算符 | 描述 |
---|---|
= | 赋值 |
+= | a+=b a=a+b |
-= | a-=b a=a-b |
*= | a*=b a=a * b |
/= | a/=b a=a/b |
%= | a%=b a=a%b |
.= | a.=b a=a.b(a连上b) |
6.三元运算符
表达式?值1:值2
如果表达式为真,返回值1,否则返回值2。
isset()用来判定变量是否赋值,并且不为NULL
is_numeric()用来判定是否是数字或数字字符串,如果是数字或数字字符串返回TRUE,否则返回false
将数字字符串转成数字类型:$num+=0(因为表单提交过来都是字符串类型)
is_int()用来判定是否是整型(不是判断整数,若是数字字符串,会返回false)
2.12多分支
if(条件)
{
}elseif {
}else {
}
js中else和if中间有空格,php中官方推荐无空格,但有空格输出也一样,只是原理有点不一样
switch(表达式){
case 常量:
代码;
[break;]
case 常量:
代码;
[break;]
default:
代码;
}
循环的三要素是
初始值,条件,增量
语法:
for(初始值;条件;增量) {
//循环体
}
for($i=1;$i<=10;$i++) {
echo "{$i}:锄禾日当午
"
}
while条件成立就执行,条件不成立就不执行。
语法:
while(条件)
{
//循环体(包括增量)
}
语法:
do
{
//循环体
}while(条件)
while和do-while的区别
1.while是先判断再执行,do-while是先执行再判断
2.while条件不成立就不执行,do-while至少执行一次。
简述for、while、do-while他们使用的环境
答:这三个循环是可以相通的;如果明确知道循环多少次,最好选for循环;
如果不知道循环多少次,只是循环到条件不成立为止,最好选while或do-while
想先判断在执行选while,想先执行再判断选do-while
这个循环专门用来遍历数组。
语法一:
foreach(数组 as 变量)
比如
$stu=array('tom','berry','ketty','rose');
foreach($stu as $v)
{
echo $v.'
';
}
?>
/*输出
tom
berry
ketty
rose*/
语法二:
foreach (数组 as $key=>$value)
{
//循环体
}
//比如
$stu=array('tom','berry','ketty','rose');
foreach($stu as $key=>$value)
{
echo "{$key}-{$value}
";
}
?>
/*输出
0-tom
1-berry
2-ketty
3-rose
*/
//再比如
$stu=array('name'=>'李白','sex'=>'男','age'=>20);
foreach($stu as $k=>$v)
{
echo "{$k}=>{$v}
";
}
?>
/*输出
name=>李白
sex=>男
age=>20
*/
例题从1加到100
//for循环
$sum=0
for($i=1;i<=100;i++){
$sum+=$i;
}
echo "for:从1加到100的和是:{$sum}
";
?>
//while循环
$sum=0;
$i=1;
while($i<=100) {
$sum+=$i;
$i++;
}
echo "while:从1加到100的和是:{$sum}
";
?>
语法:
function 函数名(参数)
{
//函数体
[return]//可以不写
}
function cal($num1,$num2)
{
$num=$num1+$num2;
echo "{$num1}和{$num2}的和是{$num}
";
}
cal(10,20);
?>
return
作用:
按照键来分:分为索引数组和关联数组。
按结构来分:一维数组和多维数组
二维数组可以看成一个数组里放了一个数组
//获取索引数组
$stu=array(
array('tom','bettty','ketty'),
array('李白','杜甫','白居易');
);
echo $stu[0][0],'
';
echo $stu[1][2];
?>
//获取关联数组
$stu=array(
array('name'=>'张三','sex'=>'男','age'=>20)
array('name'=>'sle,'sex'=>'女','age'=>18);
);
echo $stu[0]['name'],'<br>';
echo $stu[1]['age'];
?>
中文会乱码,原因是:浏览器不知道这个页面的字符编码
解决一:
在页面的最上面添加一个meta,在meta中设置字符编码
解决二:
设置PHP的头信息。
header(‘Content-Type:text/html;charset=utf-8’);
header('Content-Type:text/html;charset=utf-8');
echo '锄禾日当午';
?>
[外链图片转存失败(img-7JW3GMlF-1562311878614)(C:\Users\Luckyrin\AppData\Roaming\Typora\typora-user-images\1561691550552.png)]
在项目中,PHP充当MySQL数据库的客户端,通过PHP连接数据库并且操作数据库。
PHP本身是一个框架,它的功能是有PHP扩展而来的,要通过PHP连接数据库,必须开启连接mysql的功能,也就是PHP的MySQL扩展。
在php.ini中,将extension=php_mysql.dll前面的分号去掉,重启服务器。
[外链图片转存失败(img-7aoqBPDO-1562311878616)(C:\Users\Luckyrin\AppData\Roaming\Typora\typora-user-images\1561692245589.png)]
wamp集成环境是默认开启的。
通过phpMyAdmin新建一个data数据库,并将准备好的sql文件导入到数据库中,字符集用
utf8-general-ci
查阅帮助文档,php_manual_zh.chm,进入搜索mysql,如果开启了mysql扩展,就可以使用msysql打头的这些函数了。
通过mysql_connect(数据库地址,用户名,密码),返回一个数据库的连接对象(resource类型)
//连接数据库
$link=mysql_connect('localhost','root','');
if($link)//在php中有值为真,Null值为假
{
echo '连接成功';
}else {
echo '连接失败';
}
?>
//通过or语句可简化上面的代码
$link=mysql_connect('localhost','root','aa') or die('数据库连接失败');
?>
继续优化上面代码,如果连接失败,会显示报错信息,这时候可能会暴露敏感信息。
通过@可屏蔽错误信息
$link=@mysql_connect(‘localhost’,‘root’,‘aa’) or die(‘数据库连接失败’);
[外链图片转存失败(img-x9RVhbT3-1562311878617)(C:\Users\Luckyrin\AppData\Roaming\Typora\typora-user-images\1561702169355.png)]
exit()和die()都可以,里面都可以放一些参数,比如终止时输出一段话
方法一:
通过执行“use 数据库名”来选择数据库
mysql_query()函数用于执行sql语句
mysql_query(‘use data’)
//1.连接数据库
$link=mysql_connect('localhost','root','aa') or die('数据库连接失败');
//2.选择数据库
mysql_query('use data') or die('数据库选择失败');
//3.获取products表的数据
$rs=mysql_query('select * from products');
var_dump($rs);//输出resource(4)oftype(mysql result),这种资源类型是不能用foreach遍历的
?>
方法二:mysql_select_db(‘data’)
开始匹配,指针指向第一条记录,取出资源中的当前记录,匹配成索引数组,指针下移一条
缺点:数据库字段的个数发生了变化,会影响程序中数组的索引编号
//1.连接数据库
$link=mysql_connect('localhost','root','aa') or die('数据库连接失败');
//2.选择数据库
mysql_query('use data') or die('数据库选择失败');
//3.设置MySQL客户端的字符编码
mysql_query('set names utf8');
//4.获取products表的数据
$rs=mysql_query('select * from products');
var_dump($rs);//输出resource(4)oftype(mysql result),这种资源类型是不能用foreach遍历的
//5.循环输出
<table>
<tr>
<th>编号</th>
<th>商品名称</th>
<th>规格</th>
<th>价格</th>
</tr>
while($rows=mysql_fetch_row($rs))
{
echo '';
echo ''.$rows[0].' ';
echo ''.$rows[1].' ';
echo ''.$rows[2].' ';
echo ''.$rows[3].' ';
echo ' ';
}
</table>
?>
开始匹配,指针指向第一条记录,取出资源中的当前记录,匹配成关联数组,指针下移一条
数组的键和数据表的字段名相关联。
while($rows=mysql_fetch_assoc($rs))
{
echo '';
echo ''.$rows['proID'].' ';
echo ''.$rows['proname'].' ';
echo ''.$rows['proguige'].' ';
echo ''.$rows['proprice'].' ';
echo ' ';
}//这里字段区分大小写,因为这里已经不是数据库了而是PHP中的关联数组。
//输出resource(4)oftype(mysql result),这种资源类型是不能用foreach遍历的
//5.循环输出
编号 | 商品名称 | 规格 | 价格 |
---|
while($rows=mysql_fetch_row($rs))
{
echo '';
echo ''.$rows[0].' ';
echo ''.$rows[1].' ';
echo ''.$rows[2].' ';
echo ''.$rows[3].' ';
echo ' ';
}
?>
## 1.6取出结果集中数据(mysql_fetch_assoc)
开始匹配,指针指向第一条记录,取出资源中的当前记录,匹配成关联数组,指针下移一条
数组的键和数据表的字段名相关联。
~~~php
while($rows=mysql_fetch_assoc($rs))
{
echo '';
echo ''.$rows['proID'].' ';
echo ''.$rows['proname'].' ';
echo ''.$rows['proguige'].' ';
echo ''.$rows['proprice'].' ';
echo ' ';
}//这里字段区分大小写,因为这里已经不是数据库了而是PHP中的关联数组。