1.6PHP基础

  • 2023-05-06
  • dfer
  • 566
  • php

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>
#输出语句
echoprint 区别:
	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>";
?>