深入理解PHP基础【代码审计实战指南】

文章目录

PHP是一种广泛应用于Web开发的开源脚本语言,易学且功能丰富,可用于动态网站、Web应用、命令行脚本和桌面应用。其强大的数据库支持和社区资源使它成为开发者的重要工具。

基础语法

  • 字符串拼接用"."

  • php能嵌套在html中

    • 代码示例:

      python 复制代码
      <!DOCTYPE html>
      <html lang="zh-CN">
      <head>
          <meta charset="UTF-8">
          <title>css样式优先级</title>
      </head>
      <body>
          <?php echo "唯有学习"; ?>
          <h1>使我快乐</h1>
          <?php echo date("Y-m-d H:i:s"); ?>
      </body>
      </html>

单双引号的区别

代码示例:

python 复制代码
<?php
header("Content-Type: text/html; charset=utf-8");
$name = 'kobe';
echo '最喜欢的NBA球星是' . $name . '<br>'; // 变量不加符号,遇到字符串拼接,需要加.连接
echo '最喜欢的NBA球星是$name<br>'; // 单引号,不解析变量,原样输出
echo "最喜欢的NBA球星是$name<br>"; // 双引号,解析变量
?>

前后端分离

代码示例:

python 复制代码
前端:text.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
//数据的提交都是用表单form提交的
//一个网站,大部分都是GET请求,只有通过form提交的才能发起POST请求
<form action="./login.php" method="get">//通过gei方法发送到login.php页面
    用户名:<input type="text" name="username">
    密码:<input type="text" name="password">
    <input type="submit" value="提交">
</form>
</body>
</html>
========================================================
后端   login.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>网页后台</title>
    <style>
    div{
    text-align:right;
    }
    </style>
</head>
<body>
<div>
    <?php
    $name=$_GET["username"];//接受text.html传来的数据
    echo "欢迎".$name."回来^_^";
    ?>
</div>
</body>
</html>

数据类型

  • 布尔类型

    • 0/1
    • false or true
  • 整型

    • 整数范围:-99999+99999
  • 浮点型

    • 小数:-1.9, 3.25, 3.00005
  • 字符串

    • hello
  • 数组

    • array
  • 对象

    • object
  • 资源类型

    • resource
  • NULL

PHP常量

php常量最好是全部大写

python 复制代码
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT;
?>

函数

var_dump函数

用于输出结果,其返回带有结果的类型,例如string(5) "value"

count函数

用于计算数组元素的个数

打印函数

readfile()函数

读取文件,并返回文件的长度

file_get_contents()函数

读取文件,支持本地和远程文件url

file_put_contents()函数

保存文件

header函数

用于发送原始 HTTP 头到客户端。

代码示例:

python 复制代码
header('Content-Type: text/html; charset=UTF-8');//设置内容类型
-----------------------------------------------------------------------
header('Location: http://www.example.com');//重定向
exit(); // 使用 exit() 终止脚本执行
-----------------------------------------------------------------------
//设置缓存控制
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1
header('Pragma: no-cache'); // HTTP 1.0
header('Expires: 0'); // Proxies
fopen函数

fopen 函数用于打开文件或 URL,以便进行读取或写入操作。

fread 函数

fread 函数用于从打开的文件中读取指定数量的字节。也可以创建文件(文件不存在时)

代码示例:

python 复制代码
user.txt:
zhansan:123456
lisi:123
wangwu:12345
zhaoliu:123
--------------------------------
1.php
<?php
header("Content-Type: text/html; charset=utf-8"); 
$a = fopen('user.txt', 'r'); 
//$size = filesize('user.txt'); 
//print_r($size); 
$b = fread($a, filesize('user.txt')); 
echo $b; 
fclose($a);
?>
结果:
zhansan:123456 lisi:123 wangwu:12345 zhaoliu:123
rename函数

将文件名重命名

用法:rename('原始名字','新名字')

copy()函数

将文件进行复制

用法:copy('原始路径','新路径')

unlink()函数

删除文件

file_exists()函数

判断文件是否存在,存在则返回true,不存在就返回false

运算符

运算符 名称 描述 实例 结果
x + y x 和 y 的和 2 + 2 4
x - y x 和 y 的差 5 - 2 3
x * y x 和 y 的积 5 * 2 10
x / y x 和 y 的商 15 / 5 3
x % y x 除以 y 的余数 5 % 2<br>10 % 8<br>10 % 2 1<br>2<br>0
-x 取负数 x 取负数 <?php $x = 2; echo -$x; ?> -2
a . b 并置 连接两个字符串 "Hi" . "Ha" HiHa

数组

普通数组
python 复制代码
<?php
// 数组普通数组
$d = array('张三风', '李四', '王五', '赵六'); // 数组元素下标 0-3
echo count($d);
echo $d[3];
echo "<hr>";
?>
结果:4赵六
关联数组
python 复制代码
<?php
// 数组关联数组
$a = array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 'name' => 'apple');
echo count($a);
echo $a["color"];
echo $a['name'];
?>
结果:4redapple
数组函数

array_keys() 返回数组的所有的键值

array_values() 返回数组的所有的值

array_rand() 从数组中随机抽取一个或多个元素,注意是键名

unset() 用于删除数组的键值

代码示例:
python 复制代码
<?php
$name = array('zhangsan', 'lisi', 'wangwu', 'zhaoliu', 'zhangchuan');
echo $name[array_rand($name)];//随机收取键值
echo "<hr>";
print_r($name);
unset($name[2]);//删除键值
echo "<hr>";
print_r($name);
?>
结果:
zhangchuan
Array ( [0] => zhangsan [1] => lisi [2] => wangwu [3] => zhaoliu [4] => zhangchuan )
Array ( [0] => zhangsan [1] => lisi [3] => zhaoliu [4] => zhangchuan )

php的控制结构

if-elseif
  1. 代码示例:

    python 复制代码
    <?php
    // ABC 其他 Sjixiao='F';
    if ($jixiao == 'A'){
        echo "发放1.2倍薪资";
    } elseif ($jixiao == 'B'){
        echo "正常发放薪资";
    } else if ($jixiao == ''){
        echo "发放90%薪资";
    } else {
        echo "发放80%薪资";
    }
    ?>
    结果:发放90%薪资
while
  1. 代码示例:

    python 复制代码
    <?php
    $i = 1;
    while ($i <= 10) {
        echo "今天天气真好";
        echo "<br>";
        $i++;
        echo "<br>";
    }
    ?>
    结果:
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
    
    今天天气真好
for结构
  1. 代码示例:

    python 复制代码
    <?php
    $d = array('张三风', '李四', '王五', '赵六');
    $changdu = count($d) - 1;
    for ($i = 0; $i <= $changdu; $i++) {
        echo "中奖用户是:" . $d[$i];
        echo "<br>";
    }
    ?>
    结果:
    中奖用户是:张三风
    中奖用户是:李四
    中奖用户是:王五
    中奖用户是:赵六
foreach遍历关联数组
  1. 代码示例:

    python 复制代码
    <?php
    $cars = array("特等奖" => "布加迪", "一等奖" => "捷豹", "二等奖" => "法拉利", "三等奖" => "玛莎拉蒂");
    foreach ($cars as $key => $value) {
        echo $key . "是" . $value;
        echo "<hr>";
    }
    ?>
    结果:
    特等奖是布加迪
    一等奖是捷豹
    二等奖是法拉利
    三等奖是玛莎拉蒂

自定义函数

无传参函数
  1. 代码示例:

    python 复制代码
    <?php
    function func1(){
        echo "hello,word";
    }
    func1();
    ?>
    结果:
    hello,word
  2. 有传参函数

    1. 代码示例:

      python 复制代码
      <?php
      function qiuouhe($a) {
          $sum = 0;
          for($i = 1; $i <= $a; $i++) {
              $jieguo = $i % 2;
              if ($jieguo == 0) {
                  $sum += $i;
              }
          }
          echo "1到$a 的所有偶数的和:$sum";
      }
      
      qiuouhe(1000);
      ?>
      结果:
      1到1000 的所有偶数的和:250500

数学函数和字符串函数

参考文档:PHP Math 函数 (w3school.com.cn)

数学函数
  1. 代码示例:

    python 复制代码
    echo abs(-4.2); // 绝对值函数,返回 -4.2 的绝对值,即 4.2
    echo "<br>"; 
    
    echo ceil(9.01); // 向上取整函数,返回大于或等于 9.01 的最小整数,即 10
    echo "<br>";
    
    echo floor(9.999); // 向下取整函数,返回小于或等于 9.999 的最大整数,即 9
    echo "<br>";
    
    echo pow(2, 4); // 幂函数,返回 2 的 4 次方,即 16
    echo "<br>";
    
    echo round(1.95583, 2); // 四舍五入函数,返回 1.95583 保留两位小数的值,即 1.96
    echo "<br>";
    
    echo mt_rand(1, 9); // 生成一个介于 1 和 9 之间的伪随机整数
    echo "<br>";
    
    echo rand(1, 9); // 生成一个介于 1 和 9 之间的伪随机整数
    echo "<br>";
    
    echo round(pi(), 2); // 返回圆周率 π 保留两位小数的值,即 3.14
    echo "<br>";
    结果:
    4.2
    10
    9
    16
    1.96
    9
    8
    3.14
字符串函数
  ###### trim函数

  1. 去掉字符串**两端**的空格或其他指定符号

  2. 代码示例:

     ```python
     <?php
     $str=" dms ";
     echo trim($str," ");
     ?>
     结果:dms
     ```
  ###### dirname函数

  1. 代码示例:

     ```python
     <?php
     $pic_path = 'C:\Users\29691\Desktop\mysite\1.jpg'; 
     echo dirname($pic_path); 
     echo "<br>";
     echo dirname($pic_path) . '\2.jpg'; 
     ?>
     结果:
     C:\Users\29691\Desktop\mysite
     C:\Users\29691\Desktop\mysite\2.jpg
     ```
  ##### str_pad函数

  1. 代码示例:

     ```python
     <?php
     for ($i = 1; $i <= 999; $i++) {
         echo str_pad($i, 3, '0', STR_PAD_LEFT);//左填充到3位数,默认是右填充
         echo "<br>";
     }
     ?>
     结果:
     001
     002
     003
     004
     005
     006
     007
     008
     009
     010
     011
     012
     013
     014
     015
     ...
     ```
  ##### explode函数

  1. 代码示例:

     ```python
     <?php
     $a=str_repeat("今天天气真好",13);
     $b=explode('.',$a);
     var_dump($b);
     ?>
     结果:
     array(1) { [0]=> string(234) "今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好今天天气真好" }
     ```

命令执行函数

system函数

用法:system('whoami')

passthru()函数

用法: passthru('whoami')

exec()函数

该函数无回显,需要利用echo函数配合进行回显

python 复制代码
<?php
echo exec('whoami');
?>
shell_exec()函数

同exec函数一样无回显,利用方式一样

代码示例:

python 复制代码
<?php
// exec() 示例
$output = [];
exec('whoami', $output);
print_r($output); // 输出所有行
echo '<hr>';
// shell_exec() 示例
$output = shell_exec('whoami');
echo $output; // 输出完整内容
?>
结果:
Array ( [0] => cong\cong )
cong\cong
popen 函数

用于打开一个进程并建立一个管道,以便可以与该进程进行输入或输出的交互。(可执行命令)

代码示例:

python 复制代码
$handle = popen('dir', 'r');
if ($handle) {
    while (!feof($handle)) {
        $line = fgets($handle);
        echo $line; // 输出每一行
    }
    pclose($handle); // 关闭管道
} else {
    echo "无法打开进程。";
}

php的错误处理

错误显示:

python 复制代码
<?php
ini_set('display_errors', 1); // 显示错误,注意可能会有敏感文件路径泄露
?>

错误级别:

错误类型 说明
E_ERROR 错误,文件直接中断
E_WARNING 警告,问题比较严重,但还是会继续向下运行
E_NOTICE 提示,有些小问题不会影响到程序。常发生在项目未定义
E_PARSE 编译时语法解析错误。解析错误仅仅分析器产生。
E_ALL 所有的错误
E_STRICT 启用PHP对代码的修改建议,以确保代码具有最佳的操作性和前向兼容性。
E_DEPRECATED 启用后将会在未来版本中可能无法正常工作的代码给予警告。

php操作mysql

代码示例:

python 复制代码
<?php
$link = mysqli_connect('127.0.0.1', 'root', 'password', 'pikachu');
var_dump($link);
echo '<hr>';

$sql = 'SELECT * FROM users;';
$result = mysqli_query($link, $sql);
var_dump($result);
echo '<hr>';

while ($row = mysqli_fetch_array($result)) {
    print_r($row);
}
echo '<hr>';
?>
解读:
1. mysqli_connect函数用于与数据库建立连接
2. mysqli_query函数用于执行数据库操作,用法:mysqli_query('数据库链接','SELECT、INSERT、UPDATE、DELETE 等数据库操作')
3. mysqli_query函数只能返回一个结果集,mysqli_fetch_array函数只能获取一行数据,故通过while循环来获取大量数据
结果:
object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "127.0.0.1 via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.7.26" ["server_version"]=> int(50726) ["stat"]=> string(135) "Uptime: 37925 Threads: 1 Questions: 383 Slow queries: 0 Opens: 125 Flush tables: 1 Open tables: 28 Queries per second avg: 0.010" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(53) ["warning_count"]=> int(0) }
--------------------------------------------------------------------------------
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(4) ["lengths"]=> NULL ["num_rows"]=> int(3) ["type"]=> int(0) }
--------------------------------------------------------------------------------
Array ( [0] => 1 [id] => 1 [1] => admin [username] => admin [2] => e10adc3949ba59abbe56e057f20f883e [password] => e10adc3949ba59abbe56e057f20f883e [3] => 1 [level] => 1 ) Array ( [0] => 2 [id] => 2 [1] => pikachu [username] => pikachu [2] => 670b14728ad9902aecba32e22fa4f6bd [password] => 670b14728ad9902aecba32e22fa4f6bd [3] => 2 [level] => 2 ) Array ( [0] => 3 [id] => 3 [1] => test [username] => test [2] => e99a18c428cb38d5f260853678922e03 [password] => e99a18c428cb38d5f260853678922e03 [3] => 3 [level] => 3 )
相关推荐
羚通科技27 分钟前
视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍
linux·arm开发·数据库·算法·php
打鱼又晒网36 分钟前
linux文件——文件系统与内存管理——理解打开文件, 写入数据与文件系统的关系
linux·运维·服务器·后端·操作系统
jingling55536 分钟前
后端开发刷题 | 最长公共子序列(非连续)
java·开发语言·数据结构·后端·算法
开心工作室_kaic1 小时前
基于Java的旅游服务管理系统的设计与实现(论文+源码)_kaic
android·java·开发语言·学习·安全·c#·旅游
q567315232 小时前
基于Django的MySQL项目建设计划
数据库·后端·python·mysql·django
背着吉他去流浪2 小时前
5、Django Admin后台移除“删除所选”操作
后端·python·django
爱技术的小伙子2 小时前
【网络安全协议】SSL/TLS、IPSec等网络安全协议的原理与应用
安全·web安全·ssl
云卓科技2 小时前
无人机之传感器篇
科技·安全·机器人·无人机·制造
云卓科技2 小时前
无人机之地面站篇
科技·安全·机器人·无人机·制造
你今天论文了吗2 小时前
网络安全应急响应技术原理与应用
网络·安全·web安全·网络安全