1.概述
最早用于维护个人主页
php大小写敏感
php变量只有全局和局部
2.环境搭建
安装apache
下载地址:
https://www.apachehaus.com/cgi-bin/download.plx?dli=WNjRXF1UNVjT6p0KWdUMrBlVOpkVFVFdWBDdrJ2d
解压 -> 修改conf\httpd.conf
# 修改为解压路径
Define SRVROOT "C:\sof\Apache24"
# 安装服务
"C:\sof\Apache24\bin\httpd.exe" -k install -n apache
# 如果错误提示:
# (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 : AH00072: make_sock: could not bind to address [::]:443
# 则为443端口被占用
# 修改配置文件 conf\extra\httpd-ahssl.conf 和 conf\extra\httpd-ssl.conf 中的443为442
# 重新安装服务
# 启动服务,双击 bin\ApacheMonitor.exe,点start
# 访问 http://localhost测试是否安装成功
安装php
# 下载php并解压,这里使用php-7.3.2-Win32-VC15-x64.zip
# 添加环境变量path
C:\sof\php
C:\sof\php\ext
# 修改apache配置conf\httpd.conf
----------
# 加载php模块
LoadModule php7_module "C:\\sof\\php\\php7apache2_4.dll"
# 添加php格式支持
AddType application/x-httpd-php .php
----------
# ApacheMonitor重启apache服务
# Apache24\htdocs目录添加php测试文件 phpinfo.php
-----
<?php
phpinfo();
?>
-----
# 浏览器访问: http://localhost/phpinfo.php 测试是否安装成功
3.php语法基础
<?php
// 格式化输出
echo "<pre>";
// 1.变量
/*$var1 = 'frankie';
echo $var1;*/
// 2.常量
/*define('CONST1', '100000');
// 常量不加$
echo CONST1;*/
// 3.表达式
// 函数表达式
/*function foo() {
return 5;
}
$ret = foo();
echo $ret;*/
// 4.数据类型
// Boolean Integer Float String Array Object NUll
// 查看表达式的值和类型,类似js typeof
//var_dump()
/* $bool1 = true;
$bool2 = false;
var_dump($bool1);
var_dump($bool2);
$bool3 = 0;
var_dump($bool3);
// 强制转换为bool值
var_dump((bool)$bool3);
$bool4 = '';
var_dump((bool)$bool4);
// 负值也是true,只有0是false*/
// 5.整形
/* $int1 = 10;
var_dump($int1);
// 8进制
$int2 = 011;
var_dump($int2);
// 16进制
$int3 = 0xff;
var_dump($int3);
// 二进制
$int4 = 0b1000;
var_dump($int4);*/
// 6.浮点型
/* $a = 3.14;
// 科学计数法
$b = 1.2e3;
// 幂
$c = 7E-10;*/
// 比较浮点数没有意义
// 7.字符串类型
// 字符串转义
// $str1 = 'frank say:\'吃了吗?\'';
// var_dump($str1);
// 字符串双引号中的内容可以对变量进行解析
// $str2 = "$str1";
// var_dump($str2);
// 字符串拼接使用.运算符
/* $str3 = 'hello'.'world';
var_dump($str3);
// 累加拼接
$str4 = 'hello ';
$str4 .= $str3;
var_dump($str4);*/
// 8.数组
// $arr1 = [1, 2, 3, 4, 5];
// var_dump($arr1);
// $arr1 = array('username'=>'frank', 'pwd'=>'123456');
// $arr2 = ['小明', '小红', 18, true];
// 数组不能用echo直接输出
// print_r($arr1);
// var_dump($arr2);
// 获取数组元素
// echo $arr1['username'];
// echo $arr2[1];
// 获取数组长度
// echo count($arr1);
// 数组添加原本不存在的key,不会补差
// $arr3 = [0 ,1, 2];
// $arr3[100] = 100;
// echo count($arr3);
// 9.对象
/* class Peo {
public $name = 'zhangsan';
function eat() {
echo '我会吃饭';
}
}
$obj = new Peo;
// 对象访问属性或方法使用->,.表示拼接
$obj->eat();
print_r($obj->name);*/
// 10.空值
// NULL不区分大小写
/* $temp = null;
var_dump($temp);*/
// 11. 运算符
/* $num1 = 100;
$num2 = 10;
// 累加
$num1+=$num2;
echo $num1;
// 表达式不能用echo输出
var_dump(true && false);*/
// 12.流程控制
/* $num = 80;
if($num > 60) {
echo '及格';
} else {
echo '不及格';
}*/
// 遍历
// $arr = ['aa', 'bb', 'cc', 'dd'];
/* for($i=0; $i < count($arr); $i++) {
echo($arr[$i]);
}*/
// foreach
/* foreach($arr as $a) {
echo $a;
}*/
/* foreach($arr as $k => $v) {
echo $k.':'.$v.' ';
}*/
// 12.inclue require 导入
// require如果没有文件会报错,一般用include
// include 'vars.php';
// echo $fruit;
// 13.函数
// 函数内部不能直接使用全局变量,需要使用global声明
/* $num = 100;
function fun() {
// 声明全局变量
global $num;
echo $num;
$num++;
}
fun();
echo $num;*/
?>
4.继承
<?php
echo '<pre>';
// 类声明
class Peo {
public $name = 'zhangsan';
private $pwd = '123';
public function show() {
echo 'hello';
}
// 公有方法访问私有属性
protected function getPwd() {
echo $this->pwd;
}
}
// 类常量 静态变量
// 两者可以直接通过类调用
// 继承
class Stu extends Peo{
// 类常量不可改变
const num = 100;
// 静态变量在类声明时执行一次
static $count = 200;
public function showFatherPwd() {
$this->getPwd();
}
}
// 对象创建
// $frank = new Peo;
// print_r($frank);
// $frank->show();
// echo $frank->name;
// $frank->getPwd();
// 类常量调用
// echo Stu::num;
// 静态变量调用
// echo Stu::$count;
// Stu::$count = 2000;
// 对象实例化时,静态变量不会重新声明
// $myStu = new Stu;
// echo Stu::$count;
// 构造函数
// 类自带和类名相同的构造函数,默认隐藏
$stu1 = new Stu;
// 子类调用父类方法
$stu1->show();
// 受保护属性只能在类内部和子类内部使用
$stu1->showFatherPwd();
5.AJAX
a3_jq_ajax.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jquery ajax请求</title>
</head>
<body>
<span>用户名:</span><input type="text" class="username"><br>
<span>密码:</span><input type="text" class="password"><br>
<button>get无参请求</button>
<button>get带参请求</button>
<button>post请求</button>
<script src="js/jquery-1.12.3.min.js"></script>
<script>
var $userNameInput = $('.username');
var $passwordInput = $('.password');
var $btns = $('button');
$btns.eq(0).click(function () {
$.ajax({
type: 'get',
url: 'a3_jq_ajax.php',
dataType: 'json',
success: function (res) {
console.log(res);
}
});
});
// get请求携带参数
$btns.eq(1).click(function () {
$.ajax({
type: 'get',
// 传递参数
url: 'a3_jq_ajax.php?username='+$userNameInput.val()+'&password='+$passwordInput.val()+'',
dataType: 'json',
success: function (res) {
console.log(res);
}
});
});
$btns.eq(2).click(function () {
$.ajax({
type: 'post',
url: 'a3_jq_ajax.php',
// post数据参数
data: {
uname: $userNameInput.val(),
upass: $passwordInput.val()
},
dataType: 'json',
success: function (res) {
console.log(res);
}
});
});
</script>
</body>
</html>
a3_jq_ajax.php
<?php
// $_GET内置对象表示前端get请求数据包
// echo代表返回前端数据
// json_encode()将数组对象等复杂值转换为json格式
// $arr = array('msg'=>'OK', 'info'=>'frank is happy');
// $_GET把前端数据返回前端
// $arr = array('msg'=>'OK', 'info'=>$_GET);
// $_POST前端发来的Post请求数据包
// post请求 TODO
$arr = array('msg'=>'OK', 'info'=>$_POST);
echo json_encode($arr);
?>
6.登录demo
a4_login_demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录demo</title>
</head>
<body>
<span>用户名:</span><input type="text" class="username"><br>
<span>密码:</span><input type="text" class="password"><br>
<button>用户登录</button>
<script src="js/jquery-1.12.3.min.js"></script>
<script>
var $userNameInput = $('.username');
var $passwordInput = $('.password');
$('button').click(function () {
$.ajax({
type: 'post',
url: 'a4_login_demo.php',
dataType: 'json',
// post数据参数
data: {
uname: $userNameInput.val(),
upass: $passwordInput.val()
},
success: function (res) {
console.log(res);
}
});
});
</script>
</body>
</html>
a4_login_demo.php
<?php
$username = $_POST['uname'];
$password = $_POST['upass'];
$success = array('msg'=>'ok');
// TODO php debug
if($username == 'frank' && $password == '123456') {
// 数组添加属性
$success['info'] = '0';
} else {
$success['info'] = '1';
}
echo json_encode($success);
?>
7.数据库操作
数据查询
<?php
echo "<pre>";
// 建立连接
$con = mysqli_connect('localhost', 'root', 'root', 'php_demo');
// var_dump($con)
// 判断是否连接成功
if($con) {
// 连接成功后添加辅助设置避免中文乱码
mysqli_query($con, "set names utf8");
mysqli_query($con, 'set character_set_client=utf8');
mysqli_query($con, 'set character_set_results=utf8');
// $sql = 'select * from userInfoList where 1';
$sql = "select password from userInfoList where username='zhangsan'";
$result = $con->query($sql);
// var_dump($result);
if($result->num_rows>0) {
$info = [];
// fetch_assoc从结果中拿一条
for($i=0;$row=$result->fetch_assoc();$i++){
$info[$i] = $row;
}
print_r($info);
// 获取某条数据
// echo $info[2]['username'];
// echo $info[2]['password'];
}
} else {
echo '连接失败';
}
?>
插入修改删除
<?php
/**
* 插入\修改\删除
*/
echo "<pre>";
$con = mysqli_connect('localhost', 'root', 'root', 'php_demo');
if($con) {
mysqli_query($con, "set names utf8");
mysqli_query($con, 'set character_set_client=utf8');
mysqli_query($con, 'set character_set_results=utf8');
// 字段名可以省略
// 插入
// $sql = "insert into userInfoList (username, password) values ('wangwu', '123')";
// 修改
// $sql = "update userInfoList set password = '987' where username='zhangsan'";
// 删除
$sql = "delete from userInfoList where username='zhangsan'";
$result = $con->query($sql);
var_dump($result);
} else {
echo '连接失败';
}
?>
8.后台用户名密码校验
<?php
/**
* 前后台交互
* User: Vincent
*/
// TODO
$username = $_POST['uname'];
$password = $_POST['upass'];
$success = array('msg'=>'OK');
$con = mysqli_connect('localhost', 'root', 'root', 'php_demo');
if($con) {
mysqli_query($con, "set names utf8");
mysqli_query($con, 'set character_set_client=utf8');
mysqli_query($con, 'set character_set_results=utf8');
$sql = "select * from userInfoList where 1";
$result = $con->query($sql);
$flag = 0;
if($result->num_rows>0) {
$info = [];
for($i=0;$row=$result->fetch_assoc();$i++) {
$info[$i] = $row;
}
// 用户名密码校验
for($j=0;$j<count($info);$j++) {
if($info[$j]['username'] == $username) {
if($info[$j]['password'] == $password) {
$success['infoCode'] = 0;
$flag = 1;
break;
}
}
}
if($flag == 0) {
$success['infoCode'] = 1;
}
} else {
$success['infoCode'] = 1;
}
} else {
echo '连接失败';
}
echo json_encode($success);
?>
9.单例模式
<?php
/**
* 单例模式
* User: Vincent
*/
class DBConnectionSingleton {
// 静态+私有声明单例对象
private static $con = null;
public static function getCon() {
if(!self::$con) {
self:$con = new self();
// 属性赋值
}
return self::$con;
}
}
$con1 = DBConnectionSingleton::getCon();
$con2 = DBConnectionSingleton::getCon();
print_r($con1 == $con2);
10.PDO
PDO是php和数据库的中间层,提供对不同数据库的通用操作
pdo操作数据库
SingletonPDO.php
<?php
class SingletonPDO {
private static $pdo = null;
public static function getPDO() {
if(self::$pdo == null) {
try {
self::$pdo = new PDO('mysql:host=localhost;dbname=php_demo', 'root', 'root');
} catch (PDOException $e) {
echo '出现错误, 信息为:'.$e->getMessage();
}
}
return self::$pdo;
}
}
a8_db_pdo.php
<?php
/**
* PDO方式连接数据库
* User: Vincent
*/
// require可能会引入多次, require_once只引入一次
require_once 'SingletonPDO.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec('set names utf8');
// 增
// $sql = "insert into userInfoList values ('zhaoliu', '123')";
// 删
// $sql = "delete from userInfoList where username='zhaoliu'";
// 改
// $sql = "update userInfoList set password = '1213' where username='frank'";
// 查
$sql = "select * from userInfoList where 1";
// 增删改结果处理
/* if($pdo->exec($sql)) {
echo 'success';
} else {
echo 'error';
}*/
// 查询结果处理
$result = $pdo->exec($sql);
var_dump($result);
异常处理
<?php
/**
* 异常处理
* User: Vincent
*/
// 第一类异常,直接try...catch捕获
try {
$pdo = new PDO('mysql:host=localhost;dbname=php_demo', 'root', 'root');
// 第二类异常,第二种处理方式,弹出警报,程序执行不中断
// $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
// 第二类异常,第三种处理方式,中断
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo '出现错误, 信息为:'.$e->getMessage();
}
$pdo->exec('set names utf8');
$sql = "update userInfoList set password='1234' where username='frank'";
if($pdo->exec($sql)) {
echo 'success';
} else {
// 第二类异常,第一种处理方式,通过errorCode和errorInfo属性实现
echo 'fail';
echo $pdo->errorCode();
echo $pdo->errorInfo();
}
预处理
<?php
/**
* 预处理prepare
* User: Vincent
*/
try {
$pdo = new PDO('mysql:host=localhost;dbname=php_demo', 'root', 'root');
} catch (PDOException $e) {
echo '出现错误, 信息为:'.$e->getMessage();
}
$pdo->exec('set names utf8');
// 占位符
//$sql = "insert into userInfoList values (?, ?)";
// 预处理
//$pdoso = $pdo->prepare($sql);
//echo $pdoso->execute(array('tianqi', '123'));
// bindColumn将执行结果的一列数据绑定到指定对象上
$sql = "select * from userInfoList";
$pdoso = $pdo -> prepare($sql);
$pdoso -> execute();
// 结果内容绑定到指定对象
$pdoso -> bindColumn(1, $username);
$pdoso -> bindColumn(2, $password);
while($row = $pdoso -> fetch(PDO::FETCH_COLUMN)) {
echo $username.'----'.$password;
}
bindValue
<?php
/**
* bindvalue
* User: Vincent
*/
require_once 'SingletonPDO.php';
$pdo = SingletonPDO::getPDO();
$pdo->exec('set names utf8');
$sql = "insert into userInfoList values (?, ?)";
$halfPro = $pdo->prepare($sql);
// bindValue提供更加灵活的参数构建方式
$halfPro -> bindValue(1, 'xiaohong');
$halfPro -> bindValue(2, '777');
$halfPro -> execute();
事务处理
<?php
/**
* 事务处理
* User: Vincent
*/
require_once 'SingletonPDO.php';
try {
$pdo = SingletonPDO::getPDO();
// 设置异常捕获状态为中断
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('set names utf8');
// 开启事务
$pdo -> beginTransaction();
$sql = "update userInfoList set password=? where username=?";
$halfPro = $pdo -> prepare($sql);
$halfPro -> execute(['321', 'frank']);
echo '=====修改frank=====';
$halfPro -> execute(['321', 'wuba']);
// 提交事务
$pdo -> commit();
} catch (PDOException $e) {
$pdo -> rollBack();
echo '事务回滚';
}
网友评论