导图社区 php基础
PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。本思维导图是作者学习php过程的全面的总结,每个知识点都有对应的例子,希望对你有帮助!
编辑于2020-02-06 07:16:32php
php基本语法
函数
初识函数
函数的定义
用户定义的函数声明以单词 "function" 开头: 语法 function functionName() { 被执行的代码; } 注释:函数名能够以字母或下划线开头(而非数字)。 注释:函数名对大小写不敏感。
函数的调用
方法
在代码中引用函数名就可以了
例子
<?php function familyName($fname) { echo "$fname Zhang.<br>"; } familyName("Li"); familyName("Hong"); familyName("Tao"); familyName("Xiao Mei"); familyName("Jian"); ?> 练习: 输出两数之和
函数的返回值
什么是
在函数中return 的值就是返回值
例子
<?php define("PI",3.14); function area($r) { return PI * $r * $r; } echo "2 + 5=" .area(5) ;
函数的高级应用
函数中变量的作用域
可变函数
函数的嵌套调用
函数的递归调用
字符串相关函数
explode函数
implode函数
strcmp函数
str_replace函数
substr函数
strlen函数
trim函数
日期和时间管理
UNIX时间戳
获取时间
格式化输出
如何使用php手册
数组
初识数组
什么是数组
数组是特殊的变量,它可以同时保存一个以上的值。 如果您有一个项目列表(例如汽车品牌列表),在单个变量中存储这些品牌名称是这样的: $cars1="porsche"; $cars2="BMW"; $cars3="Volvo"; 不过,假如您希望对变量进行遍历并找出特定的那个值?或者如果您需要存储 300 个汽车品牌,而不是 3 个呢? 解决方法是创建数组! 数组能够在单一变量名中存储许多值,并且您能够通过引用索引号来访问某个值。 <?php $cars=array("porsche","BMW","Volvo"); echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."; ?>
数组的定义
数组的使用
索引数组
带有数字索引的数组 有两种创建索引数组的方法: 索引是自动分配的(索引从 0 开始): $cars=array("porsche","BMW","Volvo"); 或者也可以手动分配索引: $cars[0]="porsche"; $cars[1]="BMW"; $cars[2]="Volvo";
获得数组的长度
count() 函数用于返回数组的长度(元素数): 实例 <?php $cars=array("porsche","BMW","Volvo"); echo count($cars); ?>
遍历索引数组
如需遍历并输出索引数组的所有值,您可以使用 for 循环,就像这样: 实例 <?php $cars=array("porsche","BMW","Volvo"); $arrlength=count($cars); for($x=0;$x<$arrlength;$x++) { echo $cars[$x]; echo "<br>"; } ?>
关联数组
关联数组是使用您分配给数组的指定键的数组。 有两种创建关联数组的方法: $age=array("Bill"=>"35","Steve"=>"37","Elon"=>"43"); 或者: $age['Bill']="63"; $age['Steve']="56"; $age['Elon']="47"; 随后可以在脚本中使用指定键:
遍历关联数组
如需遍历并输出关联数组的所有值,您可以使用 foreach 循环,就像这样: 实例 <?php $age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47"); foreach($age as $x=>$x_value) { echo "Key=" . $x . ", Value=" . $x_value; echo "<br>"; } ?>
多维数组
多维数组指的是包含一个或多个数组的数组。 PHP 能理解两、三、四或五级甚至更多级的多维数组。不过,超过三级深的数组对于大多数人难于管理。 注释:数组的维度指示您需要选择元素的索引数。 对于二维数组,您需要两个索引来选取元素 对于三维数组,您需要三个索引来选取元素
删除数组
unset
php中用unset函数删除数组中的元素。
例子
<?php $arr[0]=123; $arr[1]=345; $arr[3]=357; foreach ($arr as $key => $value) { echo $key . $value .' '; } unset($arr[3]); foreach ($arr as $key => $value) { echo $key . $value .' '; }
数组操作符
数组运算符
$a + $b 联合 $a 和 $b 的联合。 $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。 $a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。 $a != $b 不等 如果 $a 不等于 $b 则为 TRUE。 $a <> $b 不等 如果 $a 不等于 $b 则为 TRUE。 $a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE。
例子
<?php $a = array("a" => "apple", "b" => "banana"); $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); $c = $a + $b; // Union of $a and $b echo "Union of \$a and \$b: \n"; var_dump($c); $c = $b + $a; // Union of $b and $a echo "Union of \$b and \$a: \n"; var_dump($c); $a += $b; // Union of $a += $b is $a and $b echo "Union of \$a += \$b: \n"; var_dump($a); ?>
数组的常见操作
数组指针
数组遍历
数组排序
数组元素查找
数组的常用函数
基本函数
键值对的相关函数
排序函数
合并和拆分函数
其他函数
面向对象编程
面向对象概述
类与对象
构造方法与析构函数
类常量与静态成员
类常量
含义
类常量属于类,通过类来访问。 使用const关键字,必须初始化 1. 范围解析操作符::,专门用于实现类成员操作,实现类直接访问类成员 访问方式: 类名::类常量名 类内: 类名::类常量 Self::类常量
例子
静态成员
继承
概念含义
类的继承是指在一个现有类的基础上,去构建一个新类,这个构建出来的类称为子类,现有类称为父类,子类会自动拥有父类所有可继承的属性和方法。 继承目标:父类包含子类,子类属于父类,父类中通常定义的子类共有的一些特性成员。 继承内容:PHP中继承是子类继承父类所有的公有成员、受保护成员和私有属性,不能继承父类的私有方法。
重写父类方法
含义
子类与父类成员重名?重写问题(override) 子类可以重写父类任意成员,通常重写父类方法,扩展或更改业务逻辑。 但是如果同时需要显式调用父类中被重写的成员,则可以使用parent::来访问,典型的是构造方法等。 注意:parent 是静态的,只能调用父类方法和静态属性(允许) 要求: (1) 子类重写父类方法时,控制权不能高于父类,即更开放。 (2) 子类重写父类方法时,必须保证与父类同名方法参数一致 <?php
例子
<?php //5-11.php //重写 class Animal{ public function shout(){ echo '动物会叫,不确定怎么叫<br/>'; } } class Cat extends Animal{ //子类重写父类方法 public function shout(){ echo "小猫喵喵叫<br/>"; //$this->shout(); //自己调自己,死机 //parent::shout(); //Animal::shout(); } } $c=new Cat(); $c->shout();//子类有,调用子类,没有,调用父类 ?>
final关键字
含义
final类:如果需要限制一个类不能被继承,而只能实例化,则将其声明为final类 final方法:如果需要限制子类中不能重写某个方法,可以将某个方法声明为final方法。 可将子类声明为final的防止被继承,而将父类中的方法声明为final方法子类中不能重写。
例子
<?php //5-12.php //final类方法 Final class Animal{ final public function shout(){ echo '动物会叫,不确定怎么叫<br/>'; } } class Cat extends Animal{ //子类重写父类方法 public function shout(){ echo "小猫喵喵叫<br/>"; } } $c=new Cat(); $c->shout(); ?> 这么写是错误的,子类不能继承
自动加载及魔术方法
自动加载
含义
类的任何操作都需要确认类在内存存在,类文件通常是一个类单独形成一个文件, 在操作之前必须确认类的加载。即将类所在文件加载到内存。 如:定义一个函数__autoload(),当引入一个不存在的类时,系统会自动调用__autoload()函数来加载类文件。
例子
规定,类定义文件,文件名类名.class.php,一个文件只包含一个类。 <?php //Cat.class.php class Cat{ function __construct(){ echo __METHOD__; } } <?php //Dog.class.php class Dog{ function __construct(){ echo __METHOD__; } } <?php //5-13.php function __autoload($classname){ require_once$classname.'.class.php'; } $dog=new Dog(); echo '<br/>'; $cat=new Cat();
魔术方法
含义
特点:不需要手动加载,系统会自动执行。
例子
手动加载
例子
<?php //A.php //类文件 class A{ public function __construct(){ echo __METHOD__; } } ?> 应用文件usea.php <?php //useA.php include_once'a.php';//不允许重名 $p1=new A(); ?>
抽象类与接口
抽象类
含义
当在定义一个类的时候,其中所需的某些方法(动物叫)暂时并不能完全定义出来,而是让其继承的类来实现,此时就可以用到抽象类。这样可以到达代码复用 抽象方法:只有方法声明而没有方法体的方法,在子类继承时再来编写该方法的具体实现。语法格式: Abstract function 方法名(); 定义抽象类需要使用abstract关键字来修饰,语法格式具体如下: abstractclass 类名{ //类的成员 } 抽象类是子类的模板。不能单独使用,不能被实例化,必须通过子类进行调用。 抽象类是面向对象编程中一个比较重要的知识点,大家要记住两句话: 1. 用abstract 关键字来修饰一个类时,这个类就叫抽象类. 2. 用abstract 关键字来修饰一个方法时,这个方法就是抽象方法.
例子
<?php //abstract.php abstract class Animal{ abstract public function shout();// 抽象方法不能有方法体,主要是为了让子类实现 abstract public function eat(); public function speak(){ echo '大家好!抽象类可以有普通方法和属性'; } } class Cat extends Animal{ public function shout(){ echo '小猫喵喵喵<br/>'; } public function eat(){ echo '小猫吃鱼<br/>'; } } $c=new Cat(); $c->shout(); $c->eat(); $c->speak(); ?> ①抽象类不能被实例化 ②抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法 ③一旦类包含了abstract方法,则这个类必须声明为abstract ④抽象方法不能有函数体 ⑤如果一个类继承了某个抽象类,则它必须实现该抽象类的所有抽象方法.(除非它自己也声明为抽象类)
接口
含义
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候, 再根据具体情况把这些方法写出来。 如果一个类中的所有方法都是抽象的,可以将这种类定义为接口。 接口是一种特殊的类,使用interface关键字. 接口成员: 1.类常量 2.方法:抽象方法,访问控制符必须是Public 接口语法格式: interface 接口名{ //类常量 //方法 }
例子
接口中都是抽象方法,没有具体实现,通过创建一个类来实现接口中全部方法。 实现接口用 implements: class 类名 implements 接口名1,接口2{ } 因为都是 abstract public ,可以省略 <?php //interface.php //1.当一个类实现了某个接口,则要求该类必须实现这个接口的所有方法 interface Animal{ public function shout(); public function eat(); } interface Bird{ public function fly(); } class Chick implementsAnimal,Bird{ public function shout(){ echo '母鸡咯咯哒,<br/>'; } public function eat(){ echo '吃米<br/>'; } public function fly(){ echo '鸡飞不高'; } } $c=new Chick(); $c->shout(); $c->eat(); $c->fly(); ?>
多态
含义
让该方法具备一定的通用性。 例如要实现一个动物叫的方法,由于每个动物的叫声是不同的, 因此可以在方法中接收一个动物类型的参数的对象。当传入猫类对象时就发出猫类的叫声, 传入犬类对象时就发出犬类的叫声,这种向方法中传入不同的对象,方法执行效果各异的现象就是多态。 instanceof作用: (1)判断一个对象是否是某个类的实例; (2)判断一个对象是否实现了某个接口。
例子
<?php //定义Animal接口 abstract class Animal{ public abstract function shout(); //抽象方法,没有方法体,具体让子类实现 } //定义Dog类,实现了Animal方法 class Dog extends Animal{ public function shout(){ echo "汪汪……<br>"; } } //定义Cat类,实现了Animal方法 class Cat extends Animal{ public function shout(){ echo "喵喵……<br>"; } } functionAnimalShout($obj){ if($objinstanceof Animal){ $obj->shout(); }else{ echo "Error: 对象错误!"; } } $cat=new Cat(); $dog=new Dog(); AnimalShout($cat); AnimalShout($dog);
设计模式
单例模式
例子
<?php //singleton.php class Cat{ //私有静态属性,保存实例化对象,保证只有一个 static private $instance=NULL; //私有构造法方法,禁止外部对象创建 private function __construct(){ echo __METHOD__,'<br/>'; } //私有克隆方法,禁止外部克隆 private function __clone(){} static public function getInstance(){ //如果本类$instance为NULL,说明还没实例化 if (self::$instance==NULL){ self::$instance=new self(); } return self::$instance; } } $c1=Cat::getInstance(); $c2=Cat::getInstance(); var_dump($c1); echo '<hr/>'; var_dump($c2); ?>
含义
定义:单例模式singleton,一种类的设计最多产生一个对象。 设计规范:三私一公 (1) 私有化构造方法:禁止类外无限实例化对象 (2) 私有化克隆方法:禁止对象无限克隆对象 (3) 私有化静态法属性:保存类内部实例化得到对象 公有化静态方法:允许外部通过调用类内部方法获得对象
工厂模式
含义
工厂模式的作用就是“生产”对象。工厂方法的参数是要生成对象的类名。
例子
错误处理及调试
错误处理概述
如何处理错误
异常处理
PHP的调试技术
HTTP协议
Http概述
什么是http
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。 是工作在tcp/ip协议基础上的,所有的WWW文件都必须遵守这个标准。 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
http.0和http.1
HTTP1.0
HTTP1.1
HTTP1.1版本,支持持久连接,也就是说在一个TCP连接上可以传送多个HTTP请求和响应, 从而减少了建立和关闭连接的消耗和延时。 <h1>abc</h1> <img src="maomao.jpg"/> <img src="tuzi.jpg"/> <?php //http1.php echo 'hello'; ?> 
http地址
http消息
Http请求
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。 一个完整的HTTP请求包括如下内容: 一个请求行、若干请求头、以及实体内容,其中的一些消息头和实体内容都是可选的,最后一行空行,区分请求头和请求体,通知服务器以下不再有请求头。
http请求行
1) 形式:请求方式 资源路径 协议版本号 2) GET /di7jiang/http1.php HTTP/1.1 GET HTTP/1.1 最早的时候HTTP协议有过1.0,请求行独占一行(第一行) 常用请求方式 GET POST
get方式
在浏览器地址栏输入url或者单击网页超链接,或者FORM表单method设置为GET或者不设置method属性值,提交表单时,这几种情况,浏览器使用GET方式发送请求。 http://localhost/di7jiang/get.php?name=tom&age=18 ?后:参数信息,参数名=参数值 多个参数之间 & 隔开 数据大小:1kb 2kb ?实际是由浏览器控制的,HTTP没有限制。
post方式
FORM表单method设置为POST,提交表单时,使用POST提交表单内容,表单元素及其数据作为http消息的实体内容发送给服务器。 实际开发中,一般都是使用POST方式 :安全、大小无限制。
Http请求消息头
请求头就是各项协议内容:具体的协议内容不会每次都使用全部 1)Host:请求的主机地址(必须) 2)Accept:当前请求能够接收服务器返回的类型(MIME类型) 3)Accept-Language:接收的语言 4)User-Agent:客户浏览器所在点的一些信息 请求头不固定数量,每个请求协议也是独占一行,最后会有一行空行(用来区分请求头和请求体)
请求体
请求数据:只有POST请求会有请求体。?? GET请求所有的数据都是跟在URL之后,会在请求行中的资源路径上体现。 基本格式:资源名字=资源值&资源名字=资源值… 数据体 在Form Data里 name=tom&age=18
Http响应
当服务器收到浏览器的请求后,会回送响应消息给浏览器。 一个完整的响应消息主要包括响应状态行、响应消息头和实体内容组成, 其中,每个组成部分都代表了不同的含义。 最后一行空行(区分响应头和响应体)
Http响应状态行
1)形式:协议版本号 状态码 状态消息(独占一行) HTTP/1.1 200 ok 2)200 ok: 成功 3)403 Forbidden: 没权限访问 4)404 Not Found: 未找到页面 5)500 Server Internal Error: 服务器内部错误
Http响应消息头
具体协议内容 1)时间:Date: Sun, 27 Oct 2019 13:52:10 GMT 2)服务器:erver: Apache/2.2.11 (Win32) PHP/5.3.0 3)内容长度:Content-Length: 67,数据具体的字节数(响应体) 4)内容类型:Content-Type: text/html:告诉浏览器对应的数据格式 列举了几个常见的响应头,并不是全部:响应头一个占一行,最后一行空行(区分响应头和响应体)
响应体
实际服务器响应给浏览器的内容
常见HTTP响应设置及使用
PHP中针对HTTP协议(响应)进行了底层设计,可以通过函数header来实现修改HTTP响应(响应头
注意事项
1、 Header可以设计HTTP响应,因为HTTP协议特点是:响应行,响应头(空行结尾),响应体。认为通过header设计响应头的时候,不应该有任何内容输出,所以一旦产生内容输出(哪怕一个空格),系统都会认为响应头已经结束而响应体开始了,所有如果先输出内容后设置响应头(header使用),理论设置无效; 2、 在PHP5以后,增加程序缓存内容:允许服务器脚本在输出内容的时候,不直接返回浏览器而是先在服务器端使用程序缓存保留(php.ini中使用output_buffering),有了该内容之后,在程序缓存内会自动调整响应头和响应体(允许响应头在已经输出的内容之后再设置),但是此时会报错(警告)。 总结:header设置响应体之前不要有任何输出 Location:重定向,立即跳转(响应体不用解析) 浏览器在解析服务器响应的时候:先判定响应行,然后响应头,最后响应体:location是在响应头中,所以浏览器一旦见到该协议项,不再向下解析。 Refresh:重定向,定时跳转(响应体会解析) 延时重定向:浏览器会根据具体时间延迟后再访问指定跳转链接:浏览器在准备跳转访问之前,会继续解析HTTP协议(响应头和响应体),后面输出可以看到 Content-type:内容类型,MIME类型 通过内容告知(MIME类型),浏览器正确解析内容 <?php //header.php //通过header设置响应头 //放到header前,错误隐藏 //php.ini output_buffering = On //改为 output_buffering = 0, //header('content-type:text/html;charset=utf-8'); //echo '中国你好!'; //location:立即重定向,看到立马跳转,后面代码不再执行 //header('location:http1.php'); //延时重定向 //3秒后跳转,手机支付 header('Refresh:3;url=http1.php'); //注意中间 正确的是分号; echo 'hello world'; ?> Content-disposition:内容类型,MIME类型扩展,激活浏览器文件下载对话框 浏览器在解析内容的时候,默认是直接解析:那么有时候需要浏览器不解析,当作内容下载成文件
PHP与Web页面交互
解析PHP的执行过程
web表单
超全局变量
PHP会话技术
会话技术概述
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。 有cookie和session两种会话技术
CooKie技术
Cookie概述
•Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
创建Cookie
通过函数setcookie
例子
setcookie("city","北京市",time()+60*60*1); setcookie("district","海淀区",time()+60*60*1);
读取Cookie
例子
$val = $_COOKIE['key'];
用超全局数组$_COOKIE读取
删除Cookie
删去cookie时也是用setcookie
需要将$value设为空,时间参数小于系统时间
例子
setcookie("district","",time()-60*60*1);
Cookie案例显示用户上次访问时间
Session技术
Session概述
Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务
session文件生命时候创建?
在第一次访问服务器的时候,服务器会创建一个session文件
session的生命周期
从session文件创建后 如果过了一段时间没有访问之后就会失效
多次打开关闭浏览器会有几个session文件?
打开几次就有几个 一次会话会对应一个session文件
启动Session
用函数session_start()
例子
session_start(); echo "ID:" .session_id();
向Session中添加数据
添加数据必须用超全局数组$_SESSION[]
例子
<?php session_start(); $_SESSION['bookname']='天龙八部'; ?>
读取Session中的数据
通过$_SESSION
例子
$val= $_SESSION['bookname'];
删除Session中的数据
删除单个数据
unset()
例子
unset($_SESSION['key'])
删除所有数据
赋给空数组
例子
$_SESSION=array();
结束当前会话
session_destory()
注销当前会话,并且会删除会话中的所有数据;
例子
session_start(); $_SESSION['key']='sessioon'; session_destroty();
Session案例---实现
正则表达式
文件操作
文件概述
文件流
是指在通过HTTP协议POST或GET数据的过程中,传输一方直接以二进制流的方式传送某个文件的内容,这样就形成了一条文件流,接收方只要将接收的流内容直接写进文件即可。
判断文件或目录是否存在(识别路径):file_exists()
在操作一个文件时,如果该文件不存在,则会出现错误。为了避免这种情况出现,PHP提供了file_exists()函数,用于检查文件或目录是否存在。其声明方式如下: bool file_exists ( string $filename )
判断给定文件名是否为一个正常的文件(不识别路径):is_file(string $filename)
获取文件大小:filesize ( string $filename )
删除文件:unlink($filename)
例子
<?php //11-2.php header('content-type:text/html;charset=utf-8'); echo '<pre>'; $f1='C:/wamp915/www/di11jiang/jisuanji.txt'; //$f2='C:/wamp915/www/di11jiang'; //文件或目录是否存在 (file_exists($f1)) or (die( '文件不存在')); //是否正常文件 (is_file($f1)) or (die( '不正常文件')); (is_file($f2)) or (die( 'f2为不正常文件')); //读出文件内容 echo '文件大小:',filesize($f1) . '<br/>'; $res=file_get_contents($f1); var_dump($res); //删除文件 unlink($f1); echo '<hr/>'; (file_exists($f1)) or (die( '文件不存在')); ?>
文件类型
文件属性
在操作文件的时候,经常需要获取文件的一些属性,如文件的大小 、权限和访问时间等。PHP内置了一系列函数用于获取这些属性,如表所示。 
文件操作
打开和关闭文件
读取文件
file_get_contents(文件路径)
将文件内容读入到一个字符串中 获取指定文件的所有内容,如果路径不存在最好做安全处理
写入文件
file_put_contents(文件路径,内容)
将指定内容(字符串)写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
例子
<?php //11-9.php $f1='jisuanji.txt'; //读文件到一个字符串中 $content=@file_get_contents($f1); //var_dump($content); $str1='hello\r\nbye\r\n'; $str2='hello' . PHP_EOL.'bye';//换行常量 $f2='hello.txt'; //把内容写到一个文件中,文件不存在则创建 $res=file_put_contents($f2,$str1.$content); var_dump(file_get_contents($f2)); ?>
其他操作
1)is_file():判断文件是否正确(不识别路径) 2)filesize():获取文件大小 3)file_exists():判断文件是否存在(识别路径) 4)unLink():取消文件名字与磁盘地址的连接(删除文件) 5)filemtime():获取文件最后一次修改的时间 6)fseek():设定fopen打开的文件的指针位置 7)fgetc():一次获取一个字符 8)fgets():一次获取一个字符串(默认行) 9)file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组,数组中每个元素是文件中一行
例子
【案例】:把jisuanji.txt文件中读出来,忽略空行,写入到另外一个文件jsj.txt中 <?php //11-5.php $f1='jisuanji.txt'; //以读方式打开文件,返回资源类型 $f2=fopen($f1,'r'); //var_dump($f2); echo '<br/>'; //读取前50个字节 $str1=fread($f2,50); //var_dump($str1); fclose($f2); //读取网页文件 $f3=fopen('http://localhost/di11jiang/11-2.php','r'); $str3=fread($f3,100); //var_dump($str3); //file:把文件读入到一个数组中,一行一个数组元素 // $arr=file($f1); // foreach($arr as $k=>$v){ // echo $k+1,' : ',$v,'<br/>'; // } $f4=fopen('jsj.txt','a+'); $arr=file($f1); foreach($arr as $k=>$v){ if (!trim($v)==''){ echo $k+1,' : ',$v,'<br/>'; fwrite($f4,$v); } }
PHP4常见文件操作函数
l fopen(文件路径,打开模式) :打开一个文件资源,限定打开模式 l fread(资源,长度) :从打开的资源中读取指定长度的内容(字节) l fwrite(资源,内容) :向打开的资源中写入指定的内容 l fclose(资源) :关闭资源
目录操作
解析目录
1)dirName(一个路径):得到的是路径的上一层路径
2)is_dir():判断指定路径是否是一个目录
3)basename():返回路径中文件名
例子
<?php //11-17.php $d1='C:/wamp915/www/di11jiang/d1/jisuanji.txt'; //返回路径的上一层路径 $d2=dirname($d1); var_dump($d2,dirname($d2)); echo '<hr/>'; //判断指定路径是否是一个目录 var_dump(is_dir($d1)); var_dump(is_dir($d2)); echo '<hr/>'; //返回路径中文件名 echo basename($d1); ?>
遍历目录
步骤
读取方式:将文件夹(路径)按照资源方式打开 1)openDir():打开一个目录,返回一个路径资源,包含指定目录下的所有文件(文件夹) 1) readDir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源 读取所有内容:遍历操作 3)closeDir():关闭资源 4)scandir():封装版的opendir\readdir\closedir,获取一个指定路径下的所有文件信息,以数组形式返回
例子
<?php //11-20.php //$p1='C:/wamp915/www/di11jiang/d1'; $p1='C:/wamp915/www/di11jiang'; //打开目录 $r1=opendir($p1); var_dump($r1); echo '<hr/>'; //读取指针所在文件名,指针下移 var_dump(readdir($r1)); var_dump(readdir($r1)); var_dump(readdir($r1)); var_dump(readdir($r1)); //关闭资源 closedir($r1); echo '<hr/>'; echo '<pre>'; print_r(scandir($p1)); ?>
递归遍历目录
递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。 递归算法:将大问题切成相似的小问题(最小单位),然后可以调用解决大问题的方法来解决小问题。 递归函数:函数如果自己内部调用自己,该函数称之为递归函数。 递归遍历目录的思维逻辑 1、 设计一个能够遍历一层文件的函数 a. 创建函数 b. 安全判定:是路径才访问 c. 读取全部内容,遍历输出 2、 找到递归点:遍历得到的文件是目录,应该调用当前函数(调用自己): a. 需要构造路径(遍历得到的结果只是文件的名字) b. 需要注意排除.和.. c. 判断是路径还是文件 d. 递归调用函数 3、 找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口 4、 如何显示层级关系?函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进 a. 在函数参数中增加一个标记:默认值为0 b. 递归调用函数的时候也需要使用该参数:但是是属于当前层级的子层,所以+1 c. 根据层级来实现缩进:str_repeat()
例子
<?php //11-23.php //递归遍历目录 $dir='C:/wamp915/www/di11jiang'; $d2='Rbw17 2019-10-23'; echo '<hr/>'; //1.设计一个能够遍历一层文件的函数 //2.递归点:遍历得到是文件目录,调用当前函数 //注意:不要是. .. //显示层级关系,默认值0 function my_scandir($dir,$level=0){ //不是目录,结束 if(!is_dir($dir)) { die($dir) . '<br/>';} //读取全部路径信息,遍历输出 $files= scandir($dir); foreach($files as $file){ //根据层级来实现缩进 echo str_repeat(" ",$level). $file . '<br/>'; //排除 . 和.. if($file=='.' || $file=='..') continue; //构造路径 $file_dir=$dir .'/' .$file; //echo $file_dir . '<br/>'; //判断路径 if(is_dir($file_dir)){ //递归点 my_scandir($file_dir,$level+1); } } } //测试 //my_scandir($dir); my_scandir($d2); ?>
创建和删除目录
1)mkDir(路径名字):创建成功返回true,创建失败返回false
统计目录中所有文件的大小
文件上传与下载
文件上传
文件下载
文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。 PHP下载: 读取文件内容,以文件流的形式传递给浏览器:在响应头中告知浏览器不要解析,激活下载框实现下载。 (1)指定浏览器解析字符集 (2)设定响应头 a) 设定文件返回类型:image/jpg||application/octem-stream b) 设定返回文件计算方式:Accept-ranges:bytes c) 设定下载提示:Content-disposition:attachment;filename= '文件名字' d) 设定文件大小:Accept-length:文件大小(字节) (3)读取文件 (4)输出文件 方案1:如果文件较小,可以使用PHP5的文件函数操作:file_get_contents 方案2:文件比较大(网络不好),可以使用PHP4 的文件操作方式:一次读一点
php图像技术
数据库
典型关系型数据库
小型关系型数据库
中型关系型数据库
大型关系型数据库
MYSQL
SQL介绍
MySQL基本介绍
SQL分类(curd)
启动和停止MySQL服务
数据库基本操作
1.创建数据库
create database 数据库名字 [库选项]; create database mydatabase;
2.显示数据库
-- 显示所有数据库 show databases;
3.选择数据库
-- 选择数据库 usemydatabase;
4.修改数据库
基本语法:alter database 数据库名字 charset = 字符集; 一旦修改成功,那么对应的opt文件中就会体现
5.删除数据库
-- 删除数据库 drop database mydatabase;
数据表操作
1.创建数据表
use mydatabase2; create table student( name varchar(10) )charset utf8;
2.显示数据表
select * from studentname;
3.显示表结构
-- 显示表结构 describe class; desc teacher;
4.显示表创建语句
-- 查看表创建语句 show create table student; show create table student\G
5.设置表属性
6.修改表结构
-- 修改表选项 alter table student charset gbk;
7.删除表结构
-- 删除表名 drop table class; drop table teacher,my_student;
数据基础操作
1.插入操作
insert into my_teacher (name,age) values('Jack',30);
2.查询操作
-- 获取所有数据 select * from my_teacher; -- 获取指定字段数据 select name from my_teacher; -- 获取年龄为30岁的人的名字 select name from my_teacher where age = 30;
3.删除操作
-- 删除年龄为30岁的老师 delete from my_teacher where age = 30;
4.更新操作
-- 更新年龄Han updatemy_teacher set age = 28 where name = 'Han'; update my_teacher set sex ='男' where name = 'Lilei';
字符集
字符编码概念
设置客户端所有字符集
php操作mysql
一,连库基本操作
1.链接数据库
1)资源 mysql_connect(服务器地址,用户名,密码) $link = mysql_connect('localhost:3306','root',''); 连接资源默认也是超全局的,任何地方都可以使用该资源进行数据库的其他操作 补充:mysql_connect默认是对一个服务器只连接一次(如果再次运行,返回的是同一个资源),但是如果有需要连接同一个资源两次,那么可以使用第四个参数:TRUE
2.选择数据库,并设置编码
保持客户端与服务器之间的沟通顺畅:同一“语言”(字符集) 1) 形式1:mysql_query("set names XXX") $res = mysql_query('set names utf8',$link); 返回为true Set names gbk:属于没有执行、没有返回结果的指令,这种指令执行后,返回结果为 TRUE Warning: 本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换之 intmysql_query(MYSQL *mysql, const char *query) 如果查询成功,返回0。如果出现错误,返回非0值。 2)形式2:mysql_set_charset("XXX")
3.选定使用的数据库
1)形式1:mysql_query("use XXX") 2)形式2:mysql_select_db("XXX")
4.关闭链接
主动释放连接:MySQL服务器的连接资源是有限的,不用了需要释放(脚本执行结束系统也会自动释放) 1)mysql_close()
二,执行增删改操作
(1)增加数据
mysql_query("insert ...."):通过insert指令向指定表插入对应的数据 <?php //4insert.php //PHP操作数据库:新增数据 //引入初始文件 include_once '3database.php'; //组织SQL指令 $pub_time = time(); $sql = "insert into n_news values(null,'学习MYSQL,插入语句',1,'好好学习,天天向上,这是内容,成功根本','白龙马',{$pub_time})"; //执行SQL指令 if(mysql_query($sql)){ //操作成功:通常是返回自增长ID给用户 echo '数据插入成功!'; }else{ //操作失败 echo '数据插入失败!'; }
(2)删除数据
mysql_query("delete ...."):根据删除指令操作数据库(表) <?php //5delete.php //PHP操作数据库:删除数据 //引入初始文件 include_once '3database.php'; //组织SQL指令:实际删除时通常也是根据ID进行删除,但是ID都是传递过来 $sql = "delete from n_news where id = 1"; //执行SQL指令 if(mysql_query($sql)){ //操作成功 echo '数据删除成功!'; }else{ //操作失败 echo '数据删除失败!'; }
(3)更新数据
3)mysql_query("update ...."):根据更新指令操作数据库 <?php //6update.php //PHP操作数据库:更新数据 //引入初始文件 include_once '3database.php'; //组织SQL指令:实际更新时通常也是根据ID进行更新,但是ID都是传递过来 $sql = "update n_newsset content= 'goodgoodstudy,day day up!' where id = 4"; //执行SQL指令 if(mysql_query($sql)){ //操作成功 echo '数据更新成功!'; }else{ //操作失败 echo '数据更新失败!'; }
(4)判断执行结果
1)执行成功,结果为true,只代表SQL指令执行成功 2)执行失败,结果为false,代表SQL指令错误或者操作对象不存在 updaten_news set content= 'good goodstudy,day day up!' where id = 100 ID=100不存在
三、执行查询操作
<?php //7select.php //数据库操作:查询 //引入初始化操作 include_once '3database.php'; //组织SQL指令 $sql = "select * from n_news"; //$sql = "select * from n_news888 where id=100"; //执行查询操作 $res = mysql_query($sql); //var_dump($res); //获取结果集数据条数:多少行记录 $rows = mysql_num_rows($res); //echo $rows; //解析结果集 $row = mysql_fetch_assoc($res); echo '<pre>'; //print_r($row); $row = mysql_fetch_row($res); //print_r($row); //MYSQL_FETCH_ARRAY $row = mysql_fetch_array($res); print_r($row); //获取两种 $row = mysql_fetch_array($res,MYSQL_BOTH); print_r($row); //获取关联 $row = mysql_fetch_array($res,MYSQL_ASSOC); print_r($row); //获取索引 $row = mysql_fetch_array($res,MYSQL_NUM); print_r($row);
1.执行查询语句
1)mysql_query("select ...") 2)其他类似查询语句,比如:show语句,desc语句 总结:凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回:数据结果) 3)执行结果的处理:成功为结果集,失败为false(表不存在或 语法错误) 成功返回结果:SQL指令没有错误,但是如果查询结果本身为空返回也是true(结果集是一种资源:转换成bool永远为TRUE) $sql = "select * from n_news where id=100"; 失败为false:SQL指令有错误 $sql = "select * from n_news888 where id=100";
2.获取结果集行数
1)mysql_num_rows():获取结果集中到底有多少行记录 $rows = mysql_num_rows($res);
3.解析结果集
将一种结果集资源(PHP不能直接使用),转换成一种PHP能够解析的数据格式:通过从结果集中(结果集指针:类似数组指针),按照结果集指针所在位置取出对应的一条记录(一行),返回一个数组,同时指针下移…直到指针移出结果集。 1)mysql_fetch_assoc():获取关联数组,表的字段名作为数组下标,元素值作为数组元素值 2)mysql_fetch_row():获取索引数组,只获取数据的值,然后数组的下标从0开始自动索引 3)mysql_fetch_array():获取关联或者索引数组,但是默认是同时存在:一个记录取两次,形成一组是关联数组,一组是索引数组;但是可以通过第二个参数来决定获取的方式:MYSQL_ASSOC只获取关联数组;MYSQL_NUM只获取索引数组;MYSQL_BOTH获取全部两种。 通常结果集的操作:一般是获取里面的所有(全部记录)