**2.1 echo **
可以输出字符串,它可以同时输出多个字符串,以,分隔
注意:echo 后面紧跟着一个空格
echo 'hello wrold','
xiaoming';
?>
2.2 print
它也可以输出字符串,它只能输出一个值
print 'hello wrold';
?>
2.3 print_r()
更多的用来输出复杂类型:它可以输出复杂数据的key和值
print_r([1,2,3]);//Array ( [0] => 1 [1] => 2 [2] => 3 )
?>
**2.4 var_dump() **
可以输出复杂类型,它可以输出复杂类型数据的key和value,同时还可以获取value的长度
var_dump(["abc","a","qq"]);//array(3) { [0]=> string(3) "abc" [1]=> string(1) "a" [2]=> string(2) "qq" }
?>
<p> echo 'hello'; ?></p>
if ($age >= 18) { ?>
<p>成年人</p>
} else { ?>
<p>小朋友</p>
} ?>
if(true) {
echo '结果为真';
}
?>
也可以这样
if ($age > 18): ?>
<p>成年人</p>
else: ?>
<p>小朋友</p>
endif ?>
// 这是一条单行注释
# 井号也可以做注释(不要用,有点生僻)
$foo = 'hello';
?>
/*
......
这里可以添加任意行数的注释内容
......
*/
?>
声明变量 :
特点:
1.所有变量的声明必须以$符号做为前缀
2.变量名区分大小写
3…变量名的组成由字符,数字,下划线构成
var age = 20;
类似js中的弱类型,php在声明变量的时候无需关注类型,系统会根据值进行自动的判断
$age = 20; //声明变量并同时赋值
echo $age;
$name = 'jack';
echo $name;
$gender; //相当于变量的声明
// 在php中如果声明变量没有赋值,那么这个值默认为null
// 在php代码的语句最后建议都添加分号,如果不加,除非是最后一行,否则就会报错
echo $gender;
echo 123;
?>
常见的 PHP 数据类型与 JavaScript 基本一致:
数据类型的分类:
判断数据类型:
在php中,+只能运算符,意味着当出现+的时候,系统会自动的将+两边的数据转换为数值
在php中字符串连接符使用.
$name = "jack";
echo '我的名字叫'.$name;
?>
PHP 有多种创建字符串的方式:单引号、双引号等。
$name = "jack";
echo '我的名字叫$name';
echo "我的名字叫{$name}\n我的\"年龄\"是20";
?>
PHP 中数组可以分为两类:
与 JavaScript 中的数组基本一致
// 定义一个索引数组
$arr = array(1, 2, 3, 4, 5);
var_dump($arr);
// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = [1, 2, 3, 4, 5];
var_dump($arr2);
//遍历索引数组--for
// 在php中需要使用count(数组对象)来获取数组的长度
for($i =0;$i < count($arr);$i++){
echo $arr[$i].' ';
}
?>
有点类似于 JavaScript 中的对象
// 注意:键只能是`integer`或者`string`
$arr = array('key1' => 'value1', 'key2' => 'value2');
var_dump($arr);
// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = ['key1' => 'value1', 'key2' => 'value2'];
var_dump($arr2);
$arr = array(
"name" => "jack",
"age" => 20,
"gender" => true
);
// 遍历关联数组 foreach
// foreach(数组对象 as 键 => 值){
// }
// foreach(数组对象 as 值){
// }
foreach($arr as $key => $value){
echo $key .":".$value.'
';
}
// foreach($arr as $value){
// echo $value.'
';
// }
?>
php中的混合数组:综合了索引数组和关联数组的特点,意味着它里面包含索引和关联两种形式
特点:
1.如果添加元素的时候设置key,那么就没有索引
2.如果没有设置key,那么系统自动生成索引
3.下载索引和key不会互相影响。如果没有指定key,那么索引会取到之前的最大的索引下载+1
与数组相关的常用函数
unset():它也可以用来删除数组中的某个成员。但是删除了数组的元素之后,并不会对数组元素的索引产生影响,元素还会保留之前的索引。意味着它只是删除了索引位置的元素,并没有动态的改变数组的长度。
$arr = [1,2,3,4,5];
print_r($arr);
unset($arr[2]);
echo '
';
print_r($arr);
?>
$arr = array( //索引数组
// 描述第一个学生对象的数据
"first" => array( //关联数组--类似于js中的对象
"name" => "jack",
"age" => 20
),
array(
"name" => "rose",
"age" => 18
)
);
print_r($arr);
echo '
';
foreach($arr as $key => $value){
// 二维数组的遍历需要考虑使用嵌套循环
foreach($value as $subkey => $subvalue){
echo $subkey .":".$subvalue ."
";
}
}
?>
$str = '132';
// 将一个内容为数字的字符串强制转换为一个整形的数字
$num = (int)$str;
// 将一个数字强制转换为布尔值
$flag = (bool)$num;
?>
+只能是算术运算符,系统会自动的将+两边的变量转换为数组,如果可以转换,就进行转换,否则返回这个数据类型的默认值 int >0 object > null bool>false float:0.0
在php中字符串连接符使用.
算术运算符: + - * 、 % ++ –
赋值运算符:= += -= *= /=
逻辑运算符:! && ||
比较运算符:> >= < <= == === !=
三元运算符:a>b ? “” : “”
// if($age >= 18):
// echo '你已成年';
// else:
// echo '你未成年';
// endif;
// $score = 25; //A B C D E F
// if($score >= 90):
// echo 'A';
// elseif($score >= 80):
// echo 'B';
// elseif($score >= 70):
// echo 'C';
// elseif($score >= 60):
// echo 'D';
// else:
// echo 'E';
// endif;
?>
在php中函数内部无法使用函数外部的成员
如果一个变量没有赋值或者这个变量不存在,那么转换为int之后的结果默认为0
$num = 100;
function cal(){
// 如果想在函数内部使用函数外部声明的全局变量,那么就可以使用关键字:global
// global就是用来添加对外部成员的引用
// 注意点:不能在引用的同时对变量赋值,如果想赋值,则需要换下一行赋值
global $num;
// 如果在函数内部修改了全局变量的值,那么这个修改也会影响后面的使用
$num = 10;
$sum =0;
for($i =0;$i<=$num;$i++){
// $sum = $sum + $i;
$sum += $i;
}
return $sum;
}
$result = cal(100); //55
echo $result;
echo '
';
echo $num;
?>
function cal($num){
$sum =0;
for($i =0;$i<=$num;$i++){
// $sum = $sum + $i;
$sum += $i;
}
return $sum;
}
// 调用:通过函数名称调用
$result = cal(100); //5050
echo $result;
implode
它可以将关联的数据以指定分隔符连接,转换为字符串
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
echo $comma_separated; // lastname,email,phone
// Empty string when using an empty array:
var_dump(implode('hello', array())); // string(0) ""
?>
explode
explode:它可以将字符串以指定的分隔符分隔,生成关联数组
// 示例 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
?>
时间函数
// time():从 Unix 纪元(格林威治时间 1970-01-01 00:00:00)到当前时间的秒数
// echo time();
// 默认情况下这个函数获取的是格林威志时间,如果想获取中国时区的时间,就需要进行配置文件的修改
// php-ini >date.timezone = PRC|Asia/shanghai|Asia/chongqin
echo date("Y-m-d H:i:s");
// strtotime()输入时间距离1970-1-1的时间戳,中间差8小时
echo "
";
echo strtotime("1970-1-2");
?>
$GLOBALS
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
$x = 75;
$y = 25;
function foo () {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
foo();
echo $z;
// => 100
?>
// 定义常量的语法:define(常量名称,常量值,标记是否对大小写敏感false)
// define(name,value,insensitive):insensitive:不敏感的,麻木不仁的,
// 默认情况下常量对大小写敏感--区分大小写
// 定义常量:一般情况下常量的名称使用大写字符
define("PI",3.14,true);
// 使用常量.常量的使用和变量没有区别,只要注意前面不需要再添加$符号了
echo PI;
echo '
';
echo pi;
echo '
';
// php中的魔术常量的使用:魔术常量的意思是指这个常量值会根据不同的使用场合返回不同的值
// __LINE__:可以获取当前的代码行
echo __LINE__;
echo '
';
// __FILE__:它可以获取当前文件的路径 :目录+文件名
echo __FILE__;
echo '
';
// __DIR__:它可以获取当前文件的目录
echo __DIR__;
echo '
';
// __FUNCTION__:它可以获取当前魔术常量所在的函数
function test()
{
echo __FUNCTION__;
}
test();
?>
通常情况下,当一个文件中的代码过长,自然会想到要拆分到多个文件中。随着开发经验的积累,慢慢的会发现,除了文件过程应该拆分文件,更应该做的事情是根据用途去划分。
不管你是怎样想的,核心问题都是一样:怎么将代码拆分到多个文件中?
PHP 中引入其他 PHP 文件有四种方式:
四种方式的对比:
require | require_once | include | include_once | |
---|---|---|---|---|
被载入文件如果不存在是否影响继续运行 | Y | Y | N | N |
多次调用是否会重复执行被载入的文件 | Y | N | Y | N |
总结来说:
使用层面:
file_get_contents() 将文件读入字符串
读取文件内容,如果读取成功,就会返回一个字符串类型的值(文件内容),如果读取失败,就会返回false
**file_put_contents(**文件路径,需要写入的内容,FILE_APPEND ) 将文件读入字符串
将指定的内容写入到文件,同时返回当前成功写入的字符的数量
FILE_APPEND:设置当前的写入方式为追加
// 设置当前页面的返回值的类型是图片格式,意味着后期浏览器接收了返回值之后,会按照图片格式进行解析
// header("Content-Type:text/html");
// // $res = file_get_contents("data.txt");
// // var_dump($res);
// header("Content-Type:image/jpeg");
// $res = file_get_contents("./images/monkey.png");
// echo $res;
// file_put_contents(文件路径,需要写入的内容,FILE_APPEND ):将指定的内容写入到文件,同时返回当前成功写入的字符的数量
// FILE_APPEND:设置当前的写入方式为追加(用双引号,单引号不能转译n)
$count = file_put_contents("data.txt","这是我写\n入的内容",FILE_APPEND);
echo $count;
?>
1.1常见的发起GET请求的方式
1.2网页中有许多效果使用的就是GET请求:
1.3GET方式提交数据的格式
1.4GET方式提交数据的特点:
2.1特点
1-post 方式 安全性比较高
2-传递数据量大,请求对数据长度没有要求
3-请求不会被缓存,也不会保留在浏览器历史记录中
用于:密码等安全性要求比较高的场合,提交的数据量比较大:发布文章,上传文件。
POST方式提交数据上限默认为8M(可以在PHP的配置文件post_max_size选项中修改)
HTML 中有一个专门用于提交数据的标签:,通过这个标签可以很容易的收集用户输入。
form 标签有两个必要属性:
- action:表单提交地址(填完了,交给谁)
- method:表单以什么方式提交(get|post)
PHP 中有三个超全局变量专门用来获取表单提交内容:
$_GET
:用于获取以 GET 方式提交的内容,更标准的说法:接收 URL 地址问号参数中的数据
$_POST
:用于获取以 POST 方式提交的内容,更标准的说法:接收 请求体 中的数据
$_REQUEST
:用于获取 GET 或 POST 方式提交的内容,但是我们不用,为什么,有两个原因1.效率更低下
2.它的取值受配置文件的影响:它的取值有一个顺序,在同名的情况下,后面所取的值会将前面所取的值覆盖,所以它不安全
建议:能不用就不用
提交地址
action
提交地址指的是这个表单填写完成过后点击提交,发送请求的请求地址是什么。从便于维护的角度考虑,一般我们最常见的都是提交给当前文件,然后在当前文件中判断是否是表单提交请求:
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 表单提交请求 } ?>
另外,建议使用
$_SERVER['PHP_SELF']
动态获取当前页面访问路径,这样就不用因为文件重命名或者网站目录结构调整而修改代码了:<!-- 这样写死 action 地址,当文件重命名就需要修改代码 --> <form action="/foo/login.php"> <!-- ... --> </form> <!-- 通过 `$_SERVER['PHP_SELF']` 获取路径,可以轻松避免这个问题 --> <form action="$_SERVER['PHP_SELF']; ?>"> <!-- ... --> </form>
提交方式
method
可以用于设置表单提交的方式,目前我们所认识的就是最常见两种表单提交方式:GET
和 POST
。
从效果上来看,两者都可以将数据提交到服务端,但是从实现提交的原理上两者有很大的不同:
至于什么情况下应该选用哪种方式,这个需要结合业务场景和这两种方式各自的特点来决定,没有绝对的答案,只能给出一些原则:
至于表单元素中的文本框文本域一类的元素,都是直接将元素的 name
属性值作为键,用户填写的信息作为值,发送到服务端。
但是表单元素中还有一些比较特殊的表单元素需要单独考虑:
单选按钮
<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female">
复选按钮
<input type="checkbox" name="agree">
<input type="checkbox" name="agree" value="true">
如果需要同时提交多个选中项,可以在 name
属性后面 跟上 []
:
<input type="checkbox" name="funs[]" value="football">
<input type="checkbox" name="funs[]" value="basketball">
<input type="checkbox" name="funs[]" value="world peace">
最终提交到服务端,通过 $_POST
接收到的是一个索引数组。
选择框
<select name="subject">
<option value="1">语文option>
<option>数学option>
select>
表单注意事项
form 表单数据的编码类型由enctype决定,默认为application/x-www-form-urlencoded方式编码。文件上传时属性值必须设置为multipart/form-data
application/x-www-form-urlencoded:会把表单中发送的数据编码为名称/值对,标准编码格式
multipart/form-data,这个是专门用来传输特殊类型数据的,比如文件、mp3
数据提交方式:POST方式
Array
// (
// [name] => 跨域攻击.png:源文件的名称
// [type] => image/png:源文件的类型
// [tmp_name] => C:\Windows\phpE412.tmp:这是文件在服务器的临时路径
// [error] => 0:错误信息,0代表没有错误
// [size] => 256436:文件的大小
// )
// )
// 1.判断用户是否提交
if(!empty($_FILES)){
print_r($_FILES);
// echo $_FILES["myfile"]["tmp_name"];
// 判断文件类型是否满足需要
$type = $_FILES["myfile"]["type"];
// strpos(源字符串,搜索字符串):可以获取指定字符串在源字符串中第一次出现的索引值,索引从0开始
// if(strpos($type,"image/") === 0){
$filename = $_FILES["myfile"]["name"];
// 获取当前文件的扩展名 strrchr(源字符串,指定搜索的字符)
$extension = strrchr($filename,".");
// 生成一个随机的文件名称:获取到一个唯一值
$myname = time().rand(1000,9999).$extension;
move_uploaded_file($_FILES["myfile"]["tmp_name"],"./upload/".$myname);
// }else{
// echo '你选择不是图片';
// }
}
?>
Document
type
属性为 file
的 input
元素可以通过表单提交文件(上传文件),服务端 PHP 可以通过 $_FILES
获取上传的文件信息。
$_FILES
同样也是一个关联数组,键为表单的 name
,内容如下:
array(1) {
["avatar"]=>
array(5) {
["name"]=>
string(17) "demo.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(27) "C:\Windows\Temp\php786C.tmp"
["error"]=>
int(0)
["size"]=>
int(29501)
}
}
文件上传后,文件信息自动保存在预定义变量$_FILES数组中。假设myFile为文件域的name属性值。
1) [$_FILES[‘myFile’][‘name’]
文件的原始名称。
2) $_FILES[‘myFile’][‘tmp_name’]
文件的临时路径,默认为c:/windows/temp(运行窗口—>temp)。没有直接将文件上传至Apache服务器的根目录
[3) $_FILES[‘myFile’][‘type’]]
文件的内容类型。
常见的文件类型: image/jpeg,image/png,image/gif,text/html,text/javascript
[4) $_FILES[‘myFile’]’‘error’]
文件上传的错误代号。0代表没有发生错误。
[5) $_FILES[‘myFile’]‘size’]
文件大小(单位为byte,字节)
Array
// (
// [name] => Array
// (
// [0] => qq.png
// [1] => 程序员的理解.jpg
// )
// [tmp_name] => Array
// (
// [0] => C:\Windows\phpC51.tmp
// [1] => C:\Windows\phpC62.tmp
// )
// )
// )
if(!empty($_FILES)){
// 1.获取扩展名
$nameArr = $_FILES["myfile"]["name"];
$pathArr = $_FILES["myfile"]["tmp_name"];
foreach($pathArr as $key => $value){
// $nameArr[0]
// 2.获取唯一的图片名称
$name = time().rand(1000,9999).strrchr($nameArr[$key],".");
// 3.将文件存储到永久目录:move_uploaded_file
move_uploaded_file($value,"./upload/".$name);
}
}
?>
Document
定义
HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种协议规范了通讯内容的格式以及各项内容的含义。
约定形式
约定内容
请求报文的常见格式
请求行
GET /demo.php HTTP/1.1
请求方式 + 空格 + 请求路径 + 空格 + HTTP 协议版本
请求头
客户端想要告诉服务端的一些额外信息,以下为常见的请求头:
键 | 值 |
---|---|
Host | 请求的主机 |
Cache-Control | 控制缓存(例如:max-age=60 缓存60秒) |
Accept | 客户端想要接收的文档类型,逗号分隔 |
User-Agent | 标识什么客户端帮你发送的这次请求 |
Referer | 这次请求的来源 |
Accept-Encoding | 可以接受的压缩编码 |
Cookie | 客户端本地的小票信息 |
Connection | 设置当前请求结束之后,连接是否断开 keep-alive(保持)close(断开) |
请求体
客户端需要向服务端发送的内容
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
HTTP/1.1 200 OK
HTTP 协议版本 + 空格 + 状态码 + 空格 + 状态描述
服务端想要告诉客户端的一些额外信息,常见的有以下:
键 | 值 |
---|---|
Date | 响应时间 |
Server | 服务器信息 |
Content-Type | 响应体的内容类型 |
Content-Length | 响应的内容大小 |
Set-Cookie | 让客户端设置一个小票 |
如果需要在程序中设置自定义的响应头(不是预设的),建议使用 X-
规则
响应体
响应体一般来说是HTML,也可以是css或者javascript
注意:返回什么类型文件,就修改响应头里的响应类型
请求css文件
虽然要请求的是css文件,但是link的是php文件
由于php是后台文件,最终是在php中返回内容给浏览器,并且可以设置当前的文件类型
<link rel="stylesheet" href="css.php" />
设置响应文件类型
header('Content-Type: text/css');
(注意:常见的 HTTP MIME type:
Content-Type:text/css
Content-Type:text/html
Content-Type:text/javascript
Content-Type:image/jpeg
Content-Typeimage/png
Content-Type:image/gif
Content-Type:application/x-www-form-urlencoded)
header方法发送重定向操作
页面跳转
<a href="data.php">点击重定向a>
在data.php中完成跳转
// 立马做出跳转
// header("Location:01-getsmt.php");
// 在指定的时间之后跳转
header("refresh:3;url=01-getsmt.php");
?>
header方法实现下载功能
// 实现当前页面的自动下载
header("Content-Type:application/octet-stream");
// 指定文件名称, 自动下载,设置下载名称
header("Content-Disposition:attachment;filename=tmp.php");
?>
设置请求头制作图片防盗链
// 获取请求报文数据
// print_r(getallheaders());
$refer = getallheaders()["Referer"];
echo $referer; // http:127.0.0.1/day04/03-test.html
// 获取url中各个部分的值
print_r(parse_url($referer));
/*
Array(
[scheme] => http
[host] => 127.0.0.1
[path] => /day04/03-test.html
)
*/
?>
状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
常见状态代码、状态描述的说明如下。
WWW-Authenticate
报头域一起使用。 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话
HTTP协议,本来是进行共享多个计算机之间的文件而产生的文件传输协议
而请求的时候,服务器没有记录当前的信息
用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
内容 | cookie | localStorage | sessionStorage |
---|---|---|---|
生命周期 | 一般由服务器生成,可设置失效的时间,如果在浏览器端生成cookie,默认关闭浏览器后失效 | 除非被删除,否则永久保存 | 仅在当前会话下有效,关闭页面或者浏览器后被删除 |
数据大小 | 4k | 20M | 5M |
与服务器端通信 | 携带在http请求头中,若保存cookie过多数据会带来性能问题 | 仅在客户端即浏览器中保存,不参与和服务器的通信 | 仅在客户端即浏览器中保存,不参与和服务器的通信 |
易用性 | 需要程序员自己封装 | 原生接口可以接受,亦可以再次封装来对obj和Arr有更好的支持 | 原生接口可以接受,亦可以再次封装来对obj和Arr有更好的支持 |
// 创建cookie
// setcookie("username", "tylor"); // 可以在请求头中查看
// 判断是否拥有某个指定名称的cookie值 -- $_COOKIE
if(isset($_COOKIE["username"])) {
echo "欢迎回来,朕的小仙女";
}else {
echo "大人头一回来,是打尖儿还是住店呀~";
setcookie("username", "tylor");
}
?>
cookie的参数
cookie的有效期
// 时间是秒, 时间参照php的默认起始时间(1970-1-1)
// setcookie("username", "tylor", 100);
setcookie("username", "tylor", time() + 10);
// 设置永久的时间
setcookie("username", "tylor", PHP_INT_MAX);
?>
cookie的有效目录
// 在不同的文件夹输出cookie中的键
echo $_COOKIE["username"];
// 通过path可以设置访问权限,参照网站根目录
setcookie("username", "tylor", PHP_INT_MAX, "/day05/down");
// 设置父级目录,子目录可以访问,设置子目录,上层不能访问 "/" 代表整站可以访问
// Domain: 域名 path: 路径 secure:只有在https这类安全的协议下才会发送
// 某网站中显示的cookie
// set-cookie: ds_user_id=3265153328; Domain=.instagram.com; expires=Wed, 13-Feb-2019 14:19:35 GMT; Max-Age=7776000; Path=/; Secure
?>
// 处理删除cookie的php文件
// 1.0 怎么创建的就怎么删除的
// setcookie("username", ""); 如果开始不是这样设置的,这样删除就不行
setcookie("username", "", PHP_INT_MAX, "/day05/down");
echo "ok";
// 2.0 设置一个过期时间,也是可以删除的
?>
[
{
"title":"李四之歌",
"singer":"李四",
"album":"李四的音乐世界",
"src":"./upload/aa.mp3"
},
{
"title":"李四之歌",
"singer":"李四",
"album":"李四的音乐世界",
"src":"./upload/aa.mp3"
}
]
json_encode()
可以将php数组或者对象转换为json格式的字符串
json_decode()
可以将json格式的字符串转换为数组或者对象
session_start();
$_SESSION['user'] = array('username'=>'lisi','age'=>'12');
session_start();
$user = $_SESSION['user'];
session_start();
unset($_SESSION['user']);
session_start();
unset($_SESSION);
$_SESSION = []
session_start();
session_destroy();
区别 | cookie | session |
---|---|---|
存储位置 | 浏览器 | 服务器 |
浏览器携带的数据量 | 多 | 少(只携带session-id) |
存储的数据类型 | 只能是字符串 | 任意类型 |
安全性 | 较低 | 较高 |
默认的有效路径 | 当前路径及其子路径 | 整站有效 |
数据的传输量 | 有限制4K,不能超过20个 | 无限制 |
mysql> show databases; -- 显示全部数据库
mysql> create database <db-name>; -- 创建一个指定名称的数据库
mysql> use <db-name>; -- 使用一个数据库,相当于进入指定的数据库
mysql> show tables; -- 显示当前数据库中有哪些表
mysql> create table <table-name> (id int, name varchar(20), age int); -- 创建一个指定名称的数据表,并添加 3 个列
mysql> desc <table-name>; -- 查看指定表结构
mysql> source ./path/to/sql-file.sql -- 执行本地 SQL 文件中的 SQL 语句
mysql> drop table <table-name>; -- 删除一个指定名称的数据表
mysql> drop database <db-name>; -- 删除一个指定名称的数据库
mysql> exit|quit; -- 退出数据库终端
查询
-- 查询在这张表里面的所有id列和name列
select id,name from mytable
-- 带条件的查询
select * from mytable where id = 3
-- 查询年龄小于20岁的
select * from mytable where age < 20
-- 查询年龄小于20岁,性别为女生
-- and or not
select * from mytable where age < 20 and gender = 0
增加
-- 表名后没有指定字段,那么必须设置对应数量的值,并且主键不能重复
insert into mytable values('lili', 30, 0) -- 没有id的值,所以报错
-- 如果有标识列,一般可以给null值,系统会自动生成
insert into mytable values(null, 'lili', 30, 0)
-- 指定需要添加数据的字段
insert into mytable(name, age, gender) values('lili', 30, 0)
-- 对于值为null的值,可以不写
insert into mytable(name) values("ok")
-- 非空字段需要赋值,否则系统也不会自动为其生成默认值
insert into mytable(age,gender) values(40, 1) -- 虽然可以,但是不建议漏掉非空字段
修改
-- 修改的语法 update 表名 set 字段1 = 值1, 字段2 = 值2 ...
update mytable set age = age + 1 -- 会把所有的都改变
-- 带条件的写法,只会改变第5条
update mytable set age = age + 10 where id = 5
-- 同样支持 or and not
-- 修改多个内容
update mytable set age = age + 1,gender = 1 where id = 5 or id = 6
删除
不要轻易删除内容
-- 删除语句的语法 delete [from] 表名 where 条件
-- 删除的操作不能还原,要删除的话,就需要提前备份
delete from mytable where id = 8
-- 同时删除多个
delete from mytable where id in(4,5)
总条数 count
-- 查询可以满足条件的记录数
select count(*) from mytable
-- 选择符合条件的记录数
select count(id) from mytable
-- 如果当前空值,不会对null值进行计算
最大值、最小值 max min
-- max 获取最大值 min 获取最小值
select max(age) from mytable
-- 如果是字符,按照字符的ascll码来排序
平均值 avg
-- 一般都是数值
select svg(age) from mytable
**排序 order by **
select * | 字段列表 form 表列表 where order by asc 升序 desc 降序
select * from mytable
-- 降序
select * from mytable order by id desc
-- 按照name排序 a-z
select * from mytable order by name
-- null值会排在前面
-- 实现按照性别,再按照年龄
select * from mytable order by gender,age
获取指定范围内的数据limit
获取指定的前n条记录 只有一个参数
-- 前面3条数据
select * from mytable limit 3
-- 后面五条
-- 先做降序,然后再去筛选,并且一定要先排序,再获取,不然会报错
select * from mytable order by id desc limit 5
-- 中间范围的记录 n 偏移量从0开始, m 能够获取的记录数
select * from mytable limit 2,2
-- 第2种写法,和上面的一样
select * from mytable limit 4 offset 2
制作分页
int pageSize = 10;
int pagecount = 1;
select * from mytable pageSize 4 offset (pagecount - 1) * pageSize
多表查询
-- 返回初始的数据,没有内部关联的数据
select * from student
-- 用户需要的是最终的结果
-- 1.0 采用from where的方式
select * from student,class where student.cid = class.classid -- where后面的这个 = 表示判断
-- 简写
select studentId,studentName,age,gender,className from student,class where student.cid = class.classid
-- 2.0 join 和 inner join都是一样的 on和where的意思也是差不多的
select * from student inner join class on student.cid = class.classid
-- left join 如果对应不上的时候,自动让对应的值为空 right join 与之相反
select * from student left join class on student.cid = class.classid
建立与服务器的连接
<?php
// 有效
header("Content-Type:text/html;chartset=utf-8");
// 设置主机,用户名,密码,想操作的数据库
// 这个函数会自动打开连接
// 如果连接失败,返回false 如果连接成功就返回一个连接对象
$conn = mysqli_connect("localhost", "root", "root", "mybase");
var_dump($conn); // 出来一堆东西证明连接成功
// 假如出错了,错误信息会给详细的提示
//失败的情况:
// Unknown database 'mybase1':数据库找不到,请注意名称是否正确
// Access denied for user 'root'@'localhost' (using password: YES):密码错误
// Access denied for user 'root1'@'localhost' (using password: YES):用户名错误
// mysqli_connect()::这种错误一般是服务器相关的错误
// 为了保证服务器返回值的编码与当前php编码一致,我们可以设置服务器的返回数据的编码
// mysqli_set_charset(连接对象,编码格式字符串)
//无效
mysqli_set_charset($conn,"utf8");
if(!$conn) {
// echo "连接失败";
// return;
die("连接失败");
// exit();
} else {
echo "连接成功";
}
echo "这是连接之后的代码,如果有错误,将不会执行到这里";
?>
PHP操作sql增加、修改和删除
增加
<?php
// 新增数据 创建sql语句
$sql = "insert into mytable value(null, '张三', 30, 1)";
// 执行sql语句 mysqli_query(连接对象, sql语句)
// 有返回值
$result = mysqli_query($conn, sql);
var_dump($result); // bool(true) | bool(false)
if($result) {
echo "新增成功";
} else {
echo "新增失败
";
// 输出具体的报错信息,它可以输出最近一条sql语句在执行时所产生的错误信息
echo mysqli_error($conn);
}
// 获取更加详细的信息
?>
修改
<?php
// 修改操作
$sql = "update mytable set age = 20 where id = 3";
$result = mysqli_query($conn, sql);
if($result) {
echo "修改功";
} else {
echo "修改失败
";
// 输出具体的报错信息
echo mysqli_error($conn);
}
?>
删除
<?php
// 修改操作
$sql = "delete from mytable where id = 4";
$result = mysqli_query($conn, sql);
if($result) {
echo "删除成功";
} else {
echo "删除失败
";
// 输出具体的报错信息
echo mysqli_error($conn);
}
?>
php查询结果集
<?php
// 1.0 设置响应头
header("Content-Type:text/html;chartset=utf-8");
// 2.0 创建数据库连接
$conn = mysqli_connect("localhost", "root", "root", "mybase");
// 3.0 设置编码
// mysqli_set_chartset($conn, "utf8");
mysqli_query($conn, "set name as utf-8"); // 设置编码格式为utf-8
if(!$conn) {
die("连接失败");
}
// 4.0 创建sql语句
$sql = "select * from mytable";
// 5.0 执行sql语句
$result = mysqli_query($conn, $sql);
var_dump($result); // 获取到大致信息,几行几列,但是并不是具体的数据
?>
判断当前返回结果集的状态
<?php
if(!$result) {
die("查询失败");
} else if(mysqli_num_rows($result) == 0) {
die("结果集为空");
} else {
var_dump($result);
}
// 1, 如果查询失败, 会返回false
// 2,如果成功,有结果集,但是没有数据, 有结果集有数据
// !!!! 判断当前结果集中是否有数据
// mysqli_num_rows($result);
?>
展示结果集中的内容
获取数据的函数:
<?php
// 1.0 mysqli_fetch_array
$arr = mysqli_fetch_array($result);
print_r($arr); // 关联数组和索引数组,两份
// 数据以数组的方式返回
// 2.0 mysqli_fetch_assoc
$arr1 = mysqli_fetch_assoc($result);
print_r($arr1); // 关联数组
// 数据以数组的方式返回
// 3.0 mysqli_fetch_row
$arr2 = mysqli_fetch_row($result);
print_r($arr2); // 索引数组
// 数据以数组的方式返回
?>
读取全部的数据
<?php
// 上面的函数都只会读取一行数据,但是在读取完毕之后,会将指针指向下一行
// 如果需要获取多行,则需要重复调用相同的方法,如果没有数据,则返回NULL
// !!!!而数据到底有多少,则未可以,所以循环的话并不知道何时停止,while循环就比较适合
while ($arr = mysqli_fetch_assoc($result)) {
$res[] = $arr;
}
print_r($res);
?>
方法 | 说明 |
---|---|
mysqli_connect(“主机名称”, “用户名”, “密码”, “数据库名”) | php连接MYSQL数据库 |
mysqli_set_charset(连接对象,“utf8”); | 设置数据库和服务器编码相同 |
mysqli_query($conn, “set name as utf-8”); | 设置数据库和服务器编码的另一种方式 |
mysqli_query(连接对象,sql语句) | 执行sql语句 |
mysqli_num_rows(结果集[执行完sql语句之后的值]) | 返回结果集的条数 |
mysqli_fetch_array(结果集,MYSQL_ASSOC) | 提取查询语句之后的内容,需要循环 |
mysqli_fetch_assoc(结果集) | 提取到查询语句之后的关联数组 |
mysqli_fetch_row(结果集) | 提取到查询语句之后的索引数组 |
mysqli_error(连接对象) | 返回具体的连接错误信息 |
die(”提示错误信息“) | 终止操作,提示错误信息 |
header("Content-type:text/html;charset=utf-8");
// 1.0 封装增加、删除和修改的操作
function opt($sql) {
// 创建连接
$conn = mysqli_connect("localhost", "root", "root", "mytable");
// 如果连接成功返回连接对象,如果不成功,返回false
if(!$conn) {
die("数据库连接失败~");
}
// 设置编码
mysqli_set_chartset($conn, "utf8");
// 执行$sql语句,接收返回值
$res = mysqli_query($conn, $sql);
// 及时关闭连接
mysqli_close($conn);
// 返回结果
return $res;
}
// 2.0 封装查询操作
function select() {
// 创建连接
$conn = mysqli_connect("localhost", "root", "root", "mytable");
// 如果连接成功返回连接对象,如果不成功,返回false
if(!$conn) {
die("数据库连接失败~");
}
// 设置编码
mysqli_set_chartset($conn, "utf8");
// 查询语句的返回值,成功返回资源(结果集),不成功返回false
$res = mysqli_query($conn, $sql);
if(!$res) {
echo "查询失败";
} else if (mysqli_num_rows($res) == 0) {
echo "没有查找到数据~";
} else {
// 有结果集也有数据行
while($arr = mysqli_fetch_assoc($res)) {
$result = $arr;
}
// 及时关闭连接
mysqli_close($conn);
return $return;
}
// 操作完毕,关闭连接
mysqli_close($conn);
}
?>
header("Content-type:text/html;charset=utf-8");
// 载入封装的文件
include_once "./common.php";
$res = opt("insert into mytable values(null, '张三', 28, '男', 1112334)");
// 如果有限制唯一的值,注意在写入的时候会报错
if($res) {
echo "新增成功";
} else {
echo "新增失败";
}
?>
| 提取到查询语句之后的索引数组 |
| mysqli_error(连接对象) | 返回具体的连接错误信息 |
| die(”提示错误信息“) | 终止操作,提示错误信息 |
## 18PHP操作数据库的封装
### 18.1封装代码
```php
header("Content-type:text/html;charset=utf-8");
// 1.0 封装增加、删除和修改的操作
function opt($sql) {
// 创建连接
$conn = mysqli_connect("localhost", "root", "root", "mytable");
// 如果连接成功返回连接对象,如果不成功,返回false
if(!$conn) {
die("数据库连接失败~");
}
// 设置编码
mysqli_set_chartset($conn, "utf8");
// 执行$sql语句,接收返回值
$res = mysqli_query($conn, $sql);
// 及时关闭连接
mysqli_close($conn);
// 返回结果
return $res;
}
// 2.0 封装查询操作
function select() {
// 创建连接
$conn = mysqli_connect("localhost", "root", "root", "mytable");
// 如果连接成功返回连接对象,如果不成功,返回false
if(!$conn) {
die("数据库连接失败~");
}
// 设置编码
mysqli_set_chartset($conn, "utf8");
// 查询语句的返回值,成功返回资源(结果集),不成功返回false
$res = mysqli_query($conn, $sql);
if(!$res) {
echo "查询失败";
} else if (mysqli_num_rows($res) == 0) {
echo "没有查找到数据~";
} else {
// 有结果集也有数据行
while($arr = mysqli_fetch_assoc($res)) {
$result = $arr;
}
// 及时关闭连接
mysqli_close($conn);
return $return;
}
// 操作完毕,关闭连接
mysqli_close($conn);
}
?>
header("Content-type:text/html;charset=utf-8");
// 载入封装的文件
include_once "./common.php";
$res = opt("insert into mytable values(null, '张三', 28, '男', 1112334)");
// 如果有限制唯一的值,注意在写入的时候会报错
if($res) {
echo "新增成功";
} else {
echo "新增失败";
}
?>