1.6PHP基础
PHP基础
文章目录
一、PHP简介与开发环境搭建
1.简介(学习PHP之前,需要对HTML和CSS有基本的了解)
- PHP(全称:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用的开源脚本。
- 脚本在服务器上执行
- PHP文件
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
- PHP 文件的默认文件扩展名是 “.php”
- PHP的用途
- PHP 可以生成动态页面内容
- PHP 可以创建、打开、读取、写入、关闭服务器上的文件
- PHP 可以收集表单数据
- PHP 可以发送和接收 cookies
- PHP 可以添加、删除、修改您的数据库中的数据
- PHP 可以限制用户访问您的网站上的一些页面
- PHP 可以加密数据
2.安装
- 对于初学者,我们可以安装集成环境,XAMPP。下载链接Download XAMPP (apachefriends.org)安装是只需一直next即可。
- 编写用vscode或者记事本都可
二、PHP基本语法
<?php
// PHP 代码
?>
#比如
<!DOCTYPE html>
<html>
<body>
<h1>My first PHP page</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
#输出语句
echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
<?php
echo "我","喜欢","你!";
//或者 echo 520 . "我"."喜欢"."你!";
?>
<?php
print "我喜欢你!";
?>
<?php
/*引号的问题
双引号:里面可以包裹字符串和变量
单引号:只能表示字符串,不能表示变量
反引号:用于执行操作系统命令并返回结果
*/
$what = "猫、狗";
echo "你喜欢的动物是什么? $what";
echo '你喜欢的动物是什么? $what';
echo `ipconfig`;
?>
//编码格式的问题
echo `ipconfig`; //gbk的编码格式,浏览器出现乱码
$result = `ipconfig`;
$result = iconv("GBK","UTF-8",$result);
echo "<br>$result";
三、变量与变量作用域
-
PHP变量是用于存储数据的容器,可以存储各种类型的数据,如字符串、整数、浮点数、数组等。变量名必须以$符号开头,后面跟着变量名。
-
变量作用域指的是变量的可见范围,即变量在哪些地方可以被访问和使用。在PHP中,变量的作用域分为全局作用域和局部作用域。
<?php $x=5; // 全局变量 function myTest() { $y=10; // 局部变量 echo "<p>测试函数内变量:<p>"; echo "变量 x 为: $x"; echo "<br>"; echo "变量 y 为: $y"; } myTest(); echo "<p>测试函数外变量:<p>"; echo "变量 x 为: $x"; echo "<br>"; echo "变量 y 为: $y"; ?>
-
全局作用域指的是变量在整个脚本中都可以被访问和使用,包括函数内部和外部。在函数内部如果要使用全局变量,需要使用global关键字声明。
<?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); echo $y; // 输出 15 ?>
-
局部作用域指的是变量只能在定义它的函数内部使用,函数外部无法访问。在函数内部定义的变量默认为局部变量,函数执行完毕后,变量会被销毁。
-
PHP还有一种特殊的变量作用域,即静态作用域。静态变量在函数执行完毕后不会被销毁,而是保留在内存中,下次调用函数时可以继续使用。静态变量可以使用static关键字声明。
<?php function myTest() { static $x=0; echo $x; $x++; echo PHP_EOL; // 换行符 } myTest(); myTest(); myTest(); ?>
-
四、常量与数据类型
1.常量
常量值被定义后,在脚本的其他任何地方都不能被改变。并且常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
name:必选参数,常量名称,即标志符。 value:必选参数,常量的值。
#比如
<?php
// 区分大小写的常量名
define("GREETING", "欢迎访问 Runoob.com");
echo GREETING; // 输出 "欢迎访问 Runoob.com"
?>
2.数据类型
PHP 支持以下几种数据类型:
-
String(字符串)
-
Integer(整型)
- 整数必须至少有一个数字 (0-9)
- 整数不能包含逗号或空格
- 整数是没有小数点的
- 整数可以是正数或负数
- 整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
-
Float(浮点型)
-
Boolean(布尔型)
- TRUE
- FALSE
-
Array(数组)
-
Object(对象)
-
首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。
然后我们在类中定义数据类型,然后在实例化的类中使用数据类型
-
-
NULL(空值)
-
Resource(资源类型)
- 使用 get_resource_type() 函数可以返回资源(resource)类型
-
可调用类型(Callable):可调用类型是一种可以被调用的数据类型,包括函数、方法、闭包等。可调用类型可以被当作参数传递给其他函数或方法,也可以被赋值给变量。
-
iterable:表示一个可迭代的对象,可以使用foreach循环遍历。
-
mixed:表示可以是任意类型的值。
3.命名规范
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母、数字以及下划线
变量名是区分大小写的
五、PHP运算符
1.算数运算符
- 取反运算 ~x:x取反,按二进制位进行”取反“运算。
- 并置 . :连接两个字符串。“lo”.“ve"结果是"love”
- 其余的加减乘除求余
2.赋值运算符
3.递增/递减运算符
4.比较运算符
运算符 | 名称 | 描述 | 实列 |
---|---|---|---|
x == y | 等于 | 如果x等于y,则返回true | 5==“5”,返回true |
x === y | 绝对等于 | 如果x等于y,且它们类型相同,则返回true | 5==“5”,返回false |
x!=y x<>y |
不等于 | 如果x不等于y,则返回true | 5<>8返回true |
x!==y | 不绝对等于 | 如果x不等于y,或它们类型不相同,则返回true | 5!==“5”,返回true |
5.逻辑运算符
运算符 | 名称 | 描述 | 实例 |
---|---|---|---|
x or y | 或 | 如果 x 和 y 至少有一个为 true,则返回 true | x=6 y=3 (x6 or y5) 返回 true |
! x | 非 | 如果 x 不为 true,则返回 true | x=6 y=3 !(x==y) 返回 true |
6.数组运算符
运算符 | 名称 | 描述 |
---|---|---|
x + y | 集合 | x 和 y 的集合 |
x == y | 相等 | 如果 x 和 y 具有相同的键/值对,则返回 true |
x === y | 恒等 | 如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true |
x != y | 不相等 | 如果 x 不等于 y,则返回 true |
x <> y | 不相等 | 如果 x 不等于 y,则返回 true |
x !== y | 不恒等 | 如果 x 不等于 y,则返回 true |
7.三元运算符
(expr1) ? (expr2) : (expr3)
对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
8.组合比较符
$c = $a <=> $b;
- 如果 $a > b ∗ ∗ , 则 ∗ ∗ b**, 则 ** b∗∗,则∗∗c 的值为 1。
- 如果 $a == b ∗ ∗ , 则 ∗ ∗ b**, 则 ** b∗∗,则∗∗c 的值为 0。
- 如果 $a < b ∗ ∗ , 则 ∗ ∗ b**, 则 ** b∗∗,则∗∗c 的值为 -1。
六、分支及循环
1.分支语句
-
if 语句 - 在条件成立时执行代码
-
if…else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
-
if…elseif…else 语句 - 在若干条件之一成立时执行一个代码块
-
switch 语句 - 在若干条件之一成立时执行一个代码块
<?php $favcolor="red"; switch ($favcolor) { case "red": echo "你喜欢的颜色是红色!"; break; case "blue": echo "你喜欢的颜色是蓝色!"; break; case "green": echo "你喜欢的颜色是绿色!"; break; default: echo "你喜欢的颜色不是 红, 蓝, 或绿色!"; } ?>
2.循环语句
-
for循环:
for (初始值; 条件; 增量) { 要执行的代码; } //简易时钟 date_default_timezone_set('Asia/Shanghai'); //设置时区 for ($i = 1;; $i++) { $j=date("H:i:s"); ob_flush(); flush(); // 刷新输出缓冲区 echo $j . "<br>"; sleep(1); // 等待1秒 }
- 初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。
- 条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。
- 增量:主要用于递增计数器(但可以是任何在循环的结束被执行的代码)。
-
while循环:
-
while - 只要指定的条件成立,则循环执行代码块
-
do…while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
do { 要执行的代码; } while (条件);
-
-
**foreach:**根据数组中每个元素来循环代码块
foreach ($array as $value) { // 执行操作 }
练手项目,不用正则表达式来判断某个字符串是不是手机号
<?php
$c = "12345878951";
$number = strlen($c);
$flag=0; //标志法
if($number<>11 ){
echo "不是手机号,长度不正确";
}
elseif( $c[0]<>1){
echo "不是手机号,首位不正确";
}
elseif($c[1]<=3 || $c[1]>9){
echo "不是手机号,第二位不正确";
}
else{
for($i=2;$i<$number;$i++){
if($c[$i]>=0 && $c[$i]<=9){
$flag=1;
}
else{
echo "不是手机号,第".($i+1)."位不是数字";
$flag=0;
break;
}
}
if($flag==1){
echo "该字符是手机号";
}
}
?>
七、函数
1.函数的构成
- 函数名:函数名称不能重复,名称必须可读性强,最好是动词或者动名词形式
- 函数可以有参数:形参和实参
- 函数有处理过程,函数体
- 函数可以有返回值,也可以没有
- 函数只有定义,不调用,代码不会运行
2.函数模型
<?php
function functionName(/*此处可以传参*/)
{
// 要执行的代码
/*可以有返回值,也可以没有*/
}
?>
利用函数完成手机号的判断
<?php
/**
* 定义一个检查手机号的函数
*/
function dePhone($phone){
$number = strlen($phone);
$flag=0;
if($number<>11 ){
echo "不是手机号,长度不正确";
}
elseif( $phone[0]<>1){
echo "不是手机号,首位不正确";
}
elseif($phone[1]<=3 || $phone[1]>9){
echo "不是手机号,第二位不正确";
}
else{
for($i=2;$i<$number;$i++){ //或者直接用is_numeric判断是否是数字
if($phone[$i]>=0 && $phone[$i]<=9){
$flag=1;
}
else{
echo "不是手机号,第".($i+1)."位不是数字";
$flag=0;
break;
}
}
if($flag==1){
echo "该字符是手机号";
}
}
}
dePhone("123456723A9");
?>
/**
* 定义一个检查手机号的函数
*is_numeric($phone)利用内置函数
*/
function checkPhone($phone)
{
if (strlen($phone) != 11 || $phone[0] <> 1 || $phone[1] <= 3 || $phone[1] > 9 || !is_numeric($phone)) {
return "经检测,不是手机号";
}
return "经检测,是手机号";
}
$result = checkPhone("1559555819A");
echo $result;
?>
八、正则表达式
正则表达式 – 教程 | 菜鸟教程 (runoob.com)
-
匹配函数:preg_match($, $)
/** * ip地址的匹配 */ function re_ip($ip) { $pattern = "/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"; $result = preg_match($pattern, $ip); if ($result) { echo "是ip地址"; } else { echo "不是ip"; } } re_ip("0.0.0.256");
-
查找函数:
preg_match_all(string $pattern, string $subject, string[][] $matches); $pattern:匹配规则; $subject:匹配字符串; $matches:匹配到的结果,是数组类型,输出的话用print_r()输出; /** * 查找一段字符中的ip地址 */ function check_ip($str){ $pattern = "/\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/"; preg_match_all($pattern,$str,$matches); print_r($matches[0]); } check_ip("我的ip地址是192.168.31.51和111.111.11.1;")
-
替换函数:
preg_replace(string|string[] $pattern, string|string[] $replacement, string|string[] $subject) $pattern:匹配的规则; $replacement:需要替换的内容; $subject:原来的字符串; /** * 替换一段字符中的ip地址 */ function replace_ip($str,$replacement){ $pattern = "/\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/"; $str=preg_replace($pattern,$replacement,$str); echo $str; } replace_ip("我的ip地址是192.168.31.51和111.111.11.1;","想知道?不可能");
九、数组
1.基本用法PHP 5 Array 函数 | 菜鸟教程 (runoob.com)
-
创建数组
利用array();函数 $cars=array("Volvo","BMW","Toyota");
-
数组长度:count();
$len = count($car); echo $len
-
修改某个值
$car[0] = "xxxx";
-
打印数组
print_r($car);
-
删除数组最后一个值
array_pop($car)
-
数组循环:foreach
foreach ($car as $i){ each $i; //输出数组每一个值 }
-
将字符串拆分成数组 explode();函数
$arr = explode(string $separator, string $string); $separator:分割的标志; $string: 需要分割的字符; $str = "123.456.789"; $arr = explode(".",$str); print_r($arr);
-
数组合并成字符串,使用implode();函数
$arr = array(12,34,56,78,9); $str = implode(",",$arr); echo $str;
2.关联数组
以key => value 组成的键值对。取值时常用key来取值,而不是下标
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
十、超全局变量
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
十一、前后端交互
1.三种方式
- 资源获取型
- 数据提交型
- AJAX提交:利用异步提交的方式,在不刷新当前页面的情况下,提交数据给后台
2.post请求
- 必须要使用form标签将所有表单元素包裹起来
- 必须要在form标签中指定action属性(URL地址)
- 必须要在form标签中指定method属性的提交方式为POST
- 标签中确保在form的标签中至少有一个提交按钮
3.AJAX请求
十二、PHP和MySQL实现用户登录和注册功能
<!-- login-ajax.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="jquery-3.4.1.min.js"></script>
<title>登录</title>
<style>
body {
background-image: url("https://tse2-mm.cn.bing.net/th/id/OIP-C.kQeGUiwM1FBjvI_A8K7w0AHaEo?w=288&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7");
background-size: auto;
}
#login-box {
width: 400px;
height: 400px;
background-color: white;
border-radius: 10px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}
#login-box h2 {
text-align: center;
margin-top: 0;
padding-top: 20px;
}
.fo {
margin: 0 auto;
width: 80%;
padding: 20px;
}
#login-box input[type="text"],
#login-box input[type="password"] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
#login-box input[type="submit"] {
width: 100%;
background-color: #4CAF50;
color: white;
padding: 14px 20px;
margin: 8px 0;
border: none;
border-radius: 4px;
cursor: pointer;
}
#login-box input[type="submit"]:hover {
background-color: #45a049;
}
#login-box span {
float: right;
padding-top: 16px;
}
</style>
<script>
function doPOST() {
//获取表单的值
var username = $("#username").val();
var password = $("#password").val();
//拼接请求
var param = "username=" + username + "&password=" + password;
//window.alert(param);
//利用ajax发送post请求,并获取响应
$.post('login.php', param, function (data) {
if(data == '登录成功'){
window.alert(data);
location.href="list.php"
}
else{
window.alert(data);
}
});
}
</script>
</head>
<body>
<div id="login-box">
<h2>Login</h2>
<div class="fo">
<label for="username">Username</label>
<input type="text" id="username" name="username" required>
<label for="password">Password</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="登录" οnclick="doPOST()">
<span><a href="signup.html"> Sign up</a></span>
</div>
</div>
</body>
</html>
<!-- login.php -->
<?php
/**
* 获取请求数据的方式
* GET
* POST
*/
$username = $_POST['username'];
$password = $_POST['password'];
// echo $username . '-' . $password;
/**
* PHP访问数据库
* 1.连接数据库
* 2.执行SQL语句
* 3.处理SQL语句
* 4.关闭数据库连接
*/
//连接数据库
$conn = mysqli_connect('127.0.0.1','root','你的密码','learn') or die("数据库连接不成功");
//设置格式
//mysqli_query($conn,"set name utf8");
//拼接SQL语句并执行
$sql = "select * from user where username='$username' and password='$password'";
$result = mysqli_query($conn,$sql);
if(mysqli_num_rows($result) == 1){
echo "登录成功";
}
else{
echo "登录失败";
}
//关闭数据库
mysqli_close($conn);
?>
<!-- signup.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册</title>
<style>
body {
background-image: url("https://tse2-mm.cn.bing.net/th/id/OIP-C.kQeGUiwM1FBjvI_A8K7w0AHaEo?w=288&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7");
background-size: auto;
}
#login-box {
width: 400px;
height: 400px;
background-color: white;
border-radius: 10px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}
#login-box h2 {
text-align: center;
margin-top: 0;
padding-top: 20px;
}
#login-box form {
margin: 0 auto;
width: 80%;
padding: 20px;
}
#login-box input[type="file"],
#login-box input[type="text"],
#login-box input[type="password"] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
#login-box input[type="submit"] {
width: 100%;
background-color: #4CAF50;
color: white;
padding: 14px 20px;
margin: 8px 0;
border: none;
border-radius: 4px;
cursor: pointer;
}
#login-box input[type="submit"]:hover {
background-color: #45a049;
}
#login-box span {
float: right;
padding-top: 16px;
}
</style>
</head>
<body>
<div id="login-box">
<h2>注册</h2>
<form action="signup.php" method="post" enctype="multipart/form-data">
<label for="photo">Photo</label>
<input type="file" name="photo" required>
<label for="username">Username</label>
<input type="text" id="username" name="username" required>
<label for="password">Password</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="注册">
<!-- οnclick="doSign()" -->
</form>
</div>
</body>
</html>
<!-- signup.php -->
<?php
$conn = mysqli_connect('127.0.0.1','root','你的密码','learn') or die("数据库连接不成功");
$tmpPath=$photo =$_FILES['photo']['tmp_name']; //文件临时路径
$filename = $_FILES['photo']['name'];
$username = $_POST['username'];
$password = $_POST['password'];
// echo "$photo" . "<br>";
// echo "$tmpPath" . "<br>";
// echo "$filename";
$sql = "select username from user where username='$username'";
$result = mysqli_query($conn, $sql);
$count = mysqli_num_rows($result);
if ($count >=1){
die('user-exists');
}
move_uploaded_file($tmpPath,'./up/'.$filename);
$sql = "insert into user(username, password, avatar, createtime) values('$username', '$password','$filename', NOW())";
mysqli_query($conn, $sql) or die('reg-fail');
mysqli_close($conn);
// echo "window.alert('注册成功,三秒后跳转')";
// sleep(3);
// header("Location:login-ajax.html");
// exit;
echo "<script>alert('注册成功,三秒后跳转到登录页面');setTimeout(function(){window.location.href='login-ajax.html';},3000);</script>";
?>