深入理解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 )
相关推荐
JOEH60几秒前
为什么你的数据库连接总超时?99% 的 Java 程序员都踩过这 5 个坑
后端
后端不背锅2 分钟前
对外接口设计完全指南:安全、高性能、可演进
后端
xingxin329 分钟前
PHP代码分析溯源(第3题)
安全·web安全·网络安全·php
LlNingyu14 分钟前
文艺复兴,什么是CSRF,常见形式(一)
前端·安全·web安全·csrf
IT小崔18 分钟前
SqlSugar 使用教程
数据库·后端
Oneslide19 分钟前
Docker Compose 重启 RabbitMQ 数据丢失?
后端
架构师沉默21 分钟前
为什么国外程序员都写独立博客,而国内都在公众号?
java·后端·架构
开心就好202525 分钟前
Win11 抓包工具怎么选?网页请求与设备流量抓取
后端·ios
爱丽_39 分钟前
Spring 事务:传播行为、失效场景、回滚规则与最佳实践
java·后端·spring
用户3167361303421 小时前
SSE消息推送前后端代码
前端·后端