PHP基础语法
Hello World
echo作用就是向页面当中输入字符串
<? php
echo '<div>hello world!';
?>
变量声明与字符
php的变量声明 以$开头
$num = 123;
-
字符串拼接为英文状态的 ‘ . ’
-
单引号对于其中的变量当做普通的字符串处理
-
双引号对于其中的变量会吧变量解析成变量值
内容输出
- echo:输出简单数据类型,如字符串、数值
- print_r() :输出复杂数据类型,如数组
- var_dump():输出详细信息,如对象、数组
数据类型
一维数组
声明
<?php
// 声明方式1
$arr = array(1,2,3,4,5);
// 声明方式2
$arr1 = array("name" =>"haha","age"=>"18");
print_r($arr);
//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
?>
print_r输出
$arr1 = array("name" =>"haha","age"=>"18");
print_r($arr1); //Array ( [name] => haha [age] => 18 )
var_dump()输出
$arr1 = array("name" =>"haha","age"=>"18");
// 输出内容
// array (size=2)
// 'name' => string 'haha' (length=4)
// 'age' => string '18' (length=2)
二维数组
声明
var_dump($arr1);
echo '<br>';
$arr2 = array();
$arr2[0] = array(1,2,3,4,5);
$arr2[1] = array(1,2,3,4,5);
$arr2[2] = array(1,2,3,4,5);
var_dump($arr2);
// 输出内容
// array (size=3)
// 0 =>
// array (size=5)
// 0 => int 1
// 1 => int 2
// 2 => int 3
// 3 => int 4
// 4 => int 5
// 1 =>
// array (size=5)
// 0 => int 1
// 1 => int 2
// 2 => int 3
// 3 => int 4
// 4 => int 5
// 2 =>
// array (size=5)
// 0 => int 1
// 1 => int 2
// 2 => int 3
// 3 => int 4
// 4 => int 5
PHP请求
http协议请求方式
http协议的常用的请求方式:
- get 用来从服务器获取数据(参数一般作为查询条件)
- post 用来添加数据
- put 用来修改数据
- delete 用来删除数据
get请求
$f = $_GET['flag']; // 获取url地址中传递的参数
echo $f;
post请求
$name = $_POST['name'];
$age = $_POST['age'];
解决乱码
header("Content-type:text/html;charset=utf-8");
json_encode() 把数组或者对象转换成字符串
Ajax
Ajax发送请求的步骤
-
创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
标准做法
var xhr = new XMLHttpRequest();
早期IE(IE6)
var xhr = new ActiveXObject('Microsoft.XMLHTTP')
处理兼容
var xhr = null; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); //标准 } else { xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
-
准备发送
xhr.open(请求方式, 请求地址, 同步/异步); // 默认异步(true)、同步(false)
格式
-
参数1:请求方式(get获取数据,post提交数据)
1.get请求
encodeURI() 用来处理get请求对中文参数进行编码,防止IE浏览器的中文乱码
2.post请求
参数通过send传递,不需要通过encodeURI()转码,必须要设置请求头信息
// 设置请求头信息 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-
参数2:请求地址
-
同步或者异步标志位,默认是true表示异步,false表示同步
如果是get请求那么请求参数必须在url中传递
xhr.open('get', '02get.php', true);
-
-
执行发送
xhr.send(null); // get请求传null,post传相应的数据
-
指定回调函数
onreadystatechange函数由浏览器来调用,调用的条件就是readyState状态发生变化(不包括从0变为1)
readyState的取值
- 等于0的时候,xhr对象初始化(已经创建完成)
- 等于1的时候,执行发送的动作(说明已经发送了请求)
- 等于2的时候,说明浏览器已经收到了服务器响应的全部数据
- 等于3的时候,正在解析数据
- 等于4的时候,数据已经解析完成,可以使用了
4表示服务器返回的数据已经可以使用了,但是这个数据不一定是正常的
xhr.status
用于判断数据是否正确
http的常见状态码
- 200表示数据响应正常
- 404没有找到请求的资源
- 500服务器端错误
这里的200表示数据是正常的
xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200) { var data = xhr.responseText; if (data == '1') { // 成功的操作 } else { // 失败的操作 } } } }
案例:模拟登陆(异步刷新)
界面
。。。。
Ajax
window.onload = function () {
var btn = document.getElementById('btn');
console.log(user);
console.log(pas);
btn.onclick = function () {
var user = document.getElementById('user').value;
var pas = document.getElementById('pas').value;
// 1. 创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
// 2.准备发送 xhr.open(请求方式, 请求地址, ...)
xhr.open('get', 'demo1.php?user=' + user + '&pas=' + pas, true);
// 3.发送请求
xhr.send(null);
// 指定回调函数
xhr.onreadystatechange = function () {
if (xhr.readyState == 4){
if (xhr.status == 200) {
var data = xhr.responseText;
var hint = document.getElementById('hint');
if (data === '1') {
hint.innerText = '登录成功';
} else if (data === '2') {
hint.innerText = '登录失败';
}
}
}
}
}
}
html
<form>
账号:<input type="text" name="user" id="user"><span id="hint"></span>
<br>
密码:<input type="text" name="pas" id="pas">
<br>
<input type="button" value="登录" id="btn">
</form>
php
<?php
$user = $_GET['user'];
$pas = $_GET['pas'];
if ($user == "admin" && $pas == "123") {
echo '1';
} else {
echo '2';
}
?>
AJAX数据格式
XML 数据格式
响应数据用responseXML
这种数据格式的弊端:
- 元数据占用的数据量比较大,不利于大量数据的网络传输
- 解析不太方便
<?xml version="1.0" encoding="utf-8" ?>
<booklist>
<book>
<name>数据结构</name>
<athour>哈哈</athour>
<desc>这很重要</desc>
</book>
<book>
<name>算法导论</name>
<athour>小白</athour>
<desc>这很very重要</desc>
</book>
<book>
<name>操作系统原理</name>
<athour>小红</athour>
<desc>我就不多说!</desc>
</book>
</booklist>
DOM树遍历
// DOM树遍历
function fn (obj) {
for (var i = 0, len = obj.children.length; i < len; i++) {
var ele = obj.children[i];
if (ele.children.length > 0) {
fn(ele);
} else {
console.log(ele.nodeName+'//'+ele.innerHTML);
}
}
}
JSON 数据格式
响应数据用responseText
json数据和普通的js对象的区别:
- json数据没有变量
- json形式的数据结尾没有分号
- json数据中的键必须用双引号包住
{
"name":"张三",
"age":12,
"lover":["唱歌", "跳舞"],
"friend":{
"high":"180",
"weight":"80kg"
}
}
json数据解析
-
JSON.parse(字符串)
解析为对象
-
JSON.stringify(对象)
解析为字符串
-
eval("("+字符串")")
解析为对象,但是不安全,不推荐使用
//1. 字符串解析为对象
JSON.parse(str);
//2. 对象转为字符串
JSON.stringify(obj);
json数据接口
数组可以理解为一种json格式
<?php
// 模拟数据
$uname = '张三';
$age = 12;
// 发送字符串
ecno '{"uname":"'.$uname.'","age":"'.$age.'"}';
// 利用PHP api转为json格式
$arr = array("tom", "jerry", "spike");
$str = json_encode($arr);
echo $str
?>
初步理解异步效果
- 页面加载的同步与异步(白屏与不刷新)
- 普通的页面效果:w3scholl.org
- 页面刷新的效果:例如评论加载
- 描述两者之间的行为方式
- 同步 彼此等待(浏览器与用户) — 阻塞
- 异步 各做各的(浏览器与用户) — 非阻塞
js的处理机制
js底层 单线程+事件队列
事件队列中的任务执行的条件:
- 主线程已经空闲
- 任务满足触发条件
- 定时函数(延迟事件已经达到)
- 事件函数(特定事件被触发)
- ajax的回调函数(服务器端有数据响应)
Ajax初步封装
Ajax封装代码
/**
*
* @param {*} type 请求方式
* @param {*} url 请求地址
* @param {*} para 参数
* @param {*} dataType 返回的数据类型
* @param {*} fn 回调函数
*/
function ajax(type, url, para, dataType, fn) {
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
if (type === 'get') {
xhr.open(type, url+'?'+para);
} else {
xhr.open(type, url);
}
var data = null;
if (type === 'post') {
data = para;
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhr.send(data);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = xhr.responseText;
console.log(data);
if (dataType === 'json') {
data = JSON.parse(data);
}
fn(data);
}
}
}
}
案例(输入图片编号,查询图书)
<title>查询图书</title>
<script src="demp2.js"></script>
<script>
window.onload = function () {
var btn = document.getElementById('btn');
btn.addEventListener('click', function () {
var ipt = document.getElementById('ipt').value;
ajax('post', 'book.php', 'sno=' + ipt, 'json', function (data) {
var res = document.getElementsByClassName('res')[0];
if (data.flag === '1') {
res.innerText = "查无此书!!";
} else {
var str = '<ul><li>' + data.bookname + '</li><li>' + data.author +
'</li><li>' + data.desc + '</li></ul>';
res.innerHTML = str;
}
console.log(data);
});
}, false);
}
</script>
<body>
<div class="box">
<div class="ipt">
图书编号:<input type="text" name="sno" id="ipt">
<input type="button" value="查询" id="btn">
</div>
<div class="res">
</div>
</div>
</body>
<?php
$sno = $_POST['sno'];
$books = array();
$books['sgyy'] = array('bookname'=>'三国演义','author'=>'罗贯中','desc'=>'一个杀伐纷争的年代');
$books['shz'] = array('bookname'=>'水浒传','author'=>'施耐庵','desc'=>'108条好汉的故事');
$books['xyj'] = array('bookname'=>'西游记','author'=>'吴承恩','desc'=>'佛教与道教的斗争');
$books['hlm'] = array('bookname'=>'红楼梦','author'=>'曹雪芹','desc'=>'一个封建王朝的缩影');
if (array_key_exists($sno, $books)) {
echo json_encode($books[$sno]);
} else {
echo '{"flag":"1"}';
}
?>
jQuery 库中的Ajax
$.ajax()/$.post()/$.get()
$.post('请求地址','json',function(){});
$.ajax({
type:get/post,
url:请求的地址,
data:发送到后台的数据,"name=John&location=Boston"/{name:'John'},
dataType:'xml/text/json/jsonp/script/html',
success:function(msg){msg就是后台返回的数据},
error:function(){
// 服务器端错误执行的
}
})
Ajax跨域
同源策略
-
同源策略是浏览器的一种安全策略,所谓同源指的是请求URL地址中的
协议
、域名
和端口
都相同,只要其中之一不相同就是跨域 -
同源策略主要为了保证浏览器的安全性
-
在同源策略下,浏览器不允许Ajax跨域获取服务器数据
当前的页面地址:http://www.example.com/detail.html
URl | 不同的地方 |
---|---|
http://api.example.com/detail.html | 域名不同 |
https//www.example.com/detail.html | 协议不同 |
http://www.example.com:8080/detail.html | 端口不同 |
http://api.example.com:8080/detail.html | 域名、端口不同 |
https://api.example.com/detail.html | 协议、域名不同 |
https://www.example.com:8080/detail.html | 端口、协议不同 |
解决跨域
-
JSONP原理
JSONP的本质:
动态创建script标签,然后通过他的src属性发送跨域请求,然后服务器端响应的数据格式为【函数调用(foo(实参))】,所以在发送请求之前必须先声明一个函数,并且函数的名字与参数中传递的名字要一致。这里声明的函数是由服务器响应的内容(实际就是一段js代码)来调用-
静态script标签的src属性进行跨域请求
// 在script标签内容利用src进行跨域 <script src="http://ajax.com/ky.php"></script>
// 服务器端返回一条js语句 <?php echo 'var data = 456'; ?>
缺点:
- 要想使用数据必须要注意script标签的顺序问题
- 如果通过get请求传参,只能写死
- 如果对script标签加入async属性,可能会失败
async属性:表示异步加载资源,默认情况下是同步加载
-
动态创建script标签,通过标签的src属性发送请求
动态创建script标签发出去的请求是异步请求,所以无法直接访问
var script= document.createElement('script'); // 生成src链接,并且告诉后端的函数名 script.src = 'http://ajax.com/ky.php?callback=foo'; // 获取到head标签 var head = document.getElementsByTagName('head')[0]; // 把script标签添加到head里面 head.appendChild(script); // 服务器端返回的函数调用 function foo(data) { console.log(data); }
<?php $cb = $_GET['callback']; echo ''.$cb.'(456)'; ?>
利用上面的方式必须和服务器端的函数名保持一致
-
JQuery中JSONP的使用
$(function () {
$('button').click(function () {
$.ajax({
type: 'get',
url: 'http://ajax.com/ky.php',
// 指定数据类型
dataType: 'jsonp',
// 指定后端接受返回的函数名
jsonp: 'cb',
// 返回的函数名
jsonpCallback: 'abc',
success: function (data) {
console.log(data);
},
error:function () {
console.log('error');
}
});
});
});
-
jsonp属性的作用
自定义参数名字(callback=abc,这里的名字指的是等号前面的键,后端根据这个键获取方法名,jQuery的默认参数名称是callback)
-
jsonpCallback属性的作用
就是自定义回调函数的名字(callback=abc,这里的名字指的是等号后面的值)
模拟jQuery封装
function ajax(obj) {
// 定义默认属性
var defa = {
type: 'get',
url: '#',
data: {},
jsonp: 'callback',
jsonpCallback: '',
success: function (data) {
console.log(data);
}
}
// 拷贝传来的obj
for (var key in obj) {
defa[key] = obj[key];
}
// 指定回调函数接收的名字
var name = 'jQuery' + ('1.1.1.2' + Math.random()).replace(/\D/g, '') + '_' + new Date().getTime();
if (defa.jsonpCallback) {
name = defa.jsonpCallback;
}
// 生成参数
var str = '';
for (var key in defa['data']) {
str += key + '=' + defa['data'][key] + '&';
}
if (str) {
str = '&' + str;
str = str.substring(0, str.length - 1);
}
console.log(str);
// 动态创建script
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.src = defa.url + '?' + defa.jsonp + '=' + name + str;
head.appendChild(script);
// 接收后端返回的数据
window[name] = function (data) {
defa.success(data);
}
}
百度智能提示
页面布局
ajax代码
$(function () {
$('.search input').keyup(function () {
var text = $(this).val();
$.ajax({
url: 'https://www.baidu.com/sugrec',
data: {
wd: text,
prod: 'pc'
},
dataType: 'jsonp',
jsonp: 'cb',
success: function (data) {
console.log(data);
var tag = '';
$.each(data.g, function (i, e) {
tag += '<li class="li">' + e.q + '</li>';
});
$('ul').html(tag);
// 鼠标移入的效果
$('li').hover(function () {
$(this).css({backgroundColor:'deepskyblue','color':'#fff'});
}, function () {
$(this).css({'backgroundColor':'','color':'#000'});
});
}
});
if(text <0){
$('ul').hide();
} else {
$('ul').show();
}
});
});