一、php语法初步
php 是一种运行在服务器端的脚本语言,可以嵌入到html中。
1、php代码标记
多种标记来区分php脚本:
ASP:<% php 代码 %>
短标记:<?php代码?> 以上两种基本不用。
脚本标记:
标准标记:<?php php代码?>
2、PHP注释
习惯:所有的代码在写的过程中必须进行注释,对于初学者而言,注释就是个人学习写代码的思路。
PHP中注释分为两种:
1、行注释: 一次注释一行
//:后面的内容都是注释
#:与//相同
2、块注释:一次注释一块
/* 注释内容 */
3、PHP分隔符
语句分隔符:在php中,代码是以行为单位,系统需要通过判断行的结束,该结束通常都是一个符号:分号“;”
定义内容:
$a=5;
echo 'hello world';
<?php
//语句结束符的使用
echo 'hello word';
echo 'hello word'
?>
特殊说明:
1、php中结束符"?>"有自带分割功能
2、“?>”后的代码会按照html代码执行
4、变量
php是动态网站开发的脚本语言,语言特点是用户与服务的交互,即有数据的传递,PHP作为中间人,需要进行数据的传递,传递的前提是PHP能自己临时存储。
1、变量的基本概念
变量是计算机语言中能存储计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的。
变量是用来存储数据的
变量是有名字的
变量可以通过名字来访问的:数据;
变量是可以改变的:数据。
2、变量的使用
php中所有变量都要使用“$”符号
定义:在系统中增加对应的变量名字(内存)
//定义变量:在php中不需要任何关键字定义变量(赋值)
$var1; //定义变量
$var2 = 1; //定义变量同时赋值
赋值:可以将数据赋值给变量名(可以在定义的同时完成)
使用:可以通过变量名访问存储的数据
//访问变量
echo $var2; //通过var2变量名字找到存储的内容1,然后输出。
//修改变量
$var2=2;
echo '<hr/>',$var2; //通过var2变量名字找到存储的内容1,然后输出。
删除:可以将变量从内存中删除
//删除变量:使用unset(变量名字)
unset($var2);
echo $var2;
3、变量名规则
在php中变量名字必须以“$”符号开始;
名字有字母、数字,下划线组成,但不能以数字开头;
不建议名字里面有中文
//变量命名规则
$var_1; $var_var_1;$_var1; //正确格式
$1var; //错误
//中文变量
$中国=‘China’;
4、预定义变量
预定义变量:提前定义的变量,系统定义的变量,存储许多需要用到的数据。(预定义变量都是数组)
$_GET $_POST $_REQUEST $_GLOBLES $_SERVER $_SESSION $_COOKIE
5、可变变量
可变变量:如果
<?php
$a='b';
$b='bb';
echo $$b; //打印出来是 bb
?>
6、变量传值
将一个变量赋给另一个变量:变量传输
变量传值一共有两种方式:值传递,引用传值
值传递:将变量保存的值赋值一份,然后将新的值给另一个变量保存(两个变量没有关系)
引用传递:将变量保存的值所在的内存地址,传递给另一个变量,两个变量指向同一个内存空间。(两个变量是同一个值)
$新变量=&$旧变量
<?php
//PHP变量传值
//值传递
$a=10;
$b=$a;
$b=5;
echo $a,$b,'<br/>';
//引用传递
$c=10;
$d=&$c;
$c=5;
echo $c,$d,'<br/>';
结果为
105
55
内存中的分区:
栈区:程序可以操作的内存部分(不存数据,运行程序)。少,但是快。
代码区:存储程序的内存部分(不执行)。
数据区:存储普通数据(全局区和静态区)。
堆区:存储复杂数据。大,但是效率低。
7、静态变量
静态变量:static,是在函数内部定义的变量,使用static关键字,通常定义的时候直接赋值。
静态变量的原理:系统在进行编译的时候就会对static这一行进行初始化:为静态变量赋值。函数在调用的时候会自动跳过static这一行。
<?php
//静态变量
//定义函数
function display(){
//定义变量
$local = 1;
//定义静态变量
static $count = 1;
echo $local++,$count++,'<br/>';
}
//调用
display();
display();
display();
结果为:
11
12
13
静态变量的使用:
(1)为了统计:当前函数被调用的次数。
(2)为了统筹函数多次调用得到的不同结果。
5、常量
常量定义了通常不可改变。在PHP中常量有两种形式:
1、使用定义常量的函数:define(‘常量名’,常量值);
2、5.3之后才有的:const 常量名=值;
常量命名通常大写,不用$符号,名字有字母、数字,下划线组成,但不能以数字开头。定义常量通常不区分大小写。常量的使用与变量一样。针对特殊符号的常量,需要用constant函数来访问。
说明:数据会变化的使用变量,数据不变的,通常也是使用变量,数据不允许被改变的一定用常量。
系统常量:PHP_VERSION;
PHP_INT_SIZE;
PHP_INT_MAX;
特殊常量:由双下划线开始+常量名+双下划线,称之为魔术常量,其值通常会随环境变化,用户不能改变。如__DIR__
, __FILE__
<?
//PHP常量
//使用函数定义常量:define
define('PI',3.14);
//使用const关键字定义
const PII = 3;
//定义特殊符号
define('-_-','smile') //正确
const -_-='smile' //错误
//使用常量
echo PI;
//echo -_-; 特殊符号不能直接使用
echo constant('-_-');
结果:3.14smile
echo "<hr/>",PHP_VERSION,"<hr/>",PHP_INT_SIZE,"<hr/>",PHP_INT_MAX;
echo '<hr/>';
echo __DIR__,'br/',__FILE__,'<br/>',__LINE__,'<br/>';
echo __LINE__;
结果:3.14smile
6、数据类型
1、介绍
(1)PHP变量本身没有类型,存储的值有类型。三大类,八种数据类型:
简单(基本)数据类型:4小类。
整型:int/integer. 四个字节
浮点型:float/double .八个字节,小数或整型存不下的整数
字符型:string,系统根据实际长度分配。(有引号)
布尔类型:bool/boolean
复合数据类型:2小类
对象类型:object
数组类型:array,存储多个数据
特殊数据类型:
资源类型:resource
空类型:NULL
(2)类型转换:两种方式,自动转换(系统自己判断,效率低)和强制转换(变量之前增加一个括 号,在里面写对应的类型,null类型用到unset())。
其他类型转字符串类型说明:
布尔true为1,false为0;
字符串数值有自己的规则:以字母开头的字符串永远为0;以数字开头的字符串,取到碰到字 符串为止(不会包含两个小数点)。
<?php
//数据类型
//创建数据
$a = 'abc1.11';
$b = '1.1.1.1';
//自动转换
echo $a+$b; //算数+运算,系统先转换成数值类型(整数和浮点型),然后运算。
//强制转换
echo '<br/>',(float)$a,(float)$b;
结果为:
1.1
01.1
(3)类型判断
通过一组类型判断函数来判断。如is_XXX(变量名),返回布尔型。bool类型不能用echo查看 ,可以用var_dump结构查看。 var_dump(变量1,变量2…)
//判断数据类型
echo "<hr/>";
var_dump(is_int($a));
var_dump(is_string($a));
还有一组数据可以获取或设定数据类型;
Gettype(变量名):获取类型,得到的是该类型对应的字符串。
Settype(变量名,类型):设定数据类型,与强制转换(强制转换完后不改变类型)不同。
echo "<hr/>";
echo gettype($a),'<br/>'; //string
//设置类型
var_dump(settype($b, 'int'));
echo gettype($b),$b;
结果为:
string
bool(true) integer1
2、整型
四个字节,最大32位。最大42亿多。
四种定义方式:
<?php
//简单数据类型:整型、浮点型和布尔型
//定义四种整型数据
$a1 = 110;
$a2 = 0b110;
$a3 = 0110;
$a4 = 0x110;
echo $a1,'~',$a2,'~',$a3,'~',$a4,'<hr/>'; //默认输出10进制
结果为:
110~6~72~272
利用函数进制转换:
var_dump(decbin(10));
3、浮点型
小数类型及超过32位的整型,精确度在15个有效数字。
//浮点型
$f1 = 1.23;
$f2 = 1.23e10;
$f3=PHP_INT_MAX +1;//整型超过最大长度,用浮点型存储。
var_dump($f1,$f2,$f3);
//浮点型判断
$f4 = 0.7;
$f5 = 2.1;
$f6 = $f5/3;
var_dump($f4 == $f6) //false 精确度原因
结果为:
float(1.23) float(12300000000) float() bool(false)
4、布尔型
//布尔型
$b1 = true ;
$b2 = false;
var_dump($ba,$b2);
//结果为: bool(true)bool(false)
7、运算符
赋值运算符:=,从右往左的运算
算数运算符:+ - * / %
比较运算符:
> < ==(值相同) >= <= !=
===(左边与右边相同:大小以及数据 类型都相同)
!==(只有大小或类型不同)
<?php
//比较运算符
$a = '123'; //字符串
$b = 123; //整型
//判断相等 值相同
var_dump($a == $b);
//判断全等,大小和类型
var_dump($a === $b );
结果为:
bool(true) bool(false)
逻辑运算符: && || !
**连接运算符 :**将多个字符串进行拼接。
“.” 将两个字符串拼接起来
".= "
//连接运算符
$a = 'hello';
$b = 123;
echo $a . $b; //将a,b变量连接起来
$a .= $b ; //$a = $a .$b;
echo $a;
结果为:hello123hello123
错误抑制符
有可能会错误 ,使用@(php代码) 错误不会报给用户
//错误抑制符
echo '<hr/>';
$a = 10;
$b = 0;
$a % $b; //报错
@($a % $b); //不报错
三目运算符
表达式1 ? 表达式2 : 表达式3
自操作运算符: ++ –
计算机码 : 反码和补码都是针对负数
位运算符: & | ^ (按位异或) ~(非) <<(按位左移,整个位向左移动一位,右边补0) >>(按位右移,左边补符号位对应内容)
//注意:
(1)系统进行任何位运算的时候都是补码,结果必须转换成原码才是最终显示的。
(2)取反的时候符号位不变,取补的时候不考虑符号位。
(3)按位左移:乘以2的操作。
按位右移:除以2 的操作(不完全正确):可能会出现小数。
<?php
// 计算机码
$a = 5;
$b = -5;
/*
5原码: 00000101
-5原码: 10000101
取反: 11111010 //反码:符号位不变,其他位取反
补码: 11111011 //补码:反码+1
*/
//按位左移
var_dump($b>>1);
var_dump($b>>2);
/*
-5 11111011
>>1 11111110 //运算结果 :补码
+ 1 11111101 //反码
取反 10000010
*/
//按位非
var_dump(~$b);
/*
-5 11111011 补码
取反 00000100
原码 00000100
*/
//按位与
var_dump($a & $b);
/*
取出系统存储的结果(补码)进行操作
5 00000101
-5 11111011
& 00000001 //最终结果
转换: 判断符号位,0表正数(原码),1表负数(补码)
*/
结果为:
int(-3) int(-2) int(4) int(1)
运算符优先级:
7、流程控制
顺序结构
分支结构
if分支:与c语言一样(elseif(没有空格))
switch分支
循环结构
for
while
do-while
foreach(数组)
**循环控制:**continue break。循环嵌套时,可在其后加参数: continue 2 表示当前自己循环体后部的代码不再执行,同时外部循环如果还有代码也不 执行。 break 2 表示当前自己循环介绍后,同时外部也结束(如果还有外部不受影响)。
流程控制替代语法(分支和循环),需要与html语法结合。
左大括号{使用冒号替代,
右大括号}使用end+对应的实际标记替代。
if: if(): endif;
switch: switch(): endswitch;
for: for(): endfor;
while: while(): endwhile;
foreach:
打印九九乘法表,php 与 html结合:
<table border = 1>
<?php for($i=1;$i<10;$i++){?>
<tr>
<?php for($j=1;$j<=$i;$j++){?>
<td>
<?php
echo $j.'*'.$i.'='.$i*$j;
?>
</td>
<?php } ?>
<tr>
<?php } ?>
</table>
在PHP中书写到HTML中的这些大括号{}非常不美观,所以PHP提供了一种替代机制,让其可以不用书写大括号。
for(;;){ ==>for(;;):
} ==>endfor;
<table border = 1>
<?php for($i=1;$i<10;$i++):?>
<tr>
<?php for($j=1;$j<=$i;$j++):?>
<td>
<?php
echo $j.'*'.$i.'='.$i*$j;
?>
</td>
<?php endfor; ?>
<tr>
<?php endfor; ?>
</table>
8、文件
文件包含:在一个php脚本中,去将另外一个文件(PHP)包含进来,去合作完成一件事。
向上包含(索要)
向下包含(给予)
四种形式
(1)include:包含文件。
(2)include_once:系统自动识别文件包含过程中,是否已经包含过(一个文件最多被包含一次)
include和include_once的区别:
include 系统碰到一次,执行一次;
Include_once 系统碰到多次只会执行一次。
(3)require: 与include相同
(4)require_once: 与include_once相同
包含基本语法
include ‘文件名字’;
include(‘文件名字’); //文件名字:路径问题
向上包含:
include1.php
<?php
//被包含文件
//定义数据
$a = 1;
define('PI',3.14);
include2.php
<?php
//包含文件,使用数据
//包含文件
include 'include1.php'; //与include.2php在一个目录下。
echo $a, PI;
向下包含:
include3.php
<?php
//定义数据
$a = 10;
const PI = 3.14;
//包含文件:为了显示以上数据
include_once('include4.php');
include4.php
<table>
<tr>
<td><?php echo $a;?></td>
<td><?php echo PI;?></td>
</tr>
</table>
结果为:
10 3.14
文件加载原理
include和require区别:
本质都是包含文件,唯一区别在于包含找不到文件时,报错形式不一样。
include要求低,包含出错只要不影响后面的代码 ,后面代码会执行。
require要求较高,如果包含出错代码不再执行(require后面的代码)。
**文件加载路径问题:**绝对路径和相对路径。
//相对路径加载
//include_once 'include1.php'; //默认当前文件所在目录
//include_once './include1.php'; //. 或./ 都表示当前目录
//include_once '../phpcode/include1.php';
//绝对路径
include_once 'E:/procedure/phpstudy/WWW/phpcode/include1.php';
echo $a;
文件嵌套包含:
一个文件包含另一个文件,被包含的文件又包含第三个文件。
<?php
//文件嵌套包含
//包含include3.php //文件本身包含了include4.php
include 'include3.php';
结果为:
10 3.14
嵌套包含时很可能会出现相对路径出错。相对路径 . 或./ 可能或出现问题。
9、函数
9.1、函数概念
函数的几个几个对应的关键点:function 关键字、函数名、参数(形参和实参)、函数体和返回值。
基本语法如下:
function 函数名([参数]){
//函数体
//返回值:return 结果
}
定义函数目的:重复利用。一个功能一个函数(简单明了)。
函数的调用:定义函数时有形参,使用函数时就必须传入实参。
函数的真正调用是在执行的时候,不是在编译的时候。函数的调用可以在函数定义之前。
函数执行的内存分析:
1、读取代码进入到代码段(编译:将代码编成字节码存储到内存)
2、根据代码逐行执行。
<?php
//函数
//定义函数
function display(){
//函数体
echo 'hello world'; //没有返回值
//调用函数
display();
}
函数命名规则:由字母、数字和下划线组成,但是不能以数字开头。通常名字代码函数功能。
1、驼峰法:除了左边第一个单词外,后面的单词首字母都大写:showParent()
2、下划线法:单词都小写,单词直接都用下划线连接:show_parent_info()
一个周期中,不允许出现同名函数。通常一个系统开发中,都不会出现同名函数。
9.2、参数详解
形参(定义时使用)和实参(调用时使用)。
<?php
//函数参数
//定义函数
function add($arg1,$arg2){ //形参之间用逗号隔开
//函数体:可以直接使用形参
echo $arg1+$arg2;
}
//调用函数
$a = 1;
add($a,10);
结果为:11
php中,允许实参个数多于形参,个数没有限制,允许设置默认值。默认值如果存在,可以不传入参数。默认值的定义放在最后面(多个)。
函数和形参名字可以一样。
形参和实参之间默认是值传递,即形参和实参有着不同的两个地址,值相同。若想使用引用传递,需在形参变量前加&.
//定义变量
$a = 10;
$b = 5;
function display($a,&$b)
{
$a = $a * $a;
$b = $b * $b;
echo $a,'<br/>',$b;
}
//display($a,5); //错误,只有变量能够引用传递
display($a,$b);
echo '<hr/>',$a,'<br/>',$b;
结果为:
100
25
10
25
return 语句可以终结函数或脚本(函数外面)。
返回值:PHP所有函数都有返回值,没有return时,默认NULL.
function display($a=0,&$b=0)
{
//echo $a,'<br/>',$b;
echo __FUNCTION__;
}
var_dump(display());
结果为:
displayNULL
包含有return 语句的文件: $res = include_once ‘function3.php’;
9.3、作用域
作用域:变量可以直接访问的区域
PHP中作用域分为三种:
全局变量:函数外部(周期为脚本周期)所属全局空间,理论上函数中不能使用。
局部变量:函数内部(周期为函数周期)所属函数,函数内使用。
超全局变量:系统定义的变量(预定义变量:$ _SERVER、$_POST)任何地方都可以使用,没有访问限制。
如果想函数内部使用外部变量:可以通过值传值或引用传值。
另一种方式实现全局访问局部,局部访问全局:global关键字。global是一种在函数里面定UI变量的一种方式。
(1)如果使用global定义的变量名在外部存在(全局变量),那么系统在函数内部定义的变量直接执行外部全局变量所指向的内存空间(同一变量,不同名字)
(2)如果使用global定义的变量名在外部不存在(全局变量),则系统会自动在全局创建一个名字相同的变量。两个变量的地址相同,名字不同。
(全局和局部占用同一内存空间)
基本语法:
global 变量名; //不能赋值
变量名 = 值; //修改
以上方式可以实现全局和局部的互访,但一般不那么做,一般用参数传参,或者是使用常量define定义。
9.3、可变函数
当前有一个变量所保存的值,刚好是一个函数名,就可以使用变量名+()来调用函数。
<?php
//php可变函数
//定义函数
function display()
{
echo __LINE__,__FUNCTION__;
}
//定义变量
$func='display';
$func();
结果为:
7display
可变函数在系统使用的过程中很多,尤其是使用很多系统函数的时候,需要用户在外部定义一个自定义函数,但是需要传入到系统函数内部使用。将一个用户自定义的函数定义传入的另一个函数(函数名)去使用的过程,称之为回调过程,被传入的函数称之为回调函数。
//定义系统函数(假设)
function sys_function($arg1,$arg2){
//给指定的函数(第一个参数),求对应的第二个参数值的4次方。
//为实际用户输入的数值进行处理
$arg2 = $arg2 + 10;
return $arg1($arg2);
}
//定义一个用户函数:求一个四次方
function user_function($num){
return $num * $num * $num * $num;
}
//求10的4次方
echo sys_function('user_function',10);
结果为:160000
9.4、匿名函数
没有名字的函数:
基本语法: function();
<?php
//匿名函数
//定义基本匿名函数
$func = function(){
//函数体
echo 'hello world';
};
$func();
//查看变量内容
var_dump($func);
结果为:
hello worldobject(Closure)#1 (0) { }
闭包:
//闭包函数
function display1(){
//定义变量:局部变量
$name = __FUCTION__;
//定义匿名函数
$innerfunction = funcion() use($name){
//就是外部变量保留给内部使用(闭包)
//函数内部的函数
echo $name;
};
//返回内部匿名函数
return $innerfunction;
}
$closure = display1();
//上一行代码结束后,理论上局部变量$name应该已经释放。
$closure();
//当前局部变量$name 在display1()运行结束后,name没有被释放,
//从而外部调用内部匿名函数的时候可以被使用
结果为:display1
伪类型:php不存在的类型
两种(三大类八小类之外的)
mixed:混合的,可以是多种php中的数据类型
number:数值的,可以使任意数值类型(整型和浮点型)
9.5、常用系统函数
(1)有关输出的函数
print() :类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不使用括号。
print_r():类似于var_dump.但是比var_dump简单,不输出类型,只输出值(通常用于数组打印)。
<?php
//系统函数
//输出相关
echo print("hello world <br/>");
print("<br/>hello world<br/>");
$a = 'hello world<br/>';
print_r($a);
结果为:
hello world
1
hello world
hello world
(2)时间相关
data():按照指定格式对应时间戳(1970年开始计算),如果没有指定特定的时间戳,就默认解释当前时间戳。
time():获取当前时间对应的时间戳。
microtime():获取微秒级别的时间。
strtotime():
//时间函数
echo date('Y 年 m 月 d 日 H:i:s',12345678),'<br/>';
echo time(),'<br/>';
echo microtime(),'<br/>';
echo strtotime('tommprrow 10 hours');
结果为:
1970 年 05 月 24 日 05:21:18
1585232707
0.61280800 1585232707
(3)数学相关
max()
min()
rand():得到一个指定区间的随机整数
mt_rand():与rand()一样,但效率更高,推荐使用
round():四舍五入
ceil():向上取整
floor():向下取整
pow():求指定数字的指定的指数次结果
abs():绝对值
aqrt():求平方根
(4)有关函数的函数
function_exists():判断函数是否存在
func_get_arg():在自定义函数中去获取指定数值对应的参数
func_get_args():获取自定义函数中所有的参数
func_num_args():获取当前自定义函数的参数个数
(后三个都是指实参)
//函数相关函数
function test($a, $b){
//获取指定参数
var_dump(func_get_arg(1));
//获取所有参数
var_dump(func_get_args());
//获取参数数量
var_dump(func_num_args());
}
//调用函数
function_exists('test') && test(1,'2',3,4);
结果为:
string(1) "2"
array(4) {
[0]=>
int(1)
[1]=>
string(1) "2"
[2]=>
int(3)
[3]=>
int(4)
}
int(4)
10、错误处理
错误分类:
语法错误:用户书写的代码出错,编译不通过,不执行。(passerror)
运行时错误:代码编译通过,但是代码在执行的过程中出错(runtime error)
逻辑错误:程序员写的代码不够规范,出现了一些错误,但能执行,得不得想要的效果。
所有看到的错误代码在PHP中都被定义成了常量(可以直接使用)
人为触发错误使用trigger_error(‘提示内容’)
<?php
<?php
//PHP错误处理
//处理脚本让浏览器安装指定的字符集解析的方法
header('Content-type:text/html;charset=utf-8');
//人为触发错误
$a = 8;
$b = 0;
if($b ==0){
//人为错误触发
trigger_error('除数不能为0!'); //默认notice,会继续执行
trigger_error('除数不能为0!',E_USER_ERROR); //默认error,代码不会执行
}
echo $a/ $b;
echo 'hello world';
结果为:
Notice: 除数不能为0! in E:\procedure\phpstudy\WWW\phpcode\error.php on line 14
Warning: Division by zero in E:\procedure\phpstudy\WWW\phpcode\error.php on line 18
错误显示设置:
1)直接在配置文件中修改
2)可以在运行的PHP脚本中设置,比直接在配置文件中修改的级别高
Error_reporting(): 设置对应的错误显示级别
ini_set(‘配置文件中的配置项’,配置值)
如:
ini_set('error_reporting',E_ALL);
ini_set('display_errors',1);
自定义错误处理
最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错。
php系统提供了一种用户处理机制:用户自定义错误处理函数,然后将该函数增加到系统错误处理的句柄中,然后系统碰到错误之后,使用用户自定义的错误函数。
如何将用户自定义的函数放到系统中?set_error_handler()
(1)写函数
(2)注册
<?php
//自定义函数
/*
@paraml $errno,是系统提供的错误代码:E_ALL,E_NOTICE..
*/
function my_error($errno,$errstr,$errorfile,$errorline){
if(!(error_reporting() & $errno)){
return false;
//error_reporting 没有参数代表获取当前系统处理对应的级别
}
//开始判断错误类型
switch($errno){
case E_ERROR:
case E_USER_ERROR:
echo '.....'
case E_WARNING:
case E_USER_WARNING::
echo '.....'
}
}
//报错
echo $a;
//修改错误机制
set_error_handler('my_error');
echo $a;
11、字符串
(1)字符串的定义:单引号,双引号,nowdoc字符串(没有单引号的单引号字符串),heredoc字符串(没有双引号的双引号字符串)。
nowdoc字符串:
$str = <<<‘边界符’
字符串内容
边界符
heredoc字符串:
$str = <<<边界符
字符串内容
边界符
上边界符后不能加任何东西,包括注释,下边界符要顶格,也不能加任何东西,只加;。
string(10) "hellohello"
string(33) " HELLO word HELLO word"<?php
//PHP字符串:定义
//引号定义
$str1 = 'hello';
$str2 = "hello";
var_dump($str1.$str2);
//结构化定义
//heredoc结构
$str3 = <<<EOD
HELLO
EOD;
//nowdoc结构
$str4 = <<<'EOD'
HELLO
EOD;
//EOD要顶格写
echo '<hr/>';
var_dump($str3.$str4);
结果为:
string(10) "hellohello"
string(33) " HELLO word HELLO word"
查看网页源码:
string(10) "hellohello"
string(33) " HELLO
word HELLO
word"
(2)字符串的转义。
PHP系统常用的转义符号
\'
\"
\r
\t
\n
\$
单引号和双引号的区别:
1)单引号能识别’,而双引号不能识别’
//定义字符串识别转义符号
$str1 = 'abc\r\ndef\t\'\"\$fg';
$str2 = "abc\r\ndef\t\'\"\$fg";
echo $str1,'<br/>',$str2;
网页源码:
abc\r\ndef\t'\"\$fg
abc
def \'"$fg
2) 单引号不能识别$ 定义变量的符号,双引号可以识别(但应保证变量独立性,一般用大括号将$与变量名扩起来)。
$a = 'hello';
$str1= 'abc $a def';
$str2 = "abc $a def";
echo $str1,'<br/>',$str2;
结果为:
abc $a def
abc hello def
(3)字符串长度问题
strlen()函数:strlen(变量)。一个中文字符在utf-8下占3个字节。
mb_strlen()函数:
mbstring 扩展针对的是一些关于字符统计
strlen只针对标准交换码ASCALL,mbstrlen针对不同字符集。
//定义字符串
$str1 = 'asdffghhh';
$str2 = '你好中国123';
echo strlen($str1),'<br/>',strlen($str2);
echo '<hr/>';
//使用mb_string扩展
echo mb_strlen($str1),'<br/>',mb_strlen($str2),'<br/>',mb_strlen($str2,'utf-8');
结果为:
9
5
9
15
7
(4)字符串相关函数
转换函数:
implode(连接方式,目标数组):将数组中的个元素通过某种规则变成字符串;
explode(分割字符,目标字符串):将字符串按某个格式分割;
str_split(字符串,字符长度):按照指定长度拆分字符串得到数组。
截取函数:
trim(字符串[,指定字符]):默认去除左右两边空格;
ltrim:去除左边指定内容;
rtrim:去除右边指定内容;
substr(字符串,起始位置,end位置):取出起始位置到结束位置的字符串;
strstr(字符串,匹配字符):取出指定位置(匹配字符首次出现位置)到字符串结束的字符串。
<?php
//字符串函数
$str = ' abc e f ';
//字符串截取
echo substr($str, 1,3),'</br>';
echo strstr($str,'c');
结果为:
abc
c e f
大小写函数:
strtoupper():全部大写
strtolower():全部小写
ucfirst():首字母大写
查找函数:
strpos():判断字符在目标字符串中出现的位置(首次);
strrpos():判断字符在目标字符串中最后出现的位置。
替换函数:
str_replace(匹配目标,替换内容,字符串本身):将目标字符串中某个字符串全部替换成另一个字符串。
格式化函数:
printf/sprintf(输出字符串占位符,顺序占位内容):格式化输出数据。和C语言一样。
其他函数:
str_repeat(字符串,重复次数):重复字符串。
str_shffle(字符串):打乱字符串。
12、数组
数组定义:
(1)使用array关键字:最常用
$变量 = array(元素1,元素2,元素3…)
(2)可以使用中括号包裹数据
$变量 = [元素1,元素2…]
(3)隐形定义数组:给变量加一个中括号,系统自动变成数组
$变量[] = 值1; //可以给下标(数字,字母或字符串),如果不提供下标也可以,系统自动从0 开始
<?php
//定义数组:array
$arr1 = array('1',2,'abc');
var_dump($arr1);
echo '<hr/>';
//定义数组,中括号
$arr2 = ['1',2,'abc'];
var_dump($arr2);
echo '<hr/>';
//定义数组:隐藏方法
$arr3[] = 1;
$arr3[10]='987';
$arr3[] =5; //如果不给下标会接着上一个元素的下标 (这里下标为11)
$arr3['key'] = '9jkfsajr';
$arr3[1] = 43;
var_dump($arr3);
echo '<hr/>';
//特殊下标转换
$arr4[false] = false;
$arr4[true] = true;
$arr4[null] = null;
var_dump($arr4);
结果为:
array(3) { [0]=> string(1) "1" [1]=> int(2) [2]=> string(3) "abc" }
array(3) { [0]=> string(1) "1" [1]=> int(2) [2]=> string(3) "abc" }
array(5) { [0]=> int(1) [10]=> string(3) "987" [11]=> int(5) ["key"]=> string(8) "9jkfsajr" [1]=> int(43) }
array(3) { [0]=> bool(false) [1]=> bool(true) [""]=> NULL }
PHP数组特点
1)可以整数下标或字符串下标
如果都为整数:索引数组
如果都为字符串:关联数组
2)数组元素的顺序以放入的顺序为准,系统不会改变
3)不同下标可以混合存在:混合数组
4)数字下标的自增特性:从0 开始自动增长,若中间手动出现大的,则后一个的下标是前一个下标加1.
5)特殊值下标的自动转换
6)PHP中数组元素没有类型限制,长度也没有限制。
PHP中的数组是很大的数据,存在于堆区,一块连续的内存。
** 多维数组**
二维数组:数组中所有的元素都是以为数组。
<?php
//定义二维数组
$info = array(
array('name'=>'tom','age'=>30),
array('name'=>'jim','age'=>28),
array('name'=>'lily','age'=>16),
//最后一个元素后可以接逗号,不影响。
);
echo '<pre>';
print_r($info);
结果为:
Array
(
[0] => Array
(
[name] => tom
[age] => 30
)
[1] => Array
(
[name] => jim
[age] => 28
)
[2] => Array
(
[name] => lily
[age] => 16
)
)
多维数组:第二维的数组中的元素也是数组,PHP中没有维数限制,但一般使用不超过三维。
异形数组(不规则数组):数组中的元素不规则,有普通基本变量,也有数组,实际开发中不常用。
数组遍历:
依次输出数组的所有元素。
foreach遍历语法:
foreach($ 数组变量 as [$下标 =>] 值 ) ( / / 如 果 是 关 联 数 组 需 要 下 标 / / 通 过 值) (//如果是关联数组需要下标 //通过 值)(//如果是关联数组需要下标//通过下标访问元素的下标,通过$值访问元素的值)
<?php
//PHP数组遍历:foreach
//定义数组
$arr = array(1,2,3,4,5,6,7,8,9,10);
//foreach循环
foreach($arr as $v){
//$v命名随意
echo $v;'<br/>';
}
echo '<hr/>';
//foreach循环
foreach($arr as $k =>$v){
//$v命名随意
echo 'key:',$k,'==value:',$v,'<br/>';
}
结果为:
12345678910
key:0==value:1
key:1==value:2
key:2==value:3
key:3==value:4
key:4==value:5
key:5==value:6
key:6==value:7
key:7==value:8
key:8==value:9
key:9==value:10
在进行数据存储定义的时候,通常二维数组不会两个维度的下标的key字段都为数字,一般是一维为数字(无意义),二维为字符串(数据库的表字段),所以在进行遍历的时候,通常是字需要针对一维进行遍历,取得二维数组元素,然后二维元素通过下标进行访问。
$arr2 = array(
0 => array('name'=>'win','age'=>'21'),
1 => array('name'=>'bright','age'=>'23')
);
foreach($arr2 as $value ){
echo 'name :',$value['name'],' age :',$value['age'],'<hr/>';
}
结果为:
name :win age :21
name :bright age :23
for 循环: 与c语言一样
while 配合each 和list遍历数组
each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到后数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回。
0下标 -》取得元素下标值
1下标-》取得元素的值
key下标-》取得元素的下标值
value下标-》取得元素的值
<?php
//While 循环
$arr = array(1,'name'=>'tom',3,'age'=>30);
while(list($key,$value)=each($arr)){
//list搭配each
//输出
echo 'key is :'.$key.'value is :'.$value.'<hr/>';
}
结果:
key is :0value is :1
key is :namevalue is :tom
key is :1value is :3
key is :agevalue is :30
13、数组相关函数
1)排序函数(acall码)
sort():顺序排序(下标重排)
rsort():逆序排序
asort():顺序排序(下标保留)
arsort():逆序排序(下标保留)
ksort():顺序排序:按键名或下标
krsort():逆序排序
shuffle()打乱数组元素,值打乱,数组下标也会重传
<?php
//排序函数
$arr = array(3,1,5,2,0);
echo '<pre>'
//sort()
$sort_arr = sort($arr); //sort_arr为bool值
print_r($arr);
结果为:
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 5
)
<?php
//排序函数
$arr = array(3,1,5,2,0);
echo '<pre>'
//sort()
$sort_arr = asort($arr); //sort_arr为bool值
print_r($arr);
结果为:
Array
(
[4] => 0
[1] => 1
[3] => 2
[0] => 3
[2] => 5
)
<?php
//排序函数
$arr = array(3,1,5,2,0);
echo '<pre>';
//sort()
$sort_arr = krsort($arr); //sort_arr为bool值
print_r($arr);
结果为:
Array
(
[4] => 0
[3] => 2
[2] => 5
[1] => 1
[0] => 3
)
2)指针函数
reset():重置指针,将数组指针回到首位
end():重置指针,将数组指针移动到最后一个元素
$arr = array(3,1,5,2,0);
//echo current($arr),'<br/>';
//echo key($arr),'<br/>';
echo next($arr),next($arr),'<br/>';
echo prev($arr),'<br/>';
echo end($arr),'<br>';
echo reset($arr),'<br>';
结果为:
15
1
0
3
next():指针下移,取得下一个元素的值
prev():指针上移,取得上一个元素的值
$arr = array(3,1,5,2,0);
echo next($arr),next($arr),'<br/>';
echo prev($arr),'<br/>';
结果为:
15
1
current():获取当前指针对应的元素值
key():获取当前指针对应的下标值
$arr = array(3,1,5,2,0);
echo current($arr),'<br/>';
echo key($arr),'<br/>';
结果为:
3
0
使用next()和prev()函数时可能会跳到数组外面去,这时需要通过end()或reset()函数对指针进行重置。
3)其他函数
count()
array_push(),
array_pop()
array_shif():从数组中取出一个元素(从前面)
array_unshift():从数组中加一个元素(从前面)
array_reverse():将数组元素反过来
in_array():判断一个元素是否存在
array_keys():获取数组的所有下标,返回一个数组
array_values():获取数组的所有元素,返回一个数组
二、mysql数据库
1、数据库概念
数据库是按照数据结构来组织、存储和管理数据的建立在计算存储设备的仓库。
2、数据库的分类
(1)分类:
网络数据库
层次数据库
关系数据库(最重要):是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理的数据库
另一种数据库区分方法:存储介质
关系型数据库:存储在磁盘中
非关系型数据库:存储在内存中
(2)关系模型
关系数据结构:指数据已什么方式存储,是一种二维表的形式
姓名 | 年龄 | 身高 | 体重 |
---|---|---|---|
win | 21 | 186 | 70 |
bright | 23 | 183 | 70 |
关系操作符:如何来管理和关联对应的存储数据,SQL指令
select 年龄 from 表名 where 姓名 = win
关系完整性约束:数据内部有对应的关联关系,以及数据与数据之间也有对应的关系
表内约束:对应的具体列只能放对应的数据(不能乱放)
表间约束:自然间个实体都有着对应的关联关系(外键)
常见关系型数据库:
小型:Microsoft Access SQLite
中型:SQL server Mysql
大型:Oracle DB2
3、SQL结构化查询语言(Structure Query Language)
分类:
(1)数据查询语言(DQL:data query language):select /show
(2)数据操作语言(DML:data manipulation language):insert/updata/delete
(3)事物处理语言(tpl): begin/transction/commit/rolback。用于事物安全处理,不是所有数据库都提供事物安全处理。
(4)数据控制语言(DCL):grant/revoke。用于权限管理。
(5)数据定义语言(DDL):greate/drop
4、MYSQL基本介绍
(1)开源免费,对PHP支持最好,使用SQL语言。C/S结构。
(2)服务器端对应软件:Mysqld.exe
1)提供windows打开cmd控制器,然后使用命令进行管理
net start 服务(mysql):开启服务
net stop mysql:关闭服务
2) 将mysql添加到 服务中。通过服务对mysql进行管理。
(3)登录和退出mysql系统
(4)Mysql服务端架构
5、数据库的基本操作
(1)创建数据库: create database 数据库名 【charset 字符集名称】默认是DBMS
(2)显示数据库:没当用户通过SQL指令创建一个数据库,那么系统就会产出一个相应的文件夹。每个数据库文件夹下都有一个opt文件,保存的是对应的数据库选项。
显示全部:
显示所有数据库show databases;
显示部分:
show databases like ‘匹配模式’
_:匹配当前位置单个字符串
%:匹配指定位置多个字符串
如:获取以my开头的全部数据库: ‘my%’
获取m开头,后面第一个字母不确定,最后为database:‘m_database’
获取以database结尾的数据库:’%database’
(3)选择数据库
基本语法:use 数据库名字
(4)修改数据库
修改数据库字符集:字符集和校对集
基本语法:alter databaase 数据库名字 charset=‘字符集名字’
5.5之前可以用rename命令修改
(5)删除数据库
基本语法:drop database 数据库名字
删除很简单,但是确保里面的数据没有用了,相应的数据库文件夹也会被删除
6、表操作
(1)普通创建表
基本语法:create table 数据库名.表名(字段名 字段类型[字段属性],字段名 字段类型[字段属性]…)[表选项]
表选项:与数据库选项类似
Engine :存储引擎,mysql提供的具体存储数据的方式,默认是innodb.(5.5以前是myisam)
charset:指定字符集。
复制已有的表结构(只复制结构,不复制数据)
基本语法:create table 新表名 like 表名;//只有使用数据库.表名 就可以复制任意数据库的表。
(2)显示数据表
没创建一个表格,数据库文件下就会生成一些与引擎有关的文件,这个结构文件来自innodb存储引擎,innodb存储引擎所有的文件(包括表数据)都存储在外部ibdata文件中。
匹配显示表
基本语法:show tables like ‘匹配模式’
显示表结构:
describe 表名
desc 表名
show columns from 表名
显示表创建语句
基本语法 :show create table 表名
(3)设置表选项
基本语法:alter table student charset 字符集名字;
如果数据库已经确定,里面有很多数据了,不用轻易修改表选项。
(4)修改表结构
例如:修改表名:rename table student to my_student
新增字段:alter table my_student add column age int
默认是增加在表最后。
alter table my_student add column id int first(增加在第一列)
alter table my_student add column id int after age(增加在age字段后)
修改字段名: alter table my_student change age nj int(一定要加列属性)
修改字段类型:alter table my_student modify name varchar(20);
删除字段:alter table my_student drop nj
删除表结构:drop table 表名,[表名](可以同时删除多个表)
7、数据基础操作
(1)插入操作
基本语法:
insert into 表名[(字段列表)] values(对应字段列表)
Insert into 表名 values(对应表结构)
例如:
(2)查询操作
基本语法:
查询表中全部数据:select * from 表名;
查询表中部分字段:select 字段列表 from 表名;(字段直接用逗号隔开)
简单条件查询数据:select 字段列表/* from 表名 where 字段名=值
(3)删除操作
基本语法:delete from 表名 [where 条件];//如果没有where条件系统会删掉所有数据(慎用)
(4)更新操作
将数据进行修改(通常是修改部分字段的值)
基本语法:
update 表名 set 字段名 = 新值(where = 条件)
三、php与数据库
(1)表单传值
GET传值
1)form表单
<form method="GET">表单元素</form>
2)a标签
<a href ="www.itcast.cn/index.php?学科=PHP">
3)location对象的href属性
<script>location.href="www.itcast.cn/index.php?学科=PHP"</script>
4)location对象的assign()方法
<script>location.assgin("www.itcast.cn/index.php?学科=PHP")</script>
PHP接收数据的三种方式:
不管是哪一种方式,三个都是PHP超全局(没有范围限制)预定义数组,表单元素的name“属性的值作为数组的下标,value对应的是下标对应的值。
$_GET方式:接收GET方式提交的数据
$_POST方式:接收POST方式提交的数据
$_REQUEST方式:接收POST或GET提交的所有数据
1) $ _REQUEST所存储数据的内容:将$ __POST 和$ _GET合并并存储在一个数组中
2)$ _REQUEST和$ _POST与$_GET的联系:如果GET和POST中有同名数组元素(小标)POST会覆盖GET(PHP中数组元素下标具有唯一性),可以在php.ini中进行配置。
<?php
//接收数据
echo '<pre>';
var_dump($_GET); //GET方式提交的数据
echo '<hr/>';
var_dump($_POST);
echo '<hr/>';
var_dump($_REQUEST);
浏览器中输入:http://localhost/phpcode/recevie_data.php?data=%27php%27
结果为:array(1) {
["data"]=>
string(5) "'php'"
}
array(0) {
}
array(1) {
["data"]=>
string(5) "'php'"
}
post覆盖get
<!DOCTYPE html>
<html>
<head>
<mata charset="utf-8">
<title>form</title>
</head>
<body>
<form method="POST"
action="recevie_data.php?username=getusername">
<input type = "text" name = "username" value="" />
<input type = "password" value=""/>
<input type = "submit" name = "sub" value="submit"/>
</form>
</body>
</html>
结果:
array(1) {
["username"]=>
string(11) "getusername"
}
array(2) {
["username"]=>
string(12) "postusername"
["sub"]=>
string(6) "submit"
}
array(2) {
["username"]=>
string(12) "postusername"
["sub"]=>
string(6) "submit"
}
复选框:在浏览器端,通常将一类内容以同名的形式传递给后台,数据库存储通常是一个字段存储。复选框的特点:选中才会提交。
在浏览器端,checkbox的name属性的值不论什么都会被浏览器毫无保留的提交。在PHP中$ _ POST/$ _GET都会对同名name属性进行覆盖。
解决方案:浏览器不识别【】,但是PHP认为【】有特殊性:系统自动认为该符号是数组的形式,所有PHP就会自动将同名的但带有有【】的元素组合都一起形成一个数组。
单选框(name必须相同):
复选框:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>document</title>
</head>
<body>
<form method="POST" action="recevie03form.php">
<input type="checkbox" name="hobby[]" value="basketball">basketball
<input type="checkbox" name="hobby[]" value="football">football
<input type="checkbox" name="hobby[]" value="pingpong">pingpong
<input type="radio" name="gender" value="1" checked="checked"/>男
<imput type="radio" name="gender" value="2" />女
<input type="submit" name="bnt" value="提交" />
</form>
</body>
</html>
PHP:
<?php
header('Content-type:text/html; charset=utf-8');
$hobby =isset( $_POST['hobby'];) ? $_POST['hobby']:array();
//print_r($hobby)
//将数组转换成有格式的字符串
//$hobby_string=implode($hobby, '|');
echo $hobby_string;
//假设$hobby_string是从数据库里面取出来的字段
var_dump(explode('|',$hobby_string));
?>
结果为:
basketball|football|pingpong
array(3) { [0]=> string(10) "basketball" [1]=> string(8) "football" [2]=> string(8) "pingpong" }
除了radio button单选框和checkbox复选框,其他表单很少出现同名的
(2)文件上传
表单写法
1)method属性:表单提交方式必须为POST
2)enctype属性:form表单属性,主要是规范表单数据的编码方式 //很重要的一个属性
3)上传表单:file表单
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>file_upload</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="file_upload2.php">
<input type="file" name="image" />
<input type="submit" name="bnt" value="上传文件" />
</form>
</body>
</html>
接收上传的文件:
<?php
//检查文件
header('Content-type:text/html;charset=utf-8');
echo '<pre>';
var_dump($—_POST);
var_dump($_FILES);
?>
结果为:
array(1) {
["bnt"]=>
string(12) "上传文件"
}
array(1) {
["image"]=> //表单name属性的值
array(5) {
["name"]=> //文件在浏览器端实际存在的名字
string(36) "006xtV3Lly1gddcz3mwayj315o2bbb29.jpg"
["type"]=> //MIME类型,用于客户端识别文件类型
string(10) "image/jpeg"
["tmp_name"]=>
string(22) "C:\Windows\php2D17.tmp"//临时文件的路径
["error"]=> //文件上传的代号(告知文件上传过程中有没有出现问题)
int(0)
["size"]=>
int(105988)
}
}
移到临时文件到目标位置:
文件上传之后会保存到 F I L E S 中 , 那 么 访 问 文 件 的 形 式 就 是 _FILES中,那么访问文件的形式就是 FILES中,那么访问文件的形式就是 _FILES [’ 表单name属性的值’][‘元素信息’]
1)判断是否为上传的文件:is_upload_file()
- 移到文件:move_upload_file()
<?php
//检查文件
header('Content-type:text/html;charset=utf-8');
//1、取得文件信息
$file = $_FILES['image'];
//2、判断是否是上传文件(判断的是临时文件)
if(is_uploaded_file($file['tmp_name']))
{
//是上传文件
if(move_uploaded_file($file['tmp_name'], 'uploads/'.$file['name']))
{
echo '文件保存成功';
}else
{
echo '文件保存失败';
}
}
else
{
//不是上传文件
echo '文件上传失败!';
}
?>
多文件上传:
当一些商品需要上传多个图片的时候,当商品需要进行多个维度图片说明的时候,需要使用多文件。
1)针对一个内容但是不同文件说明,同名表单
<body>
<form method="POST" enctype="multipart/form-data" action="file_uploadmulti2.php">
<input type="file" name="image[]" />
<input type="file" name="image[]" />
<input type="file" name="image[]" />
<input type="submit" name="bnt" value="批量上传" />
</form>
</body>
2)当商品需要进行多个维度图片说明的时候:需要使用文件上传,针对的是不同内容所以表单名字不一样:批量解决问题。
<body>
<form method="POST" enctype="multipart/form-data" action="file_uploadmulti2.php">
<input type="file" name="head" />
<input type="file" name="body" />
<input type="file" name="foot" />
<input type="submit" name="bnt" value="批量上传" />
</form>
</body>
多文件上传的$_FILES变量的数据结构形式
<?php
header('Content-type:text/html charset=utf-8');
echo '<pre>';
//查看不同情形下的多文件上传结构
print_r($_FILES);
?>
批量上传:同名表单,将表单名字形成一个数组,而且同时将文件对应的五个元素:name tmp_name,size,type,error都形成对应数量的数组。每个文件上传对应数组元素下标都是一眼的:name[0]和tmp_name[0]对应的图片一样。
想办法得到一个文件对应的五个元素组。$_FILES中把对应的nme\tmp_name\size\error\type挨个取出来,然后存放到不同的数组中。
if(isset($_FILES['image']['name']) && is_array($_FILES['image']['name'])){
//遍历构造数组元素
$images=array();
foreach($_FILES['image']['name'] as $k => $file){
$images[]=array(
'name' => $file,
'tmp_name' => $_FILES['image']['tmp_name'][$k],
'type' => $_FILES['image']['type'][$k],
'error' => $_FILES['image']['error'][$k],
'size' => $_FILES['image']['size'][$k]
);
}
}
批量上传:不同名表单,每个文件都会形成一个属于自己独立的5个元素的数组。
对多文件信息的遍历读取和处理(不同名)
<?php
header('Content-type:text/html;charset=utf-8');
echo '<pre>';
//查看不同情形下的多文件上传结构
print_r($_FILES);
//不同名文件遍历处理方式
foreach($_FILES as $file){
//每一个$file就是一个完整的上传文件信息:找到临时路径,指定存储路径
if(is_uploaded_file($file['tmp_name'])){
//存储
if(move_uploaded_file($file['tmp_name'], 'uploads/'.$file['name'])){
echo "保存文件成功";
echo "<hr/>";
}
}
}
?>
文件上传后续问题
1)封装出一个上传函数
<?php
//PHP文件上传功能封装函数
/*
* 实现文件上传(单)
* @param array $file,需要上传的文件信息:一维5元素数组
* @param1 array $array_type,允许上传的MIME类型
* @param2 string $path,存储路径
* @param3 string &$error,如果出现错误的原因
* @param4 array $allow_format = array(),允许上传的文件格式
* @param5 int $max_size = 2000000,允许上传的最大值
*/
function upload_single($file,$allow_type,$path,$error,$allow_format=array(),$max_size=2000000){
}
?>
2)判断文件是否有效
function upload_single($file,$allow_type,$path,$error,$allow_format=array(),$max_size=2000000){
if(!is_array($file) || !isset($file['error'])){
//文件无效
$error ='不是一个有效的上传文件';
return false;
}
}
**3)判断保存路径是否有效
if(!is_dir($path)){
//路径不存在
$error = '文件存储路径不存在!';
return false;
}
4)判断文件本身上传过程中是否有错
//判断文件上传过程中是否有效
switch($file['error'])
{
case 1:
case 2:
$error ='文件超出服务器允许大小';
return false;
case 3:
$error ='文件上传过程中出现问题';
return false;
case 4:
$error = '用户没有选择要上传的文件';
return false;
case 6:
case 7:
$error = '文件保存失败';
return false;
}
5)判断MIME类型
//判断MIME类型
if(!in_array($file['type'],allow_type)){
//该文件类型不允许
$error = '当前文件类型不允许上传!';
return false;
}
6)文件后缀是否允许
//判断后缀是否允许
//取出后缀
$ext = ltrim(strchr($file['name'],'.'));
if(!empty($allow_format) && !in_array($ext, $allow_format))
{
//不允许上传
$error = '当前文件格式不允许上传!';
return false;
}
6)判断当前文件大小是否满足要求
//判断当前文件大小是否满足当前需求
if($file['size'] > max_size){
//文件过大
$error='当前上传文件超出大小,最大允许为大小为'.max_size.'字节!';
return false;
}
7)移动到指定目录
//构造文件名字:类型_年月日=+随机字符串.$ext
$fullname = strstr($file['type'],'/',TRUE).date('YYYYmmdd');
//产生随机字符串
for($i=0;$i<4;i++){
$fullname .= chr(mt_rand(65,90));
}
$fullname .= '.'.$ext;
//移动到指定目录
if(!is_uploaded_file($file['tmp_name'])){
//文件不是上传的
$error = '错误:不是上传文件';
return false;
}
if(move_uploaded_file($file['tmp_name'], $path.'/'.$fullname))
{
//成功
return $fullname;
}else{
//移动失败
$error ='文件上传失败';
return false;
}
(2)mysql扩展
创建数据库、表:
登录数据库:mysql -uroot -proot
设置字符集:set names gbk;
创建数据库:create database News charset utf8;
选择数据库:use News;
创建表:
create table n_news(
id int primary key auto_increment,
title varchar(50) not null comment '新闻标题',
isTop tinyint not null comment '是否置顶',
content text comment '内容',
publiser varchar(20) not null comment '发布人',
pub_time int not null comment '发布时间'
)charset utf8;
查看表:show tables
;(换行)
连接数据库基本操作:
1)连接数据库
<?php
//PHP操作数据库的基本连接
//建立连接
//1、主机地址:默认是自动连接端口3306
$link = mysql_connect('localhost:3306','root','root');
var_dump($link);
//连接资源默认也是超全局的,任何地方都可以使用资源进行数据库的其他连接
补充:mysql_connect默认对一个服务器只连接一次(如果再运行,返回的是同一个资源),但是需要连接同一个资源两次,需要使用四个参数。
结果为:
resource(3) of type (mysql link)
2)设置字符集
保持客户端与服务器之间的沟通顺畅:同一语言字符集
形式1:mysql_query(“set names XXX”)
形式2:mysql_set_charset(“XXX”)
怎么确定要使用何种编码:当前客户端执行脚本的界面时什么字符集,就设定成什么字符集。
//设置字符集
$res = mysql_query('set names utf8',$link)
var_dump($res);
echo '<hr/>';
$res = mysql_set_charset('utf8');
var_dump($res);
//两种都行
结果为:
bool(true)
bool(true)
3)选定要使用的数据库
形式1:mysql_query(‘use 数据库名’);
形式2:mysql_select_db(数据库名')
4)数据库操作(增删查改)
专门初始化数据库的脚本:之后要操作数据库包含该脚本即可
<?php
//做数据库初始化
header('Content-type:text/html;charset=utf-8');
//连接认证
mysql_connect('localhost:3306','root','root')or die('数据库连接失败');
//设定字符集
mysql_query('set name utf8');
//选择数据库
mysql_query('use News');
执行增删改操作
mysql_query(“insert …”);
<?php
//PHP操作数据库:新增数据
header('Content-type:text/html;charset = utf-8');
//引入初始文件
include_once 'database.php';
//组织SQL指令
$pub_time = time();
$sql ="insert into n_news values(null, 'itcast黑马程序员',1,'黑马程序员好样的','Itcaster',{$pub_time})";
//执行指令
if(mysql_query($sql)){
//操作成功,通常将用户自增长ID给用户
echo "数据插入成功!";
}else{
//操作失败
echo '数据插入失败';
}
mysql_query(“delete …”);
$sql ="delete from n_news where id = 1";
mysql_query(“update …”);
<?php
//PHP操作数据库:新增数据
header('Content-type:text/html;charset = utf-8');
//引入初始文件
include_once 'database.php';
//组织SQL指令
$sql ="update n_news set content ='黑马程序员牛' where id = 1";
//执行指令
if(mysql_query($sql)){
//操作成功,通常将用户自增长ID给用户
echo "数据更新成功!";
}else{
//操作失败
echo '数据更新失败!';
}
判断执行结果:
执行成功,结果返回true ,只代表SQL指令执行成功
执行失败,结果为false ,只代表SQL指令错误或者操作对象不存在。
获取结果集行数
mysql_num_rows():获取结果集中到底有多少行记录
$res = mysql_query($sql) ;
var_dump($res);
上述两行代码结果为FLASE的唯一原因是SQL指令写错。
//获取结果集数据的条数:多少行记录
echo mysql_num_rows($res);
解析结果集:
将一种结果集资源(PHP不能直接使用),转换成一种php能够解析的数据格式,通过从结果集(结果集指针,类似数组指针)按照结果集指针所在位置取出一条对应的记录(一行),返回一个数组,同时指针下移,z直到指针移出结果集。
三种方式:
**mysql_fetch_assoc()😗*获取关联数组,将表单的名字作为数组下标,元素值作为数组元素值。
$sql = "select * from n_news";
//执行查询操作
$res = mysql_query($sql);
var_dump($res);
//获取结果集数据条数:多少行记录
$rows=mysql_num_rows($res);
//解析结果
$row = mysql_fetch_assoc($res);
echo '<pre>';
print_r($row);
mysql_fetch_row()
<?php
//引入初始化操作
include_once 'database.php';
//组织SQL命令
$sql = "select * from n_news";
//执行查询操作
$res = mysql_query($sql);
var_dump($res);
//获取结果集数据条数:多少行记录
$rows=mysql_num_rows($res);
//解析结果
$row = mysql_fetch_assoc($res);
echo '<pre>';
print_r($row);
$row = mysql_fetch_row($res);
mysql_fetch_array()
5)关闭连接
mysql服务器的连接资源是有限的,不用了需要释放,脚本运行完了后会自动释放
手动释放:mysql_close()
//关闭连接
echo '<hr/>';
$res = mysql_close($link);
var_dump($res);
6)其他相关函数
有关字段信息
mysql_num_fields();获取一个指定结果集中所有的字段数
mysql_fiield_name();获取一个指定结果集中指定位置的字段的名字
有关出错信息
mysql_error():获取出错对应的提示信息
mysql_errno():获取错误代码对应的提示代号
错误的判断:基于MySQL_query这个函数的执行结果:结果返回false就代表执行错误
<?php
//PHP-MySQL相关扩展函数
//引入数据库初始化
include_once 'database.php';
//组织查询操作
$sql = "selec * from n_news";
$res = mysql_query($sql);
//错误判定
if(!$res){
//代表结果为false
echo 'SQL指令执行出错,错误编号是:'.mysql_error();
echo 'SQL指令执行出错,错误信息为:'.mysql_errno();
exit();
}
//查询当前结果集中字段数
echo mysql_num_fields($res);
echo '<hr/>';
//查询指定列的字段名字,字段序号从0开始
echo mysql_field_name($res,1);
echo '<hr/>';
结果为:
SQL指令执行出错,错误编号是:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selec * from n_news' at line 1SQL指令执行出错,错误信息为:1064
其他函数
mysql_insert_id():获取上次插入所产生的自增长id,如果没有自增长ID 返回0。
//获取自增长ID
$pub_time = time();
$sql = "insert into n_news values(null,'itcast黑马程序员,都知道',1,'黑马程序员好样的','Itcasterhaoshig',{$pub_time})";
$res = mysql_query($sql);
if(!$res){
//代表结果为false
echo 'SQL指令执行出错,错误编号是:'.mysql_error();
echo 'SQL指令执行出错,错误信息为:'.mysql_errno();
exit();
}
echo mysql_insert_id();
7)应用
q前端form表单
PHP接收前端页面传来的数据
数据验证:合法性验证。标题不能为空,内容不能为空。
显示新闻列表:
获取所有新闻内容并显示
包含显示模板:
删除新闻
处理删除的.php
需要修改表单提交对象
编写一个脚本更新数据库