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超级全局变量时,需要注意以下安全问题:

  1. 输入验证和过滤:始终验证和过滤用户输入,以防止SQL注入、XSS攻击等安全问题。PHP提供了如filter_input()、htmlspecialchars()等函数来帮助处理输入。
  2. 避免直接输出用户输入:不要直接将用户输入输出到网页上,除非已对其进行了适当的过滤和转义。
  3. 限制文件上传:对上传的文件进行严格的类型检查、大小限制和重命名,以防止恶意文件上传。
  4. 保护敏感数据:不要在Cookie中存储敏感数据,如果必须存储,确保对其进行加密。
  5. 使用HTTPS:在传输敏感数据时,使用HTTPS协议以防止数据在传输过程中被截获。
  6. 设置适当的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>";
?>