Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
1、XML 返回的数据
2、json 数据格式,不是php数据格式,没有相当于操作,只能把它转为数组,或者数组转为json
大括号{} 包裹着,通过key 和value,
key 和value,必须放在 “ “,key和value中间用 :英文的
2个值之间,用,英文逗号,跟数组一样
最后一个不加,号
数据值:
1.数字(浮点数和整数)
2.字符串,必须放在 “ “
3.布尔值,true和false
4.数组,放在[]中
5.对象,放在{}中
6.null
$obj = '{
"qitiandasheng" : "齐天大圣",
"tianpengyuanshuai" : "天蓬元帅",
"erlangshen" : "二郎神"
}';
echo $obj;
因为不是php本身的数据格式,我们不会手动的把它输出出来。
// 比如说,js给接口的数据,是json的
php $obj = '{
"qitiandasheng" : "齐天大圣",
"tianpengyuanshuai" : "天蓬元帅",
"erlangshen" : "二郎神"
}';
echo $obj;
// 想取到里面的值是不行的因为不是字符串,所以把它改为字符串
print_r (json_decode($obj,true));
// 赋值再打印
$arr = json_decode($obj,true);
print_r ($arr);
// 从数据库中,获取了数据,数据是数组,二维数组,我们要把它转为json数据,返给用户的人
// 转回json
// 返回json数据之前,或者再代码顶部,设置字符集
// 1.浏览器字符集
// 2.php字符集
// 3.mysql字符集
// header函数
header('Cotent-Type:application/json');
//返回json_encode不是UF-8会出现乱码,如果出现乱码 可以改为json格式
echo json_encode($arr);
// 接口API:都是以json数据 返回数据的
// 完整的接口 :返回json数据 接口要的参数,安全问题。
function get_url($url,$data,$is_post=0){
$ch = curl_init(); // 创建一个curl,它一直存在在这里
// // 要配置很多项。可以直接网上搜一个
curl_setopt($ch, CURLOPT_URL ,'http://apis.juhe.cn/simpleWeather/query?key=abc4b64ae7656b460723402175a5650b&city=合肥');
if($is_post == 0){
if(!empty($data)){
$url .= '?';
foreach($data as $k=>$v){
$url .= $k . '=' . $v . '&';
}
}
}
curl_setopt($ch, CURLOPT_URL ,$url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); // 在发起连接前等待的时间,如果设置为0,则无限等待。
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置cURL允许执行的最长秒数。设置超时限制防止死循环
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// 爬取重定向页面
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer,防止盗链
curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 要求结果保存到字符串中还是输出到屏幕上
curl_setopt($ch, CURLOPT_USERAGENT, 'Data');// 在HTTP请求中包含一个"User-Agent: "头的字符串。
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // 强制使用 HTTP/1.1
if($is_post == 1){
curl_setopt($ch, CURLOPT_POST, 1); // 这个请求是post
curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
}
$html = curl_exec($ch); // 去执行curl,并且打印出来,但是如果关闭了,就不会打印出来
if(curl_errno($ch)){
return curl_errno($ch);
}
curl_close($ch);
return $html;
}
header( 'Content-Type:application/json' );
$data = [
'key' => 'abc4b64ae7656b460723402175a5650b',
'city' => '合肥'
];
$get_url = get_url('http://apis.juhe.cn/simpleWeather/query',$data);
$arr = json_decode($get_url,true);
print_r($get_url);
print_r($arr);
// 把$get_url解密
// 拿到数组以后 直接拿arr下面的error_code
// 小程序、IOS、安卓。
// 为什么它们很少去请求第三方的接口,而是我们php请求了以后,把数据给它们
// 因为php请求了接口,重新组装好以后,它们拿到数据,就是这个格式。
// 如果中间出现数据错误,换第三方,在用php写接口给前端,前端直接可以使用
// 如果小程序、IOS、安卓, 它们请求第三方,改接口地址,这3个都需要重新上架
// print_r($arr);
if ($arr['error_code'] !=0){
echo $arr['reason'];
}else{
$new_data = $arr['result']['future'];
echo json_encode($new_data); //变为json字符串
}
// 'fun.php' 属于路径的知识
require './fun1.php';
//引入新建的文件fun1.php
<?php
function a($num1,$num2){
return $num1 + $num2;
}
function get_url($url,$data,$is_post=0){
$ch = curl_init(); // 创建一个curl,它一直存在在这里
// 要配置很多项。可以直接网上搜一个
// curl_setopt($ch, CURLOPT_URL ,'http://apis.juhe.cn/simpleWeather/query?key=abc4b64ae7656b460723402175a5650b&city=合肥');
if($is_post == 0){
if(!empty($data)){
$url .= '?';
foreach($data as $k=>$v){
$url .= $k . '=' . $v . '&';
}
}
}
curl_setopt($ch, CURLOPT_URL ,$url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); // 在发起连接前等待的时间,如果设置为0,则无限等待。
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置cURL允许执行的最长秒数。设置超时限制防止死循环
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// 爬取重定向页面
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer,防止盗链
curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 要求结果保存到字符串中还是输出到屏幕上
curl_setopt($ch, CURLOPT_USERAGENT, 'Data');// 在HTTP请求中包含一个"User-Agent: "头的字符串。
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // 强制使用 HTTP/1.1
if($is_post == 1){
curl_setopt($ch, CURLOPT_POST, 1); // 这个请求是post
curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
}
$html = curl_exec($ch); // 去执行curl,并且打印出来,但是如果关闭了,就不会打印出来
if(curl_errno($ch)){
return curl_errno($ch);
}
curl_close($ch);
return $html;
}
$fun = @include 'fun2.php';
echo a(10,30);
echo 111;
// @ 符号,可以把错误信息屏蔽掉
// 线下代码,不要增加@这个,测试时,不要增加
// 不能屏蔽致命错误
// include 有返回值,require 没有返回值
// include 在加载文件失败时,会出现警告。require在加载失败时,会出现致命错误
// 如果你要加载的文件,不可缺少,用require
// 如果只是小问题,不影响逻辑处理,就用include
include_once 'fun1.php';
include_once 'fun1.php';
require_once 'fun1.php';
require_once 'fun1.php';
// require_one和include_one是一样的
// 重复引入不会出错,引入多次也是只加载一次
// .和..是目录
// . 代表当前目录
// .. 代表上一级目录
// 已经讲过的知识:
// 1、数组
// 2、数组循环
// 3、数据类型
// 4、if条件
// 5、运算符、比较符
// 6、超全局变量、系统常亮
// 7、网络:curl、接口api、json数据、get和post
php:字符串、数字、null、布尔值。在数据库中,包含这些类型的数据
// 但是数据库有
// getdate 获取当前日期和时间的详细信息,数据
// print_r( getdate());//获取当天日期
// $getdate = getdate();//给个变量
// echo $getdate['year'] . '-' . $getdate['mon'] . '-' . $getdate['mday'];
// 输出年月日
// echo '<hr>';
// 但是日期和时间,不好计算
// 就出现了一个叫时间戳的东西
// 是一个10位的整数,它代表当前年月日时分秒,1970-1-1 00:00:01 - 到现在
echo time();
echo '<hr>';
echo time() + 15 * 24 * 60 * 60;
echo '<hr>';
// date 格式化日期,第一个参数,是日期时间格,第二个参数是要格式化的时间戳
echo date('Y-m-d H:i:s',time()+ 15 * 24 * 60 * 60);
// y代表年 m代表月 d代表日 H:i:s是时分秒
echo '<hr>';
// 时间戳能转换为日期那把它转回去
// str在时分秒看来是字符串,所以str加to tim转为时间
// strototim把日期时间转换为时间戳
echo strtotime('now');//当前时间的时间戳
echo'<hr>';
echo strtotime('2021-12-30');
// 封装json数据
// php和js交互数据,除了普通的文本,多个数据的就是json字符串
// $code等于0,代表成功,其他的都是失败,错误信息,也要给我们
// function json_data($code,$data=[],$msg=''){
// header( 'Content-Type:application/json' );
$msg = [
0 => '成功',
1 => '网络错误',
2 => '账户错误',
3 => '密码错误'
];
if($code == 0){
$arr = [
'code' => 0,
'msg' => '成功',
'data' => $data
];
}else{
$arr = [
'code' => $code,
'msg' => $msg
];
}
return json_encode($arr);
}
// 数据库中获取数据
$data = [
[
'name' => '欧阳克',
'age' => 38,
'gongfu' => [
'php',
'小程序'
]
],
[
'name' => '灭绝师太',
'age' => 18,
'gongfu' => [
'uniapp',
'php'
]
],
[
'name' => '朱天蓬',
'age' => 48,
'gongfu' => [
'html',
'css'
]
]
];
// 1 网络错误
// 2 账户错误
// 3 密码错误
// 4 账户被禁用,请找客服
echo json_data(1,[],'账户被禁用');