PHP 过滤和验证数据

PHP 过滤和验证数据

用户输入不可信,必须过滤验证,这是Web开发的基本功。

1. 为什么要过滤验证

  • 防止 SQL 注入
  • 防止 XSS 攻击
  • 保证数据格式正确
  • 防止脏数据入库

2. filter_var 函数

PHP 内置过滤器,很好用。

验证邮箱

$email = 'test@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo '邮箱格式正确';
} else {
    echo '邮箱格式错误';
}

验证数字

$age = '20abc';
if (filter_var($age, FILTER_VALIDATE_INT)) {
    echo '是整数';
}

验证URL

$url = 'https://example.com';
if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo 'URL格式正确';
}

验证IP

$ip = '192.168.1.1';
if (filter_var($ip, FILTER_VALIDATE_IP)) {
    echo 'IP格式正确';
}

3. filter_input 获取并过滤

从 GET/POST 获取并过滤:

// 获取并过滤GET参数
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

// 获取并过滤POST参数
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

4. 过滤输入

过滤HTML标签

$str = '<script>alert(1)</script>你好';
// 去除HTML标签
echo strip_tags($str);

// HTML转义(安全输出)
echo htmlspecialchars($str);

过滤特殊字符

$str = "hello ' world";
// 转义单引号
echo addslashes($str);

5. 常用验证场景

验证手机号

function checkPhone($phone) {
    return preg_match('/^1[3-9]\d{9}$/', $phone);
}

if (checkPhone('13800138000')) {
    echo '手机号正确';
}

验证身份证

function checkIdCard($idcard) {
    return preg_match('/^\d{17}[\dXx]$/', $idcard);
}

验证用户名

// 4-16位,字母数字下划线
function checkUsername($name) {
    return preg_match('/^\w{4,16}$/', $name);
}

6. 安全建议

1)所有外部输入都要验证

  • GET、POST、COOKIE
  • 不要相信任何用户输入

2)用预处理防SQL注入

  • 不要自己拼接SQL
  • 用 PDO 预处理

3)输出时转义

  • 输出到HTML要 htmlspecialchars
  • 防止 XSS 攻击

4)白名单验证

  • 只接受允许的值
  • 不要用黑名单

7. 完整示例

// 接收用户注册信息
$username = trim($_POST['username']);
$email = trim($_POST['email']);
$age = (int)$_POST['age'];

$errors = [];

// 验证用户名
if (!preg_match('/^\w{4,16}$/', $username)) {
    $errors[] = '用户名4-16位字母数字下划线';
}

// 验证邮箱
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = '邮箱格式错误';
}

// 验证年龄
if ($age < 18 || $age > 100) {
    $errors[] = '年龄必须18-100岁';
}

if (empty($errors)) {
    // 验证通过,入库
    echo '注册成功';
} else {
    print_r($errors);
}

总结

PHP 过滤和验证数据要点:

  • 所有用户输入都不可信
  • 用 filter_var 验证格式
  • 用 filter_input 获取并过滤
  • 输出用 htmlspecialchars 防XSS
  • 用预处理防SQL注入
  • 用正则验证手机号、用户名
  • 白名单验证比黑名单好
  • 不要自己拼接SQL字符串

做Web开发,安全永远第一位。


emer 发布于  2026-10-9 07:26 

PHP 数组常用操作:从排序到过滤的完整指南

前言

数组是 PHP 里最常用的数据结构,没有之一。PHP 提供了 100 多个数组函数,很多人只知道其中几个。本文整理最常用的数组操作。

一、创建数组

<?php
// 索引数组
$arr1 = [1, 2, 3, 4, 5];

// 关联数组
$arr2 = ['name' => '张三', 'age' => 18];

// 空数组
$arr3 = [];

二、添加元素

<?php
$arr = [1, 2, 3];

// 末尾添加
$arr[] = 4; // [1, 2, 3, 4]
array_push($arr, 5); // [1, 2, 3, 4, 5]

// 开头添加
array_unshift($arr, 0); // [0, 1, 2, 3, 4, 5]

// 关联数组添加
$user = ['name' => '张三'];
$user['age'] = 18; // ['name' => '张三', 'age' => 18]

三、删除元素

<?php
$arr = [1, 2, 3, 4, 5];

// 删除末尾元素
array_pop($arr); // [1, 2, 3, 4]

// 删除开头元素
array_shift($arr); // [2, 3, 4]

// 删除指定元素
unset($arr[1]); // [0 => 2, 2 => 4],注意索引不连续

四、查找元素

<?php
$arr = ['a', 'b', 'c'];

// 值是否存在
in_array('b', $arr); // true

// 键是否存在
$user = ['name' => '张三', 'age' => 18];
array_key_exists('name', $user); // true

// 查找值的键
array_search('b', $arr); // 1

五、数组长度

<?php
$arr = [1, 2, 3];
count($arr); // 3
sizeof($arr); // 3(count 的别名)

六、排序

索引数组排序

<?php
$arr = [3, 1, 2, 5, 4];

sort($arr); // [1, 2, 3, 4, 5] 升序
rsort($arr); // [5, 4, 3, 2, 1] 降序

关联数组排序

<?php
$age = ['张三' => 20, '李四' => 18, '王五' => 25];

asort($age); // 按值升序,保持键名
ksort($age); // 按键升序
arsort($age); // 按值降序
krsort($age); // 按键降序

自定义排序

<?php
$users = [
    ['name' => '张三', 'age' => 20],
    ['name' => '李四', 'age' => 18],
    ['name' => '王五', 'age' => 25],
];

// 按 age 升序
usort($users, function ($a, $b) {
    return $a['age'] <=> $b['age'];
});

七、数组过滤

array_filter()

<?php
$arr = [1, 2, 3, 4, 5, 6];

// 过滤出偶数
$even = array_filter($arr, function ($n) {
    return $n % 2 == 0;
});
// [2, 4, 6]

array_map()

<?php
$arr = [1, 2, 3, 4, 5];

// 每个元素乘以 2
$doubled = array_map(function ($n) {
    return $n * 2;
}, $arr);
// [2, 4, 6, 8, 10]

array_walk()

<?php
$arr = ['a' => 1, 'b' => 2];

array_walk($arr, function (&$value, $key) {
    $value = $value * 10;
});
// ['a' => 10, 'b' => 20]

八、数组合并

<?php
$arr1 = [1, 2];
$arr2 = [3, 4];

// 数组合并
$merged = array_merge($arr1, $arr2); // [1, 2, 3, 4]

// + 运算符(保留第一个数组的键)
$result = $arr1 + $arr2;

九、数组切片

<?php
$arr = [1, 2, 3, 4, 5];

// 从第 2 个开始取 3 个
$slice = array_slice($arr, 1, 3); // [2, 3, 4]

// 从末尾取
$last = array_slice($arr, -2); // [4, 5]

十、键值操作

<?php
$user = ['name' => '张三', 'age' => 18];

// 所有键
array_keys($user); // ['name', 'age']

// 所有值
array_values($user); // ['张三', 18]

// 翻转键值
array_flip($user); // ['张三' => 'name', 18 => 'age']

十一、常用操作速查表

操作 函数
数组长度 count()
查找值 in_array()
查找键 array_key_exists()
排序 sort() / asort() / ksort()
过滤 array_filter()
映射 array_map()
合并 array_merge()
切片 array_slice()

十二、常见坑

  1. unset 后索引不连续:用 array_values() 重新索引
  2. array_merge 和 + 的区别:数字键 array_merge 会重新索引,+ 不会
  3. in_array 严格模式:加第三个参数 true 防止类型转换
  4. sort 会改变原数组:不是返回新数组

总结

PHP 数组操作的核心要点:

  1. 增删改查:array_push/pop/unshift/shift/unset
  2. 查找判断:in_array/array_key_exists/array_search
  3. 排序:sort/asort/ksort/usort
  4. 处理:array_filter/array_map/array_walk
  5. 合并切片:array_merge/array_slice

数组用好了,PHP 开发效率能提升一倍。


emer 发布于  2026-10-4 10:15 
'); })();