PHP学习笔记.docx
《PHP学习笔记.docx》由会员分享,可在线阅读,更多相关《PHP学习笔记.docx(47页珍藏版)》请在冰豆网上搜索。
PHP学习笔记
PHP基本语法:
1.html和php混合编程;
2.一个语句以;(封号)结束;
3.如何定义一个变量,和变量如何使用;
定义一个变量以$符号打头
$a=1;//定义了一个变量$a,变量的名称是$a而不是a初始值是1
4.变量的类型不是固定不变的,而是根据上下文的环境而决定的。
运行时决定变量的类型。
在运行的一瞬间才知道此变量的类型。
不是浏览器决定的,而是由服务器端的apache服务器决定的,在深入点是由apache载入的php处理模块决定的。
$a=1;//$a是一个整型变量
$a=1.1;//$a是一个小数类型了
可以用var_dump(变量名)去打印出变量的类型和数值
5.PHP是弱数据类型编程语言;
6.PHP区分大小写;
$i和$I是不一样的变量。
7.PHP的变量名称,应该以字母或者下划线开头,而不应该以数字开头。
也不要用特殊的字符开头,关键字也不要使用(不推荐使用)
一个程序就是一个世界
不论是那种程序语言,变量是其基本组成单位。
Parse:
解析
error:
错误
syntax:
语法错误
PHP数据类型:
三大类
1基本数据类型
整型,浮点数(包含了单精度和双精度),布尔类型。
2符合数据类型
数组(array),对象(object)
3特殊数据类型
null,资源类型(resource)
何为定义一个变量
php
$a=10;//相当于定义了一个变量$a,并赋值9
?
>
什么叫给变量赋值
php
$a=10;
$a=8;//赋值,表示用新的值替换了旧的值
?
>
基本数据类型详解:
整型:
1可以用十进制,也可以用十六进制(0x打头)或者八进制(0打头)
2php不支持无符号数,所以说php中的整型都是有符号数。
3在php中一个整型一般占用4个字节(与平台还有一定关系),一个字节占用8bit,可以用echoPHP_INT_SIZE来查看本机器上一个整型所占的字节数。
PHP_INT_MAX来查看本机器能表示的最大整型数据。
表示范围-2147483647~2147483647。
如果一个数超过了整型的表示范围的时候,php会自动升级为float类型
布尔类型:
∙布尔值FALSE
∙整型值0(零)
∙浮点型值0.0(零)
∙空白字符串和字符串"0"
∙没有成员变量的数组
∙没有单元的对象
∙特殊类型NULL(包括尚未设定的变量)
∙所有其它值都被认为是TRUE(包括任何资源)。
浮点数:
浮点数的字长和平台相关,通常最大值是1.8*e308并具有14位十进制数字的精度。
*精度从左边的第一个非0的数字算起
字符串:
●字符串是由字符组成的,一个字符占用一个字节。
●字符串的大小问题:
原理上可以使无限制大小的。
和内存有关。
●字符串单引号和双引号的问题:
☺输出的区别
单引号中的变量会被当作字符串直接输出
双引号中的变量会被变量的值替换而输出
☺解析的却别
单引号会解析单引号的为转义字符,双引号会解析双引号的为转义字符,其他的组合都会原样输出。
php表达式:
任何有值的东西anythingthathasavalue
php运算符:
Ø算数运算符:
注意:
如果除不尽的时候保留14位
涉及到字符变量的算术运算:
在处理字符变量的算术运算的时候,PHP沿用了Perl的习惯,而非C语言,在Perl中’Z’+1将得到’AA’,而在C中,'Z'+1将得到'['{ord('Z')==90,ord('[')==91)。
左运算符:
-=
+=
/=
%=
.=
Ø++和--运算符:
Ø比较运算符:
!
=只有值不相等则真,和<>是等价的,而!
==只要值不相等或者类型不相等则为真。
Ø逻辑运算符:
Ø运算符优先级:
and和&&都表示与,他们的却别是什么?
主要体现在优先级上面
三元运算符
表达式1?
表达式2:
表达式3
如果表达式1的结果为真,
php
$a=90;
$b=180;
$c=$a>$b?
10:
12;
echo$c;
?
>
字符串运算符:
当两个变量是基本数据类型,用.连接的时候,就表示把他们的内容拼接,在拼接的时候都会按照字符串来处理。
$a="hello,world";
$b="okok";
$c=$a.$b;//把$a表示的内容和$b的内容拼接在一起
//只要用.连接了,他就会把两边的东西当成字符串来处理。
echo$c;
类型运算符:
instanceof用于判断某个变量是否是哪个对象数据类型,也就是类数据类型
运算符优先级列表:
PHP进阶篇:
只有php代码在服务器端执行,其他的都会在浏览器端执行。
HTTP协议:
1.http协议是建立在tcp/ip协议基础上的。
2.所有的web传出都是建立在http协议之上的
3.全称:
超过文本传输协议。
基本结构:
请求行
消息头
消息体(实体内容)
GET/test/hello.htmlHTTP/1.1
Accept:
*/*[表示客户端可以接受任何数据类型]
Referer:
http:
//localhost:
80/news.html[表示我从哪里来的,以后用于防盗链技术的重点属性]
Accept-Language:
zh-cn[页面语言]
User-Agent:
Mozilla/4.0[告诉服务器我的浏览器的内核,操作系统]
Accept-Encoding:
gzip,deflate[表示接受什么样的数据压缩格式]
Host:
localhost:
80[主机:
80]
Connection:
Keep-Alive[我是一个长链接]
需求,我们如何在服务器获得浏览器的相关信息呢:
$_SERVER
php
echo"
";print_r($_SERVER);
echo"
";
?
>
如上的path路径是服务器端得path路径
因为客户端向服务器只发送了最上面的几条数据,其他的信息都是服务器补充进去的了。
以上用的比较多的是:
HTTP_HOST
REMOTE_ADDR访问此页面的浏览器的ip
DOCUMENT_ROOT:
apache的主目录
REQUEST_URL:
获取请求的资源名称
http请求的种类:
get/post
get和post的区别:
1.安全性,get请求的数据会显示在地址栏上,也就是在http协议的请求行中,而post请求发送的数据放在http协议中的消息体里面的。
2.提交的数据的大小。
说明:
ttp协议本身没有限制书得大小,主要是浏览器在对get/post的数据量的请求做了限制。
get请求的大小:
2k+35,post请求没有限制。
3.get请求更利于收藏夹收藏此页面。
应用:
Date:
[请求页面的当前时间]
Content-Length:
452[表示会送的数据用452个字节]
Content-Type:
text/html[文档的类型]
Cache-control:
private[要缓存]
对状态码的说明:
举例说明,http响应的实际用处:
302:
表示移动到了新的地址。
使用:
我们现在希望,当我们访问a.php页面时,让其自动重定向到b.php页面。
方案1.header(“Location:
b.php”);
此句话会向浏览器发送一个302状态码,告诉浏览器重新访问b.php页面。
header()函数:
说明:
可以改变一个http头。
302状态码也可以让其跳转到外网。
404码:
表示页面不存在了。
304码:
告诉浏览器,资源没有修改,无需重取。
缓存机制。
举例说明:
下面是一个比较全面的http响应:
Last-Modified:
浏览器请求的资源最新更新时间
通过http响应,控制浏览器间隔一定时间去跳转
php
header(“Refresh:
3;url=”);//隔三秒
?
>
这三个用来联合控制页面是否要被缓存
http响应控制浏览器缓存,现在我们禁用缓存:
不管刷新还是回车键,都要去的最新的信息。
php
//通过header来禁用缓存
header("Expires:
-1");
header("cache_Control:
no-cache");
header("Pragma:
no-cache");
echo"hellocache";
?
>
http实际应用:
文件下载:
文件基本知识:
类型文件分为两大类:
文本文件和二进制文件(图片视频音频)
操作原理:
判断文件是否存在:
存在:
打开文件,$fp=fopen(“a.txt”,”r+”);
代码:
php
//参数说明
//$file_name:
文件名
//$file_sub_dir下载文件的子路径"/xxx/xxx"
functiondown_file($file_name,$file_sub_path){
//先死后活
//演示图片
//如果文件名是中文,需要一定的转码
//$file_name="girl.jpg";
$file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_path.$file_name;
//$file_name=iconv("utf-8","gb2312",$file_name);//中文处理
if(!
file_exists($file_path)){
echo"文件不存在";
return;
}
//1.打开文件
$fp=fopen($file_path,"r");
//获取文件大小
$file_size=filesize($file_path);
//如果文件数据很大,所以是分批返回。
header("Content-type:
application/octet-stream");
header("Accept-Ranges:
bytes");//按字节返回
header("Accept-Length:
$file_size");//返回文件的大小
//这里是对
header("Content-Disposition:
attachment;filename=".$file_name);
//向客户端回送数据
$buffer=1024;
$file_count=0;
//这句话用于判断文件是否结束,
while(!
feof($fp)&&($file_size-$file_count>0)){
$file_date=fread($fp,$buffer);
$file_count+=$buffer;
//把部分数据会送给浏览器
echo$file_date;
}
//关闭文件
fclose($fp);
}
down_file("girl.jpg","/http/down/");
?
>
优秀代码:
代码的健壮性
代码的扩展性
代码的安全性
代码的效率
PHP数据库编程:
php有三种方式来操作mysql数据库
①mysql扩展库
②mysqli扩展库
③pdo技术
mysql扩展库和mysql数据库的区别:
CURD操作
我们的搭建环境:
启用mysql扩展库,在php.ini文件中。
createtableuser1(
idintprimarykeyauto_increment,
namevarchar(32)notnull,
passwordvarchar(64)notnull,
emailvarchar(128)notnull,
agetinyintnotnull
);
showvariableslike‘%char%’查看客户端的编码格式。
便于中文的插入。
可以设置setcharacter_set_results=gbk和setcharacter_set_client=gbk来修改乱码。
或者直接setnamesgbk;就ok了
取得资源的方式:
mysql_fetch_row($res);返回索引数组,推荐使用
mysql_fetch_assoc($res);返回关联数组
mysql_fetch_array($res);返回索引数组和关联数组
mysql_fetch_object($res);返回一个对象,把一行数据当作一个对象返回。
mysql_query():
此方法如果是dql语句,再返回结果集(资源集),如果是dml语句,则会返回一个bool值。
删除语句很特殊,如果没有删除即删除的记录数为0,但它的执行结果是正确的。
为了开发效率,我们现在可以封装MySQLHelper.class.php
注意:
dml语句可以完成所有的没有返回结果语句的SQL语句。
题目:
请编写一个函数,可以结构一个表明,然后把该表的表头和信息显示在网页上。
使用mysqli扩展库操作数据库:
mysqlimprove的意思:
mysql扩展库的增强版。
mysql扩展库和mysqli扩展库的比较:
2.mysqli的稳定性和安全性,效率有所提供。
3.mysqli支持面向对象,同时也提供了面向过程的变成风格。
mysqli快速入门:
从user1中读取数据显示到网页上;
在mysqli扩展库中也提供了四种方式获取mysqliresult:
mysqli_result:
:
fetch_assoc<==>mysql_fetch_assoc
mysqli_result:
:
fetch_row<==>mysql_fetch_row
mysqli_result:
:
fetch_array<==>mysql_fetch_array
mysqli_result:
:
fetch_object<==>mysql_fetch_array
mysqli释放结果集有三种方式:
voidmysqli_result:
:
free();
voidmysqli_result:
:
close();
voidmysqli_result:
:
free_result()
使用原则是尽量晚创建,尽量早释放。
✪mysql的sql语句特别说明:
如果操作的字段类型是string类型的,则要求必须用’’包起来
如果操作的字段类型是数值型,则可以用’’包起来,数据库有转化。
mysqli增强功能
批量执行dml语句:
$sqls=”sql1;sql2;sql3;……”;
mysqli:
:
multi_query($sqls);
可以混合使用delete、update、insert。
批量执行dql语句:
mysqli:
:
multi_query($sqls);
mysql事务处理:
事务:
用于保证数据的一致性。
$mysqli->autocommit(false);
//内部自己做了一个保存点
$sql1="updateaccountsetbalance=balance-2whereid=1";
$sql2="updateaccount2setbalance=balance+2whereid=2";
$a=$mysqli->query($sql1);
$b=$mysqli->query($sql2);
if(!
$a||!
$b){
echo"失败,回滚".$mysqli->error;
$mysqli->rollback();//如果失败,则用内部的保存点去回滚
}else{
//提交事务
$mysql->commit();
}
补充:
控制台中也可以来操作事务:
开启事务:
starttransaction
作保存点:
savepoint保存点名称
回滚操作:
rollbackto保存点名称
提交事务:
commit
保存点可以做多个,但是如果提交后,做的所有的保存点都会被吞掉。
事务的特点:
acid:
原子性,一致性,隔离性,持久性
mysqli扩展库的预处理技术:
mysqli_stmt
问题的需求,要添加50个用户。
方案1:
for循环向数据库中添加50个用户
方案2:
批量插入,使用$mysqli->multi_query($sqls);
预编译发生在数据库端。
方案3:
预编译:
速度快而且可以防止sql注入漏洞
//添加
//创建对象实例
$mysqli=newmysqli("localhost","root","root","test");
$mysqli->query("setnamesutf8");
//创建预编译对象
$sql="insertintouser1(name,password,email,age)values(?
?
?
?
)";
$mysqli_stmt=$mysqli->prepare($sql);
//绑定参数
$name="消遣";
$password="xiaoqian";
$email="xiaoqian@";
$age="10";
//参数绑定,此处类型和数据都要对应关系
$mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
//执行操作
$b=$mysqli_stmt->execute();
这样我们就可以多次插入,以后的插入语句只需要传递参数,就像下面这样,优点是执行速度会快很多,而且防止了sql注入的问题:
$name="消遣";
$password="xiaoqian";
$email="xiaoqian@";
$age="10";
//参数绑定,此处类型和数据都要对应关系
$mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
//执行操作
$b=$mysqli_stmt->execute();//返回值是一个bool型。
//查询
$sql="selectid,name,emailfromuser1whereid>?
";
$mysqli_stmt=$mysqli->prepare($sql);
$id=5;
//绑定参数
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
$mysqli_stmt->bind_result($id,$name,$email);
//执行
$mysqli_stmt->execute();
while($mysqli_stmt->fetch()){
echo"
--$id--$name--$email";
}
//释放结果
$mysqli_stmt->free_result();
//关闭预编译命令
$mysqli_stmt->close();
//关闭连接
$mysqli->close();
案例需求:
获得一个表的信息:
编写一个函数,接受表明,把表头和表的数据显示在页面。
超全局变量:
1.$_GET
2.$_POST
3.$_REQUEST
4.$_SERVER
5.$_ENV
6.$_FILE
7.$_COOKIE
8.$_SESSION
9.$_GLOBALS
$_GET方式:
解决乱码的问题:
方案一:
奇数汉字字符乱码:
奇数字符串后面加一个全角空格,在服务器拿到的时候用trim()去掉两头的空格。
方案二:
urlencode()方式
客户端:
$str=urldecode(“北京好”);然后name=$str;
服务器:
可以这样就受,也可以直接接受。
$str=urldecode($_GET(‘name’));
表单数据建议使用post而不要使用get方式
判断get获得的是否为空:
If(empty($_GET[‘city’])){
Echo“没有收到数据“;
}else{
Echo$_GET[‘city’];
}
$_POST提交数据:
举例,接受表单信息:
界面:
用户注册
用户名:
密 码:
性 别:
女
男
你喜欢什么:
唱歌
游泳
打游戏
学习
玩电脑
骑车
你的所在地:
北京
西安
上海
哈密
个人介绍:
你选的图片
<