# PHP如何實現校驗
在Web開發中,數據校驗是保障系統安全性和數據完整性的關鍵環節。PHP作為廣泛使用的服務端腳本語言,提供了多種數據校驗機制。本文將深入探討PHP中的各類校驗技術,包括基礎校驗、正則表達式、過濾器函數以及自定義校驗方案。
## 一、基礎數據校驗
### 1.1 空值校驗
```php
// 檢查變量是否為空
if (empty($_POST['username'])) {
echo "用戶名不能為空";
}
// 專門檢查字符串空值
if (strlen(trim($_POST['username'])) == 0) {
echo "用戶名不能只包含空格";
}
// 檢查是否為數字
if (!is_numeric($_POST['age'])) {
echo "年齡必須是數字";
}
// 檢查數組
if (!is_array($_POST['hobbies'])) {
echo "愛好必須為數組格式";
}
// 字符串長度校驗
$username = $_POST['username'];
if (strlen($username) < 6 || strlen($username) > 20) {
echo "用戶名長度需在6-20個字符之間";
}
PHP中使用preg_match()
函數進行正則校驗:
// 郵箱校驗
if (!preg_match("/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/", $_POST['email'])) {
echo "郵箱格式不正確";
}
// 手機號校驗(中國大陸)
if (!preg_match("/^1[3-9]\d{9}$/", $_POST['phone'])) {
echo "手機號格式不正確";
}
// 密碼強度校驗(至少8位,包含大小寫和數字)
if (!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/", $_POST['password'])) {
echo "密碼需至少8位且包含大小寫字母和數字";
}
(?:)
提高性能PHP提供了強大的過濾器擴展:
// 郵箱過濾
$email = filter_var($_POST['email'], FILTER_VALIDATE_EML);
if ($email === false) {
echo "無效的郵箱地址";
}
// 整數過濾
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT, [
'options' => [
'min_range' => 18,
'max_range' => 100
]
]);
過濾器 | 說明 |
---|---|
FILTER_VALIDATE_EML | 驗證郵箱地址 |
FILTER_VALIDATE_URL | 驗證URL |
FILTER_VALIDATE_IP | 驗證IP地址 |
FILTER_VALIDATE_MAC | 驗證MAC地址 |
FILTER_VALIDATE_FLOAT | 驗證浮點數 |
$filters = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EML,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 1]
]
];
$clean_data = filter_input_array(INPUT_POST, $filters);
class Validator {
private $errors = [];
public function validate(array $rules) {
foreach ($rules as $field => $rule) {
$value = $_POST[$field] ?? null;
foreach ($rule as $method => $params) {
if (!$this->$method($field, $value, $params)) {
$this->addError($field, "{$field}驗證失敗");
break;
}
}
}
return empty($this->errors);
}
private function required($field, $value, $params) {
return !empty($value);
}
private function email($field, $value, $params) {
return filter_var($value, FILTER_VALIDATE_EML) !== false;
}
// 其他校驗方法...
public function getErrors() {
return $this->errors;
}
}
$validator = new Validator();
$rules = [
'username' => ['required' => true, 'minLength' => 6],
'email' => ['required' => true, 'email' => true],
'age' => ['required' => true, 'numeric' => true, 'min' => 18]
];
if (!$validator->validate($rules)) {
print_r($validator->getErrors());
}
// 檢查用戶名是否已存在
function isUsernameUnique($username) {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE username = ?");
$stmt->execute([$username]);
return $stmt->fetchColumn() == 0;
}
// 使用預處理語句
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->execute([$_POST['username'], $_POST['email']]);
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
// 檢查文件類型
$allowed = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['avatar']['type'], $allowed)) {
die("只允許上傳JPEG/PNG圖片");
}
// 檢查文件大?。?MB以內)
if ($_FILES['avatar']['size'] > 2 * 1024 * 1024) {
die("文件大小不能超過2MB");
}
// 檢查實際文件類型
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['avatar']['tmp_name']);
if (!in_array($mime, $allowed)) {
die("無效的文件類型");
}
// 移動文件到安全目錄
$destination = 'uploads/' . uniqid() . '.jpg';
move_uploaded_file($_FILES['avatar']['tmp_name'], $destination);
}
// 生成Token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 表單中
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
// 驗證Token
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("CSRF驗證失敗");
}
// 輸出轉義
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// 使用HTML凈化庫
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
Respect/Validation:功能強大的校驗庫
v::email()->validate($input);
Symfony Validator:企業級校驗組件
$constraints = new Assert\Collection([
'email' => [new Assert\Email()],
'age' => [new Assert\PositiveOrZero()]
]);
PHP Filter:內置輕量級方案
數據校驗是Web開發中不可忽視的重要環節。PHP提供了從基礎到高級的多層次校驗方案,開發者應根據實際需求選擇合適的校驗策略。良好的校驗機制不僅能提升系統安全性,還能改善用戶體驗,減少無效數據的產生。建議在項目初期就建立完善的校驗規范,并隨著業務發展不斷優化校驗邏輯。 “`
注:本文實際約2600字,包含了PHP數據校驗的主要技術點和實現方案。如需精確控制字數,可適當增減示例代碼或調整章節內容。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。