PHP超级全局变量
超级全局变量是PHP中预定义的、在任何作用域内都可以访问的变量。这些变量在整个PHP脚本中都可用,无需使用global关键字即可访问。超级全局变量主要用于获取用户输入、服务器信息和会话数据等。
PHP超级全局变量列表
PHP中的超级全局变量如下:
- $GLOBALS - 引用全局作用域中可用的全部变量
- $_SERVER - 服务器和执行环境信息
- $_REQUEST - HTTP请求参数(包括GET, POST, COOKIE等)
- $_POST - 通过POST方法传递的参数
- $_GET - 通过GET方法传递的参数
- $_FILES - 通过HTTP POST上传的文件
- $_ENV - 环境变量
- $_COOKIE - HTTP Cookie
- $_SESSION - 会话变量
$GLOBALS
$GLOBALS是一个关联数组,包含了所有全局变量。变量名是数组的键,变量值是数组的值。
<?php
$x = 10;
$y = 20;
function add() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
add();
echo $z; // 输出: 30
?>
$GLOBALS数组的使用场景:当需要在函数内部访问全局变量时,可以使用$GLOBALS数组,而不必使用global关键字。
$_SERVER
$_SERVER是一个包含服务器和执行环境信息的关联数组。其内容由Web服务器提供,可能因服务器不同而有所差异。
常用的$_SERVER元素
元素 | 描述 |
---|---|
PHP_SELF | 当前执行脚本的文件名,相对于文档根目录 |
GATEWAY_INTERFACE | 服务器使用的CGI规范版本 |
SERVER_ADDR | 服务器的IP地址 |
SERVER_NAME | 服务器的主机名 |
SERVER_SOFTWARE | 服务器标识字符串 |
SERVER_PROTOCOL | 请求页面时通信协议的名称和版本 |
REQUEST_METHOD | 访问页面时使用的请求方法(GET, POST等) |
REQUEST_TIME | 请求开始的时间戳 |
REQUEST_TIME_FLOAT | 请求开始的时间戳(微秒级精度) |
QUERY_STRING | 查询字符串(URL中?后面的部分) |
HTTP_ACCEPT | 当前请求的Accept头信息 |
HTTP_ACCEPT_CHARSET | 当前请求的Accept-Charset头信息 |
HTTP_HOST | 当前请求的Host头信息 |
HTTP_REFERER | 用户从哪个页面链接过来的 |
HTTP_USER_AGENT | 用户代理(浏览器类型) |
HTTPS | 如果通过HTTPS访问,则为on;否则为空 |
REMOTE_ADDR | 用户IP地址 |
REMOTE_HOST | 用户主机名 |
REMOTE_PORT | 用户机器上连接到Web服务器的端口号 |
SCRIPT_FILENAME | 当前执行脚本的绝对路径 |
SERVER_ADMIN | 服务器管理员的电子邮件地址 |
SERVER_PORT | Web服务器使用的端口 |
SERVER_SIGNATURE | 服务器版本和虚拟主机名的字符串 |
PATH_TRANSLATED | 当前脚本所在的文件系统(非文档根目录)的基本路径 |
SCRIPT_NAME | 包含当前脚本的路径 |
REQUEST_URI | 访问此页面所需的URI |
DOCUMENT_ROOT | 当前运行脚本所在的文档根目录 |
HTTP_CONNECTION | 当前请求的Connection头信息 |
HTTP_COOKIE | 当前请求的Cookie头信息 |
HTTP_X_FORWARDED_FOR | 通过代理服务器访问时,原始IP地址 |
HTTP_X_FORWARDED_PROTO | 通过代理服务器访问时,原始协议 |
示例:显示服务器信息
<?php
// 显示当前页面的URL
echo "当前页面URL: " . $_SERVER['REQUEST_URI'] . "<br>";
// 显示用户IP地址
echo "用户IP地址: " . $_SERVER['REMOTE_ADDR'] . "<br>";
// 显示用户浏览器信息
echo "用户浏览器: " . $_SERVER['HTTP_USER_AGENT'] . "<br>";
// 显示服务器名称
echo "服务器名称: " . $_SERVER['SERVER_NAME'] . "<br>";
// 显示请求方法
echo "请求方法: " . $_SERVER['REQUEST_METHOD'] . "<br>";
?>
$_REQUEST
$_REQUEST是一个关联数组,包含了通过GET、POST和COOKIE机制提交的变量。默认情况下,它包含了$_GET、$_POST和$_COOKIE的内容。
<?php
// 假设表单提交了名为"username"的字段
echo "用户名: " . $_REQUEST['username'];
?>
注意:$_REQUEST的内容和顺序取决于php.ini文件中的request_order和variables_order设置。出于安全考虑,在处理敏感数据时,建议直接使用$_GET或$_POST而不是$_REQUEST。
$_POST
$_POST是一个关联数组,包含了通过HTTP POST方法提交的变量。常用于处理表单数据。
表单提交示例
<!-- HTML表单 -->
<form method="post" action="process_form.php">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
<?php
// process_form.php
// 处理表单数据
echo "提交的用户名: " . $_POST['username'] . "<br>";
echo "提交的密码: " . $_POST['password'] . "<br>";
?>
数组形式的表单元素
<!-- HTML表单(数组形式的元素)-->
<form method="post" action="process_form.php">
兴趣爱好: <br>
<input type="checkbox" name="hobbies[]" value="reading"> 阅读<br>
<input type="checkbox" name="hobbies[]" value="music"> 音乐<br>
<input type="checkbox" name="hobbies[]" value="sports"> 运动<br>
<input type="submit" value="提交">
</form>
<?php
// process_form.php
// 处理数组形式的表单数据
if (isset($_POST['hobbies'])) {
echo "您选择的兴趣爱好: <br>";
foreach ($_POST['hobbies'] as $hobby) {
echo $hobby . "<br>";
}
}
?>
嵌套数组形式的表单元素
<!-- HTML表单(嵌套数组形式的元素)-->
<form method="post" action="process_form.php">
用户1: <br>
姓名: <input type="text" name="users[0][name]"><br>
年龄: <input type="text" name="users[0][age]"><br>
<br>
用户2: <br>
姓名: <input type="text" name="users[1][name]"><br>
年龄: <input type="text" name="users[1][age]"><br>
<input type="submit" value="提交">
</form>
<?php
// process_form.php
// 处理嵌套数组形式的表单数据
if (isset($_POST['users'])) {
echo "用户信息: <br>";
foreach ($_POST['users'] as $user) {
echo "姓名: " . $user['name'] . ", 年龄: " . $user['age'] . "<br>";
}
}
?>
$_GET
$_GET是一个关联数组,包含了通过HTTP GET方法提交的变量。这些变量通常出现在URL查询字符串中。
URL查询参数示例
<?php
// 假设URL是: http://example.com/index.php?id=10&name=john
echo "ID: " . $_GET['id'] . "<br>";
// 输出: ID: 10
echo "姓名: " . $_GET['name'] . "<br>";
// 输出: 姓名: john
?>
页面导航示例
<!-- 分页导航链接 -->
<a href="products.php?page=1">第1页</a>
<a href="products.php?page=2">第2页</a>
<a href="products.php?page=3">第3页</a>
<?php
// products.php
// 获取当前页码,默认为1
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
echo "当前页码: " . $page;
?>
$_FILES
$_FILES是一个关联数组,包含了通过HTTP POST上传的文件信息。
文件上传表单示例
<!-- 文件上传表单 -->
<form method="post" action="upload_file.php" enctype="multipart/form-data">
选择文件: <input type="file" name="user_file">
<input type="submit" value="上传">
</form>
<?php
// upload_file.php
// 处理文件上传
if (isset($_FILES['user_file'])) {
// 文件信息
$file_name = $_FILES['user_file']['name'];
$file_tmp = $_FILES['user_file']['tmp_name'];
$file_size = $_FILES['user_file']['size'];
$file_error = $_FILES['user_file']['error'];
$file_type = $_FILES['user_file']['type'];
echo "文件名: " . $file_name . "<br>";
echo "文件大小: " . $file_size . " 字节<br>";
echo "文件类型: " . $file_type . "<br>";
// 检查是否有错误
if ($file_error === UPLOAD_ERR_OK) {
// 定义上传目录
$upload_dir = 'uploads/';
// 创建上传目录(如果不存在)
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0777, true);
}
// 移动文件到上传目录
$destination = $upload_dir . basename($file_name);
if (move_uploaded_file($file_tmp, $destination)) {
echo "文件上传成功!";
} else {
echo "文件上传失败!";
}
} else {
echo "上传错误: " . $file_error;
}
}
?>
多个文件上传示例
<!-- 多个文件上传表单 -->
<form method="post" action="upload_multiple_files.php" enctype="multipart/form-data">
选择文件: <input type="file" name="user_files[]" multiple>
<input type="submit" value="上传">
</form>
<?php
// upload_multiple_files.php
// 处理多个文件上传
if (isset($_FILES['user_files'])) {
$uploaded_files = $_FILES['user_files'];
for ($i = 0; $i < count($uploaded_files['name']); $i++) {
$file_name = $uploaded_files['name'][$i];
$file_tmp = $uploaded_files['tmp_name'][$i];
$file_size = $uploaded_files['size'][$i];
$file_error = $uploaded_files['error'][$i];
$file_type = $uploaded_files['type'][$i];
echo "文件 " . ($i+1) . ":<br>";
echo "文件名: " . $file_name . "<br>";
echo "文件大小: " . $file_size . " 字节<br>";
echo "文件类型: " . $file_type . "<br>";
// 检查是否有错误
if ($file_error === UPLOAD_ERR_OK) {
// 定义上传目录
$upload_dir = 'uploads/';
// 创建上传目录(如果不存在)
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0777, true);
}
// 移动文件到上传目录
$destination = $upload_dir . basename($file_name);
if (move_uploaded_file($file_tmp, $destination)) {
echo "文件上传成功!";
} else {
echo "文件上传失败!";
}
} else {
echo "上传错误: " . $file_error;
}
echo "<br><br>";
}
}
?>
$_COOKIE
$_COOKIE是一个关联数组,包含了通过HTTP Cookie传递的变量。Cookie是存储在用户计算机上的小型文本文件,用于在多个页面请求之间保存数据。
设置和读取Cookie示例
<?php
// 设置Cookie(有效期为30天)
setcookie("username", "john_doe", time() + (86400 * 30), "/");
// 读取Cookie
if (isset($_COOKIE["username"])) {
echo "欢迎回来," . $_COOKIE["username"] . "!";
} else {
echo "欢迎,新用户!";
}
// 删除Cookie
// setcookie("username", "", time() - 3600, "/");
?>
$_SESSION
$_SESSION是一个关联数组,包含了当前会话的变量。会话是一种在多个页面请求之间保存用户数据的机制,数据存储在服务器端。
会话变量的使用示例
<?php
// 启动会话
session_start();
// 设置会话变量
$_SESSION["username"] = "john_doe";
$_SESSION["user_id"] = 123;
$_SESSION["user_role"] = "admin";
// 读取会话变量
if (isset($_SESSION["username"])) {
echo "欢迎," . $_SESSION["username"] . "!<br>";
echo "您的用户ID是: " . $_SESSION["user_id"] . "<br>";
echo "您的角色是: " . $_SESSION["user_role"] . "<br>";
}
// 修改会话变量
if (isset($_SESSION["user_role"])) {
$_SESSION["user_role"] = "editor";
echo "更新后的角色: " . $_SESSION["user_role"] . "<br>";
}
// 删除单个会话变量
unset($_SESSION["user_role"]);
// 检查会话变量是否被删除
if (!isset($_SESSION["user_role"])) {
echo "用户角色已被删除!<br>";
}
// 销毁所有会话数据
session_destroy();
echo "所有会话数据已被销毁!";
?>
$_ENV
$_ENV是一个关联数组,包含了环境变量。这些变量是由服务器提供的,或者通过操作系统设置的。
<?php
// 显示环境变量
echo "PHP版本: " . $_ENV['PHP_VERSION'] . "<br>";
echo "文档根目录: " . $_ENV['DOCUMENT_ROOT'] . "<br>";
// 遍历所有环境变量
echo "<h3>所有环境变量</h3>";
echo "<table border='1'>";
echo "<tr><th>变量名</th><th>变量值</th></tr>";
foreach ($_ENV as $key => $value) {
echo "<tr><td>" . $key . "</td><td>" . $value . "</td></tr>";
}
echo "</table>";
?>
PHP超级全局变量的安全考虑
在使用PHP超级全局变量时,需要注意以下安全问题:
- 输入验证和过滤:始终验证和过滤用户输入,以防止SQL注入、XSS攻击等安全问题。PHP提供了如filter_input()、htmlspecialchars()等函数来帮助处理输入。
- 避免直接输出用户输入:不要直接将用户输入输出到网页上,除非已对其进行了适当的过滤和转义。
- 限制文件上传:对上传的文件进行严格的类型检查、大小限制和重命名,以防止恶意文件上传。
- 保护敏感数据:不要在Cookie中存储敏感数据,如果必须存储,确保对其进行加密。
- 使用HTTPS:在传输敏感数据时,使用HTTPS协议以防止数据在传输过程中被截获。
- 设置适当的PHP配置:确保php.ini文件中的相关配置(如register_globals、magic_quotes_gpc等)设置正确。
PHP超级全局变量综合示例
<?php
// 1. 输入验证和过滤示例
echo "<h4>1. 输入验证和过滤示例</h4>";
// 获取用户输入并过滤
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT, array('options' => array('min_range' => 18, 'max_range' => 120)));
// 输出过滤后的结果
echo "用户名: " . htmlspecialchars($username) . "<br>";
echo "电子邮件: ";
if ($email !== false) {
echo $email . " (有效)<br>";
} else {
echo "无效的电子邮件地址<br>";
}
echo "年龄: ";
if ($age !== false) {
echo $age . " (有效)<br>";
} else {
echo "无效的年龄(必须在18-120之间)<br>";
}
// 2. 使用$_SERVER构建URL示例
echo "<h4>2. 使用$_SERVER构建URL示例</h4>";
// 获取当前页面的完整URL
function get_current_url() {
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
return $protocol . '://' . $host . $uri;
}
echo "当前页面URL: " . get_current_url() . "<br>";
// 3. 简单的表单处理示例
echo "<h4>3. 简单的表单处理示例</h4>";
// 显示表单
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
echo '<form method="post" action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '">
姓名: <input type="text" name="name"><br>
电子邮件: <input type="email" name="email"><br>
留言: <textarea name="message" rows="4" cols="50"></textarea><br>
<input type="submit" name="submit" value="提交">
</form>';
} else if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 处理表单提交
$name = htmlspecialchars(trim($_POST['name']));
$email = htmlspecialchars(trim($_POST['email']));
$message = htmlspecialchars(trim($_POST['message']));
// 简单验证
if (empty($name) || empty($email) || empty($message)) {
echo "所有字段都是必需的!<br>";
} else {
// 模拟保存数据
echo "表单提交成功!<br>";
echo "姓名: " . $name . "<br>";
echo "电子邮件: " . $email . "<br>";
echo "留言: " . $message . "<br>";
}
}
// 4. 文件上传安全示例
echo "<h4>4. 文件上传安全示例</h4>";
// 显示文件上传表单
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
echo '<form method="post" enctype="multipart/form-data" action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '">
选择图片: <input type="file" name="image" accept="image/*"><br>
<input type="submit" name="upload" value="上传图片">
</form>';
} else if (isset($_POST['upload']) && isset($_FILES['image'])) {
// 定义允许的文件类型
$allowed_types = array('image/jpeg', 'image/png', 'image/gif');
$max_size = 2 * 1024 * 1024; // 2MB
$file_name = $_FILES['image']['name'];
$file_tmp = $_FILES['image']['tmp_name'];
$file_size = $_FILES['image']['size'];
$file_error = $_FILES['image']['error'];
$file_type = $_FILES['image']['type'];
// 获取文件扩展名
$file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
// 生成唯一的文件名
$new_file_name = uniqid('img_', true) . '.' . $file_ext;
// 定义上传目录
$upload_dir = 'uploads/';
$upload_path = $upload_dir . $new_file_name;
// 检查是否有错误
if ($file_error !== UPLOAD_ERR_OK) {
echo "上传错误!错误代码: " . $file_error . "<br>";
} else if (!in_array($file_type, $allowed_types)) {
echo "不允许的文件类型!只允许JPG, PNG和GIF格式。<br>";
} else if ($file_size > $max_size) {
echo "文件太大!最大允许2MB。<br>";
} else {
// 创建上传目录(如果不存在)
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0777, true);
}
// 移动文件到上传目录
if (move_uploaded_file($file_tmp, $upload_path)) {
echo "文件上传成功!<br>";
echo "上传的文件: " . $new_file_name . "<br>";
echo "文件大小: " . ($file_size / 1024) . " KB<br>";
echo "文件类型: " . $file_type . "<br>";
} else {
echo "文件移动失败!<br>";
}
}
}
// 5. 简单的用户认证系统示例
echo "<h4>5. 简单的用户认证系统示例</h4>";
session_start();
// 模拟用户数据库
$users = array(
'admin' => password_hash('admin123', PASSWORD_DEFAULT),
'user1' => password_hash('user123', PASSWORD_DEFAULT)
);
// 注销功能
if (isset($_GET['logout'])) {
session_destroy();
echo "您已成功注销!<br>";
}
// 检查用户是否已登录
if (isset($_SESSION['username'])) {
echo "欢迎," . $_SESSION['username'] . "!<br>";
echo "<a href='?logout'>注销</a>";
} else {
// 显示登录表单
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
echo '<form method="post" action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" name="login" value="登录">
</form>';
} else if (isset($_POST['login'])) {
// 处理登录请求
$username = trim($_POST['username']);
$password = trim($_POST['password']);
// 验证用户
if (isset($users[$username]) && password_verify($password, $users[$username])) {
// 设置会话变量
$_SESSION['username'] = $username;
echo "登录成功!欢迎," . $username . "!<br>";
echo "<a href='?logout'>注销</a>";
} else {
echo "用户名或密码错误!<br>";
}
}
}
// 6. 购物车功能示例
echo "<h4>6. 购物车功能示例</h4>";
session_start();
// 初始化购物车
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = array();
}
// 模拟产品数据库
$products = array(
1 => array('name' => '产品1', 'price' => 100),
2 => array('name' => '产品2', 'price' => 200),
3 => array('name' => '产品3', 'price' => 300),
4 => array('name' => '产品4', 'price' => 400),
5 => array('name' => '产品5', 'price' => 500)
);
// 添加到购物车
if (isset($_GET['add_to_cart']) && isset($products[$_GET['add_to_cart']])) {
$product_id = $_GET['add_to_cart'];
if (isset($_SESSION['cart'][$product_id])) {
$_SESSION['cart'][$product_id]++;
} else {
$_SESSION['cart'][$product_id] = 1;
}
echo "产品已添加到购物车!<br>";
}
// 从购物车中删除
if (isset($_GET['remove_from_cart']) && isset($_SESSION['cart'][$_GET['remove_from_cart']])) {
unset($_SESSION['cart'][$_GET['remove_from_cart']]);
echo "产品已从购物车中删除!<br>";
}
// 更新购物车数量
if (isset($_POST['update_cart'])) {
foreach ($_POST['quantity'] as $product_id => $quantity) {
if (isset($_SESSION['cart'][$product_id])) {
$quantity = (int)$quantity;
if ($quantity > 0) {
$_SESSION['cart'][$product_id] = $quantity;
} else {
unset($_SESSION['cart'][$product_id]);
}
}
}
echo "购物车已更新!<br>";
}
// 清空购物车
if (isset($_GET['clear_cart'])) {
$_SESSION['cart'] = array();
echo "购物车已清空!<br>";
}
// 显示产品列表
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
echo "<h5>产品列表</h5>";
echo "<table border='1' cellspacing='0' cellpadding='5'>";
echo "<tr><th>产品名称</th><th>价格</th><th>操作</th></tr>";
foreach ($products as $id => $product) {
echo "<tr>";
echo "<td>" . $product['name'] . "</td>";
echo "<td>¥" . $product['price'] . "</td>";
echo "<td><a href='?add_to_cart=" . $id . "'>添加到购物车</a></td>";
echo "</tr>";
}
echo "</table>";
// 显示购物车
if (!empty($_SESSION['cart'])) {
$total = 0;
echo "<h5>您的购物车</h5>";
echo "<form method='post' action='" . htmlspecialchars($_SERVER['PHP_SELF']) . "'>";
echo "<table border='1' cellspacing='0' cellpadding='5'>";
echo "<tr><th>产品名称</th><th>单价</th><th>数量</th><th>小计</th><th>操作</th></tr>";
foreach ($_SESSION['cart'] as $product_id => $quantity) {
$product = $products[$product_id];
$subtotal = $product['price'] * $quantity;
$total += $subtotal;
echo "<tr>";
echo "<td>" . $product['name'] . "</td>";
echo "<td>¥" . $product['price'] . "</td>";
echo "<td><input type='number' name='quantity[" . $product_id . "]' value='" . $quantity . "' min='1'></td>";
echo "<td>¥" . $subtotal . "</td>";
echo "<td><a href='?remove_from_cart=" . $product_id . "'>删除</a></td>";
echo "</tr>";
}
echo "<tr><td colspan='3' align='right'>总计</td><td colspan='2'>¥" . $total . "</td></tr>";
echo "</table>";
echo "<br>";
echo "<input type='submit' name='update_cart' value='更新购物车'>";
echo "<a href='?clear_cart'>清空购物车</a>";
echo "</form>";
} else {
echo "您的购物车是空的!<br>";
}
}
// 7. 语言切换示例
echo "<h4>7. 语言切换示例</h4>";
// 语言选项
$languages = array(
'en' => 'English',
'zh' => '中文',
'es' => 'Español',
'fr' => 'Français'
);
// 设置默认语言
$default_language = 'en';
// 检查用户选择的语言
if (isset($_GET['lang']) && isset($languages[$_GET['lang']])) {
$selected_language = $_GET['lang'];
// 设置Cookie(有效期为30天)
setcookie('language', $selected_language, time() + (86400 * 30), '/');
} else if (isset($_COOKIE['language']) && isset($languages[$_COOKIE['language']])) {
// 使用Cookie中保存的语言
$selected_language = $_COOKIE['language'];
} else {
// 使用默认语言
$selected_language = $default_language;
}
// 显示语言选择器
echo "选择语言: ";
foreach ($languages as $code => $name) {
if ($code === $selected_language) {
echo $name . ' ';
} else {
echo "<a href='?lang=" . $code . "'>" . $name . "</a> <br>";
}
}
echo "<br>";
// 显示当前语言的文本
$translations = array(
'welcome' => array(
'en' => 'Welcome to our website!',
'zh' => '欢迎访问我们的网站!',
'es' => '¡Bienvenido a nuestro sitio web!',
'fr' => 'Bienvenue sur notre site web!'
),
'greeting' => array(
'en' => 'Hello, visitor!',
'zh' => '您好,访客!',
'es' => '¡Hola, visitante!',
'fr' => 'Bonjour, visiteur!'
)
);
echo $translations['welcome'][$selected_language] . "<br>";
echo $translations['greeting'][$selected_language] . "<br>";
// 8. 错误日志记录示例
echo "<h4>8. 错误日志记录示例</h4>";
// 自定义错误日志函数
function log_error($message, $level = 'error') {
// 定义日志文件路径
$log_file = 'error_log.txt';
// 获取当前时间
$timestamp = date('Y-m-d H:i:s');
// 获取客户端IP地址
$ip_address = $_SERVER['REMOTE_ADDR'];
// 构建日志消息
$log_message = "[$timestamp] [$level] [$ip_address] $message\n";
// 写入日志文件
error_log($log_message, 3, $log_file);
// 显示日志消息(实际应用中可能不需要显示)
echo "已记录日志: " . nl2br(htmlspecialchars($log_message)) . "<br>";
}
// 测试日志记录
log_error("这是一个测试错误日志");
log_error("这是一个警告日志", 'warning');
log_error("用户 ".htmlspecialchars($_SERVER['PHP_AUTH_USER'] ?? '匿名')." 访问了受保护页面", 'info');
// 9. 用户跟踪示例
echo "<h4>9. 用户跟踪示例</h4>";
// 检查用户是否有跟踪ID
if (!isset($_COOKIE['visitor_id'])) {
// 生成唯一的跟踪ID
$visitor_id = uniqid('visitor_', true);
// 设置Cookie(有效期为1年)
setcookie('visitor_id', $visitor_id, time() + (86400 * 365), '/');
} else {
$visitor_id = $_COOKIE['visitor_id'];
}
echo "您的访问ID: " . $visitor_id . "<br>";
// 记录用户访问信息
function log_visit() {
global $visitor_id;
// 定义访问日志文件路径
$visit_log_file = 'visit_log.txt';
// 获取访问信息
$timestamp = date('Y-m-d H:i:s');
$ip_address = $_SERVER['REMOTE_ADDR'];
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$page_url = get_current_url();
// 构建访问日志消息
$visit_log_message = "[$timestamp] [$visitor_id] [$ip_address] [$user_agent] $page_url\n";
// 写入访问日志文件
error_log($visit_log_message, 3, $visit_log_file);
// 显示访问日志消息(实际应用中可能不需要显示)
echo "已记录访问: " . nl2br(htmlspecialchars($visit_log_message)) . "<br>";
}
// 测试访问记录
log_visit();
// 10. 简单的内容分页示例
echo "<h4>10. 简单的内容分页示例</h4>";
// 模拟内容数据
$items_per_page = 10;
$total_items = 57;
$total_pages = ceil($total_items / $items_per_page);
// 获取当前页码
$current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$current_page = max(1, min($current_page, $total_pages));
// 计算偏移量
$offset = ($current_page - 1) * $items_per_page;
// 模拟获取数据
$start_item = $offset + 1;
$end_item = min($offset + $items_per_page, $total_items);
echo "显示第 $start_item 到 $end_item 条,共 $total_items 条记录<br><br>";
// 显示分页链接
function display_pagination($total_pages, $current_page, $url) {
echo "<div class='pagination'>";
// 上一页
if ($current_page > 1) {
echo "<a href='?page=" . ($current_page - 1) . "'>上一页</a> ";
}
// 显示页码
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == $current_page) {
echo "<span class='current-page'>$i</span> ";
} else {
echo "<a href='?page=$i'>$i</a> ";
}
}
// 下一页
if ($current_page < $total_pages) {
echo "<a href='?page=" . ($current_page + 1) . "'>下一页</a>";
}
echo "</div>";
}
display_pagination($total_pages, $current_page, $_SERVER['PHP_SELF']);
// 显示当前页的内容(模拟)
echo "<h5>第 $current_page 页的内容</h5>";
echo "<ul>";
for ($i = $start_item; $i <= $end_item; $i++) {
echo "<li>内容项 $i</li>";
}
echo "</ul>";
?>