关于PHP的所有基础知识
P全称:Hypertext Preprocessor
Lerdorf(勃道夫)
php语言的特点
混合在html中的服务器端脚本语言
脚本语言—解释执行的语言 php js
编译形语言—先编译在执行 java c#
1、性能好,开发效率高
2、跨平台(操作系统,Linux,Windows,Mac,Lunix)
3、语法简单,上手快,开发快
4、面向对象的编程语言
5、开源免费
http://www.phpchina.com/
http://www.php100.com/
1、php标记p
占位符:
%s用于字符串类型的占位符
%b用于十进制整数
%f浮点类型的占位符
%.(保留任意小数的位数)n(任意小数的位数)f
var_dump
数据类型:
1、基本数据类型
1、boolean(布尔型)
2、integer(整型)
最大范围-21亿 21亿
3、float(浮点型,也称作double)
精度保留小数点后16位
带小数的是浮点类型
4、string(字符串)
可以用双引号或者单引号 表示
单引号不能解析变量
双引号可以解析变量
$str="张三";
$str='张三';
转移符 $b="我叫\ "郭树燃"\";
长文本
代码:
$str=<<<text
what are you what in whiat wait
halou what are you doing
text;
echo $str;
2、复合数据类型
1、Array(数组)
2、Object(对象)
3、特殊数据类型
1、reseource(资源)
2、NULL(无类型)
布尔值的作用(boolean)
true:真
false:假
作用:存放判断的结果
自动类型转换
0 false
0.0 false
非0 true
“0” false
“” false
非0 true
非"" false
空数组 false
非空数组 true
非空的对象 true
空对象 false
NULL false
(任何形式的空或者0都表示false)
自动类型转换
true 转换成1
false 转换成0
字符串类型的数字(“23”)如果有. e E 转成浮点数,其他转换成整数
字符串以有效数字开头,数字会参与运算,否则转换为零
强制类型转换
358.4 float 浮点 强制转换成整数,直接舍去小数
$num=(int)358.4
整数强制转成浮点数,直接加.0
$num=(float)358
php变量
变量:是内存中存储数据的空间
1、变量值
2、变量名
3、变量的类型
命名规则:变量名以字母下划线开头,其余部分是字母数字下划线
不能使用$ this
变量名区分大小写
变量的赋值
b
=
b=
b=a;值传递
取
址
符
将
取址符 将
取址符将a址给了
b
将
b 将
b将a的内存地址给了
b
。
修
改
b。修改
b。修改b
a
也
会
跟
着
改
变
,
因
为
a也会跟着改变 ,因为
a也会跟着改变,因为a,$b指向了同一块储存空间
isset()检查是否设置该变量
unset()销毁变量,释放内存
变量的作用域
1、局部变量 在函数内定义的变量,作用于只能在函数内使用
2、全局变量 1、定义在函数外,作用域在当前的文件内使用
2、如果要在函数内使用,需要声明global $name声明
3、静态变量
static $num=10;
函数执行完之后,静态变量不会被释放
优点:变量的值会被保存,执行效率快
缺点:始终占用空间
4、超全局变量
在整个项目每个php文件中都能使用
常量:
1、一旦定义,值就不能改变
2、布尔,整数,浮点数,字符串可以定义为常量
语法:
define("PI",3.14);
↑ ↑
名称 值
常量不使用$,通常名称为大写
预定义常量(系统常量)
1、FILE 当前php文件完整路径
2、LINE 当前代码所在的行数
3、DIR 当前php文件所在的目录
运算符
算数运算符:+ - * / %
关系运算符:< > >= <= == === (!= <>) !==
↑ ↑
恒等 不等
=
+=
-=
*=
/=
%=
. =
&& and
|| or
! not
自增,自减
++ –
字符连接串:".";
php中 只作为加法运算
三元运算符: ? :
判断条件?表达式1表达式2‘
错误屏蔽符 @()or die(“错误信息”);
结构:
1、顺序结构
2、分支结构
3、循环结构
①、基本if结构
if(判断条件):条件成立后执行的语句
条件不成立
endif(判断条件){
条件成立后执行的语句
}
if(判断条件1):
elseif(判断条件2):
elseif(判断条件3):
endif
多分支结构,主要用于等值判断
多重if区间性判断 要遵守由大到小的判断顺序
switch(表达式){
case 值;
语句;
break;
case 值2;
语句2;
break;
...
defualt:
语句
break;
}
没有break程序会贯穿执行
switch 只判断值是否相等
循环结构
1、while(循环条件){
循环操作
}
循环结构的三个元素
1、初始化循环变量
2、循环条件
3、更新循环变量(偶数加2)
for(初始化循环变量,循环条件,更新循环变量){
}
1 1 2 3 5 8 13 21 34 55
2 4 7 11 16 22……
3 7 14 25 41 63……
4 11 25 50 ……
函数:
为什么定义函数
1、相同功能的代码,可以重复使用避免代码冗余(大量重复的代码)
2、什么是函数:封装好的代码块
函数的特点:
1、代码的重用性
2、封装性 封装 (隐藏内部实现)
function calc($num1,$num2,$fu) 形参
调用函数
calc(40,5,"+"); 实参
//参数 值传递,修改的是实参的副本
// function add($num){
// $num+=5;
// }
//
//
// $a=10;
// add($a);
// echo $a;
//引用传递,实参的也会产生改变
function add(&$num){
$num+=5;
}
$a=10;
add($a);
echo $a;
函数按照参数的分类
1、有参
2、无参
function 函数名(){
}
function 函数名(参数1,参数2,...){
}
参数: 值传递 引用传递 &参数
参数默认值的规则
有默认值的参数放在没有默认值参数的后面
asr();函数
函数返回值:
function 函数名{
return 返回值;
}
1.找到sum函数
2.将实参给形参赋值
3.将返回值 返回到调用的位置
1.return(只能返回一个值)
2.return 函数执行到return就结束,return后的语句不会被结束
递归函数:
自己调用自己
include require(必须)作用和区别
作用:包含并运行指定的文件
区别:当include导入的文件不存在,下面其他代码继续执行
当require导入的文件不存在,下面的其他代码不执行
↑
通常的用法
导入函数库
{include_once 先判断要导入的文件是否已经存在
}require_once 如果存在就不导入了,不存在则导入
数组
php定义数组
1、数字索引数组
1.arr[0]=30;
arr[1]=40;
arr[2]=29;
arr[3]=88;
arr[4]=79;
arr 数组名
[]索引下标
2、arr[]=30;
arr[]=40;
arr[]=29;
arr[]=88;
arr[]=79;
3、 $arr=array(31,44,32,55);
4、循环输出数组
count(数组名) 获取数组的长度
foreach ($arr as $value){
echo $value."<br>";
}
关联数组
1、 $student["name"]="张三";
$student["sex"]="男";
$student["age"]="18";
$student["hobby"]="丢沙包";
$student=array("name"=>)
数组的函数:
关于数组的排序
用于数字索引数组,改变key改为数字索引
sort(数组名) 升序;
rsort(数组名) 降序;
用于关联数组的排序
asort(数组名)
arsort(数组名)
对关联数组中的k进行排序
ksort(数组名)
krsort(数组名)
array_pop 删除数组中的最后一个元素
array_push 向数组尾部插入元素
array_shift 移除数组第一个元素
array_unshift 在数组的开头添加一个或多个元素
in_array() 检查数组是否有某个值 有就是 true 没有就是false
array_key_exists 检查数组中是否有某个key
array_search()查找数组元素,并返回key或者索引
array_sum() 计算数组中所有值的和
array_unique() 移除数组中重复的值
注:去除重复不会对原数组产生影响
而是产生新的数组
list() 把数组中的值赋给一些变量
count() 计算数组中的单元数目或对象中的属性个数
**********************************************
usort()使用用户自定义的比较函数对数组中的值进行排序
usort($student,function($x,$y){
return $x["scare"]>$y["scare"];
}
);
echo"<pre>";
print_r($student);
array_fliter()
newtu=array_filter($student,function ($x){
if($x["age"]>1&& $x["sex"]=="男"){
return $x;
}
});
foreach ($newtu as $value){
echo "姓名".$value["name"]."性别".$value["sex"]."年龄".$value["age"]."成绩".$value["scare"]."<br>";
}
usort 用户自己排序
字符串:
trim 去除字符串左右两端的空格(或其他符号)
ltrim 去除左侧空格
rtrim 去除右侧空格
md5 对字符串加密
strlen() 获取字符串的长度 字节数
mb_strlen() 又有中文又有英文 默认不启动
字符编码:
utf-8 国际统一编码 一个中文占三个字节
gb2312,gbk 简体中文编码,一个中文占两个字节
(中文 mb_strlen)
big5繁体中文编码
strrpos()
substr()
strstr()
strtolower()
strtoupper()
str_replace
explode
implodea
nl2br
strrpos 最后一次出现的位置
strpos — 查找字符串首次出现的位置 找不到返回false
substr 原字符串,起始位置,长度,截取字符串
strstr 截取从子字符串的位置到结束位置的字符串加 true 截取位置之前的部分
strtolower("HUI"),将字符串转换成小写
strtoupper("hui"),将字符串转换成大写
* explode 将字符串分割成数组
implode 将数组在连接成字符串
str_replace()替换字符串
mbstring php扩展文件
1、扩展文件的路径去掉注释
2、去掉注释(;)
3、重启Apache
xss 跨站
htmlspecialchars
将html标签进行转义
$str= "<script> while (true){}</script>";
echo htmlspecialchars($str);
htmlspecialchars_decode
将转义的字符串 转换成html标签
strip_tags
从字符串中去除 HTML 和 PHP 标记
*********************
↓
非常重要
get -隐式提交
post -隐式提交
get提交特点
1、get提交的数据会出现在地址栏
2、不安全
3、提交数据的长度有限(7675)
post提交特点
1、隐式提交数据,不会出现在地址栏
2、数据相对安全
3、理论上提交的数据量没有限制
用js跳转页面
if($newuser){
// 登陆成功 跳转到search
echo "<script> location.href='search.html' </script>";
}else{
// 登陆失败跳转到error
}
用php跳转页面
header()进行页面跳转
header("location:error.html");
如何判断直接跳转,还是通过搜索按钮提交的
判断是否有GET传值
没有传值 $_GET空的数组
没有传值 $_GET就是空的数组
有传值 $GET 非空
------------------------------------------mysqli-----------------------------------------------
4、
// 1、创建数据库连接 使用 php_mysqli
$conn= new mysqli("localhost","root","aq.qq.comWJ","mailaing","3306");
// 2、设置字符集
$conn->set_charset("utf8");
// 3、编写sql语句 插入数据
$str="insert into Categories(name) values('食品生鲜')";
// 4、执行sql语句 执行语句齁的返回值
$result=$conn->query($str);
// 5、插入语句 返回值 成功true 失败 false
if($result){
echo '添加成功';
}else{
echo '失败';
}
5、查询
$result=$conn->query($sql);
成功返回的是结果集 失败返回的是false
$result->feth_assoc()获取结果是集中的一行数据,关联数组的形式返回
$result->feth_row() 获取的是数字索引数组的形式返回
$result->feth_array() 获取的是数字索引数组和关联数组的形式返回
6、
执行sql语句所产生的错误信息
echo $conn->error;
执行sql语句中的错误号
echo $conn->errno;
受影响的行数
echo $conn->affected_rows;
7、
关于结果集的
$result->field_count 查询到的列数
$result->feth_fields()获取结果集中列的信息
$result->num_rows()函数 获取结果集中行数的信息
8、sql注入式攻击
'' or '1'='1'--
9、mysqli增删改预处理方式
$sql="insert into student(name,sex,age)
values(?,?,?,?)
";
$smts=$conn->prepare($sql);
$smts->bind_param("ssi",$name,$sex,$age);
$smts->execute();
可以解决sql注入的问题。
转义语句特殊符号
10、
$sql="select * from users where username=? and userpwd=?";
1、$smts=$conn->prepare($sql); 加载sql语句
2、$smts->bind_param("ss",$name,$pwd); 替换占位符
3、$result=$smts->execute(); 执行
--------------------------------------PDO----------------------------------
1、 PDO的全称 php data object 数据抽象层
2、 PDO对大多数数据提供了一个统一的数据库操作接口
3、 建立连接 $pdo=new PDO("mysql:localhost;dbname=mailaing","root","aq.qq.comWJ");
4、// PDO设置字符集$pdo->query("set names utf8");
5、fetchAll() 获取查询结果 返回二维数组
6、FETCH_ASSOC 返回关联数组
7、FETCH_NUM 数字索引数组
8、FETCH_BOTH 默认值
9、$result=$smst->fetch(); 提取一行数据,返回一维关联或数字索引数组
10、$smts->fetchColumn(索引)提取查询结果中的单个值
11、$smts->rowCount()受影响的行数
12、$stms->errorCode()错误代码 1146 mysql 42S02
13、$stms->erroInfo()错误信息 0公共错误码 1 mysql错误码 2 错误信息
15、 <?php
define("DBTYPE","mysql");
define("HOST","localhost");
define("DBNAME","bookshop");
define("USER","root");
define("PWD","aq.qq.comWJ");
$pdo=new pdo(DBTYPE.":HOST=".HOST.";dbname=".DBNAME,USER,PWD);
$pdo->query("set names utf8");
?>
PDO非预处理增删改
$sql="select * from ***";
$result=$pdo->query($sql);
PDO非预处理查询
$sql="select";
结果集
$result=$pdo->query($sql)
之后用$result->fetch()或者$result->fetchAll()未获取数据
分页中计算页码的起始位置
$pageindex 当前页
10表示每组页码的个数
$start=(ceil($pageindex/10)-1)*10+1;
分页中计算页码的结束位置
$
http 协议 无状态
每一次请求服务器的链接 都是新的链接
服务器不会记住账户
----------------------------------------cookie-------------------------------
1、保存到客户端
2、由服务器写入到客户端
3、由浏览器带着cookie 请求服务器
4、服务器识别用户信息
5、cookie 是一个小的文本文件
6、每个cookie的大小最大是4k 每个域名能写入20个cookie
一共存300个cookie
7、写入cookie setcookie("user","admin",time()+60*60*24*10);
8、time 1970-1-1 0:0 到现在经过了多少秒
9、读取cookie $_COOKIE["name"];
10、删除cookie(让cookie 过期)
setcookie("user","admin",time()-1)
11、cookie的问题
①、cookie存用于客户端,客户端可以阻止写入cookie
②、cookie存放数据量小 4k
③、cookie 不安全
12、COOKIE是一个关联数组
13、serialize(数组名) 将复合数据类型转换成字符串(序列化)
14、unserialize($str)将数组还原成字符串(反序列化)
---------------------------session------------------------------------
session 会话
启动session
session_start();
存储session $_SESSION["name"]=value;
读取session $_SESSION["name"];
session过期时间 到浏览器关闭(会话结束时)如果客户没有再次请求服务器
session默认的过期时间是1440秒,24分钟
1、客户端 sessionid(唯一编号)
2、数据存放在服务器端,根据客户的编号来存取数据
3、unset($_SESSION["cart"]);删除session中的每个值
4、清空session $_SESSION=null;
5、销毁session session_destroy();
配置session
1、打开php.ini
2、找到session.save_path去掉分号 修改路径
3、查找session.save_handler 这是session的储存介质,可以存在内存里,可以存在文件里,可以存在数据库里,默认存储在文件当中
4、查找session.name 显示PHPSESSID 可以修改 是存储cookie的名称
5、查找session.auto_start=0 手动启动
6、查找session.cookie_lifetime = 0 存放sessionid的cookie的过期时间 0 会话结束
7、查找session.gc_maxlifetime 其中gc等于垃圾回收
session的生命周期
1、session 默认 会话结束
2、在没有再次请求服务器的情况下,默认过期时间是1440
3、如果修改了session.gc_maxlifetime ,session的过期时间以修改的值为准
----------------------------------超全局数组-----------------------------------------------
$_POST
$_GET
$_RESQUEST
$_SESSION
$_COOKIE
$_FILES
$_SERVER 服务器相关信息
$_SERVER["REMOTE_ADDR"]; 获取客户端的IP地址
$_SERVER[HTTP_USER_AGENT] 获取用户操作系统的信息,浏览器的信息
$_SERVER[HTTP_ACCEPT_LANGUAGE]获取客户端的语言
$_SERVER[SERVER_NAME] 服务器名称
$_SERVER[SERVER_ADDR 获取服务器的IP地址
$_SERVER[SERVER_PORT]服务器的端口号
$_SERVER[DOCUMENT_ROOT] 项目的根目录
$_SERVER[REQUEST_URI] 获取请求的页面url 路径
$_SERVER[REQUEST_METHOD]获取请求的方式
$_SERVER["HTTP_REFERER"]获取发起请求页的url地址
-----------------------------------缓存----------------------------------------------------
1、可以极大地提高网站的访问效率
2、缓存的定义就是 用空间换时间
怎样优化服务器量太大的问题
1、给数据库合理的添加索引
2、给网站增加缓存
缓存的分类
1.页面的静态化缓存
$smarty->caching=true;
$smarty->cache_lifetime=3600;
默认文件夹:cache
缓存文件存到文件夹 $smarty->cache_dir="huancun";
----------------------------------------php面向对象-----------------------------------------------------------------------
oop 面向对象的编程
万物皆对象
对象有 属性和方法
具有相同属性和共同方法的一组对象叫做类
面向对象的编程
1.代码的封装性
2.重用性
3.代码的扩展性
4.代码的可维护性
5.具有共同属性和共同的方法的一组对象:类
类和对象
类是对象的抽象
对象是类的具体实现(实例)
代码实现面向对象的编程:
1、先定义类
class 类名{
//属性
public(访问修饰符) 属性名;
//方法
函数
}
规范:类名使用帕斯卡命名法
文件命名:类名+.class.php
2.通过类实例化对象
对象名 = new 类名();
访问属性
对象名->属性名=属性值
调用方法
对象名->方法()
构造函数
1.作用:初始化类的成员变量(属性)
2. 语法
public function __construct(
n
a
m
e
,
_name,
name,_sex,
a
g
e
,
_age,
age,_hoddy)
{
在类的内部来访问自身
this代表当前对象
$this->name=$_name;
$this->sex=$_sex;
$this->age=$_age;
$this->hoddy=$_hoddy;
}
默认有一个无参的构造函数
实例化对象的时候都会自动调用构成函数
3.魔术方法
- 当访问的属性不存在,自动调用__get方法
public function __get($name){
}
2.赋值的时候属性不存在的时候
public function __set($name, $value)
{
echo $name."真的不存在";
}
3.
function __autoload($name){
$file=$name.".class.php";
require $file;
}帮我们在使用类的时候自动加载
4.类当中的public (访问修饰符)
公共:在类的内部和外部都可以被访问到
作用:可以控制访问权限
public公共的-在类的内部和外部都可以被访问到
5.类当中的private(私有的)
私有:只能在类中被访问到
6.static 静态的-直接使用类名来访问 类名::属性或者方法
在类的内部访问静态成员 用self::
7. protected:受保护的 在类的内部和子类可以访问
---------------------------------------------------------继承--------------------------------------------------------------------------
8.
子类继承父类的非私有成员,实现代码的重用性,和扩展性
class 子类 extends 父类{
}
9.调用父类成员
parent::
10.
重写
子类定义和父类相同的成员,子类会覆盖父类的成员
12.继承的特性
单根性(一个子类只能继承一个父类)
传递性(c extends b b extends a)
-----------------------------------------------------面向对象的三大特性--------------------------------------------------------------------
1、封装 不关心内部的细节实现
2、继承 实现代码的重用和扩展,子类继承父类的非私有成员
3、多态
1.同一个类在不同的环境表现出不同的状态
2.不同的对象调用同一个方法表现不同的状态
---------------------------------------------------面向对象数据库查询------------------------------------------------------------------------
-------------------------------------------------面向对象抽象类----------------------------------------------------------------------------
public abstract function
父级有抽象方法子级一定要实现,或者子级都使用一个共同的方法。但用法不同
抽象类只能被实现,不能被实例化(不能被new),不能创建对象
只能被子类继承
抽象方法没有具体实现,由子类去实现,子类必须实现
抽象方法必须定义在抽象类中
什么情况下定义抽象方法
子类都具有的共同方法,但是每个子类的具体实现不同
抽象类不一定有抽象方法
子类必须要实现抽象类的抽象方法,除非子类也是抽象类
抽象类抽象方法可以使不同的对象具有相同的方法 但方法表现出来的行为不统一
抽象类抽象方法可以实现多态
$COM=new 类名;
当 构造函数无参的时候,小括号可以省略
类名和方法名不区分大小写
-------------------------------------------接口---------------------------------------------------------------------------------------------
接口: 是对继承单根性的扩展
约束子类的行为
子类只能继承一个父类但可以继承多个接口
接口语法:interface I(以大写的I开头)接口名
{
可以定义常量 define(“PI”)
常量还有一种常量方法 const PI
function 函数名();
}
接口可以定义常量和函数,但都不能有具体的实现
而且不能写访问修饰符,因为接口中的成员都是隐式公开(public)
class 子类 extends 父类 impements 接口1,接口2…
{
}
__call() 当调用的方法不存在时,自动调用__call方法
final 最终的 不能被继承,子类不能重写
DBhelper
1、建立数据库的链接
2、增删改查
2.1 select * / 列名 from 表名
inner join表名 on 链接条件
where 查询条件
order by 列名
$fileds 字段(列名)
$tablename 表名
$join 连接的表名和链接条件
$where 查询条件
$orderby 排序的列名 asc/desc
$limit 开始,行数
2.2 delete from where 删除条件
2.3 update 表名set 列名
public function setfileds($arr){
foreach ($arr as $k=>$v){
$this->filedlist.="$k='$v',";
}
$this->filedlist=substr($this->filedlist,0,strlen($this->filedlist)-1);
}
spl_autoload_register 当类找不到 自动加载类所在文件