文章目录
- 一、$GLOBALS
- 1. 在函数内部访问全局变量
- 2. 在函数内部修改全局变量
- 3. 注意事项
- 二、$_SERVER
- 三、$_REQUEST
- 1. 从 GET 请求中获取数据
- 2. 从 POST 请求中获取数据
- 3. 注意事项
- 四、$_POST
- 五、$_GET
- 六、$_FILES
- 七、$_ENV
- 八、$_COOKIE
- 九、$_SESSION
- 十、相关链接
一、$GLOBALS
$GLOBALS
是一个超全局变量,在 PHP 中用于访问全局作用域内的所有变量。这个超全局变量实际上是一个包含所有全局变量的数组。你可以通过 $GLOBALS
数组来访问和修改全局作用域中的任何变量,即使在函数或方法内部。
1. 在函数内部访问全局变量
$x = 10;
$y = 20;function add() {$sum = $GLOBALS['x'] + $GLOBALS['y'];echo $sum; // 输出 30
}add();
在这个例子中,$x
和 $y
是全局变量。在 add()
函数内部,我们通过 $GLOBALS
数组访问这两个全局变量,并将它们相加。
2. 在函数内部修改全局变量
$name = "Alice";function setName($newName) {$GLOBALS['name'] = $newName;
}setName("Bob");
echo $name; // 输出 Bob
在这个例子中,我们定义了一个函数 setName()
,它接受一个参数 $newName
并使用 $GLOBALS
来修改全局变量 $name
的值。
3. 注意事项
$GLOBALS
提供了一种访问全局变量的方式,但过度依赖它通常不是一个好的编程实践。全局变量可能导致代码难以理解和维护,因为它们可以在任何地方被修改。在面向对象编程中,更推荐使用类的属性和方法来管理状态,而不是全局变量。
二、$_SERVER
$_SERVER
是一个超全局变量,在 PHP 中用于收集关于当前脚本环境的信息,以及关于客户端请求的信息。$_SERVER
数组包含了由 web 服务器创建的信息,例如请求头、路径和脚本位置等。这些信息可以用来处理请求、重定向、生成动态内容等。
下面是一些 $_SERVER
数组中常见的键及其描述:
$_SERVER['PHP_SELF']
:当前执行脚本的文件名。这常常用于表单处理,以便知道表单数据发送到哪里。$_SERVER['REQUEST_METHOD']
:请求使用的 HTTP 方法,如 “GET” 或 “POST”。$_SERVER['REQUEST_URI']
:访问此页面所需的完整的 URL。$_SERVER['HTTP_HOST']
:当前请求的主机头信息。$_SERVER['HTTP_USER_AGENT']
:发送请求的浏览器类型、版本、操作系统等信息。$_SERVER['SERVER_NAME']
:当前脚本所在服务器的主机名。$_SERVER['SERVER_PORT']
:服务器所使用的端口号。$_SERVER['DOCUMENT_ROOT']
:当前运行脚本所在的文档根目录。$_SERVER['SCRIPT_NAME']
:当前脚本的路径。$_SERVER['QUERY_STRING']
:URL 中 ‘?’ 后面的参数,如果有的话。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {// 处理 POST 请求$name = $_POST['name'];echo "Hello, " . htmlspecialchars($name);
}
?><form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">Name: <input type="text" name="name"><input type="submit" value="Submit">
</form>
在这个例子中,<form>
元素的 action
属性被设置为 $_SERVER['PHP_SELF']
,这样表单数据就会被发送到当前脚本。当表单提交后,脚本会检查 $_SERVER["REQUEST_METHOD"]
是否为 “POST”,如果是,则处理提交的数据。
三、$_REQUEST
$_REQUEST
是一个超全局变量,在 PHP 中用于收集通过 HTTP 请求发送的参数,这些参数可以来自 GET、POST 或 COOKIE 方法。$_REQUEST
数组包含了从客户端发送到当前脚本的所有关联数组。这使得它可以方便地访问通过不同 HTTP 方法发送的数据。
下面是一些关于 $_REQUEST
的示例和解释:
1. 从 GET 请求中获取数据
假设你的 URL 是 http://example.com/test.php?name=John&age=30
,你可以在 test.php
中使用 $_REQUEST
来获取这些参数:
<?php
$name = $_REQUEST['name']; // $name 的值是 "John"
$age = $_REQUEST['age']; // $age 的值是 "30"
echo "Hello, $name! You are $age years old.";
?>
2. 从 POST 请求中获取数据
如果用户通过表单以 POST 方法提交数据,你也可以使用 $_REQUEST
来获取这些数据:
<form method="post" action="test.php">Name: <input type="text" name="name">Age: <input type="text" name="age"><input type="submit" value="Submit">
</form>
然后在 test.php
中:
<?php
$name = $_REQUEST['name'];
$age = $_REQUEST['age'];
echo "Hello, $name! You entered $age as your age.";
?>
3. 注意事项
虽然 $_REQUEST
提供了方便的方式来获取请求参数,但它并不是最佳实践,特别是当涉及到安全性时。因为 $_REQUEST
会从 $_GET
、$_POST
和 $_COOKIE
中获取数据,这可能导致意外的副作用或安全问题。
- 安全性:
$_REQUEST
可能会暴露原本只应通过 POST 方法发送的敏感数据,因为它也会从$_GET
中获取数据。GET 请求通常会被浏览器、服务器和代理等记录在日志中,因此不适合发送敏感信息。 - 可预测性:使用
$_POST
或$_GET
可以更明确地表明你的意图,使得代码更易于理解和维护。 - 数据验证:不论使用
$_REQUEST
还是其他超全局变量,你都应该始终验证和清理用户输入,以防止潜在的安全漏洞,如 SQL 注入或跨站脚本攻击(XSS)。
因此,除非你有特别的原因需要使用 $_REQUEST
,否则最好明确地从 $_GET
、$_POST
或 $_COOKIE
中获取数据,并始终对用户输入进行验证和清理。
四、$_POST
$_POST
是 PHP 中的一个超全局变量,用于收集通过 HTTP POST 方法发送的表单数据。当用户提交一个 HTML 表单,并且表单的 method
属性设置为 POST
时,表单的数据就会被发送到服务器,然后可以通过 $_POST
数组在 PHP 脚本中访问这些数据。
$_POST
数组中的每个元素都对应着表单中的一个输入字段,数组的键是输入字段的 name
属性值,数组的值是用户输入的数据。
下面是一个简单的示例,展示了如何使用 $_POST
来收集和处理表单数据:
HTML 表单(假设保存为 form.html
):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>POST Form Example</title>
</head>
<body><form action="process_form.php" method="post"><label for="name">Name:</label><input type="text" id="name" name="name" required><br><label for="email">Email:</label><input type="email" id="email" name="email" required><br><input type="submit" value="Submit"></form>
</body>
</html>
PHP 脚本(假设保存为 process_form.php
):
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {// 检查是否设置了 name 和 email 字段,并且它们不为空if (isset($_POST['name']) && isset($_POST['email'])) {$name = $_POST['name'];$email = $_POST['email'];// 可以在这里对数据进行处理,比如保存到数据库或者发送电子邮件echo "Name: " . htmlspecialchars($name) . "<br>";echo "Email: " . htmlspecialchars($email);} else {echo "Name and email are required.";}
} else {echo "This page should not be accessed directly.";
}
?>
在这个例子中,当用户填写表单并提交时,数据会被发送到 process_form.php
。PHP 脚本首先检查请求的方法是否为 POST,然后检查 $_POST
数组中是否存在 name
和 email
键。如果存在并且它们有值,脚本就会处理这些数据(在这个例子中,只是简单地输出它们)。
请注意,使用 htmlspecialchars()
函数是为了防止跨站脚本攻击(XSS)。它可以将特殊字符转换为 HTML 实体,从而避免恶意脚本的执行。
此外,虽然 $_POST
提供了方便的方式来收集表单数据,但始终需要验证和清理用户输入,以防止潜在的安全问题,如 SQL 注入等。在处理用户输入时,应该使用适当的数据验证和过滤技术。
五、$_GET
$_GET
是 PHP 中的一个超全局变量,用于收集通过 HTTP GET 方法发送的表单数据或 URL 中的查询字符串参数。当用户提交一个 HTML 表单,并且表单的 method
属性设置为 GET
时,表单的数据就会附加到 URL 上,然后通过 $_GET
数组在 PHP 脚本中访问这些数据。
$_GET
数组中的每个元素都对应着 URL 中的一个参数,数组的键是参数的名称,数组的值是参数的值。这些参数通常位于 URL 的问号(?
)之后,并且每个参数之间用和号(&
)分隔。
下面是一个简单的示例,展示了如何使用 $_GET
来收集和处理 URL 中的参数:
HTML 表单(假设保存为 form_get.html
):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>GET Form Example</title>
</head>
<body><form action="process_get.php" method="get"><label for="name">Name:</label><input type="text" id="name" name="name" required><br><input type="submit" value="Submit"></form>
</body>
</html>
PHP 脚本(假设保存为 process_get.php
):
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {// 检查是否设置了 name 字段if (isset($_GET['name'])) {$name = $_GET['name'];// 可以在这里对数据进行处理,比如保存到数据库或者用于页面显示echo "Hello, " . htmlspecialchars($name) . "!";} else {echo "Name is required.";}
} else {echo "This page should not be accessed directly.";
}
?>
在这个例子中,当用户填写表单并提交时,数据会被附加到 URL 上,并发送到 process_get.php
。PHP 脚本首先检查请求的方法是否为 GET,然后检查 $_GET
数组中是否存在 name
键。如果存在,脚本就会处理这个数据(在这个例子中,只是简单地输出一个问候语)。
请注意,由于 GET 请求的数据直接附加在 URL 上,因此它不适合发送敏感信息或大量数据。此外,由于 URL 的长度有限制,因此 GET 请求也可能受到数据大小的限制。
同样地,使用 htmlspecialchars()
函数是为了防止跨站脚本攻击(XSS)。它可以将特殊字符转换为 HTML 实体,从而避免恶意脚本的执行。
在处理通过 $_GET
收集的数据时,始终应该进行验证和清理,以确保数据的安全性和准确性。
六、$_FILES
$_FILES
是 PHP 中的一个超全局变量,用于处理通过 HTTP POST 方法上传的文件。当用户通过表单上传文件时,上传的文件信息会存储在 $_FILES
数组中。这个数组包含了关于上传文件的详细信息,如文件名、文件类型、文件大小以及临时文件路径等。
$_FILES
数组的结构是一个关联数组,其键是表单中 <input type="file">
标签的 name
属性值。每个文件上传字段都对应一个子数组,该子数组包含以下键:
name
:上传的文件的原始文件名。type
:上传的文件的 MIME 类型。size
:上传的文件大小(以字节为单位)。tmp_name
:上传的文件的临时文件名,文件被保存在服务器上的临时位置。error
:文件上传的错误代码。
下面是一个简单的示例,展示了如何使用 $_FILES
来处理文件上传:
HTML 表单(假设保存为 upload_form.html
):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>File Upload Form</title>
</head>
<body><form action="upload_process.php" method="post" enctype="multipart/form-data"><label for="file">Select a file:</label><input type="file" id="file" name="fileToUpload"><input type="submit" value="Upload"></form>
</body>
</html>
PHP 脚本(假设保存为 upload_process.php
):
<?php
$targetDirectory = "uploads/";
$targetFile = $targetDirectory . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION));// 检查文件是否已经存在
if (file_exists($targetFile)) {echo "Sorry, file already exists.";$uploadOk = 0;
}// 检查文件大小
if ($_FILES["fileToUpload"]["size"] > 500000) { // 500KBecho "Sorry, your file is too large.";$uploadOk = 0;
}// 允许特定文件格式
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";$uploadOk = 0;
}// 检查 $uploadOk 是否为 0
if ($uploadOk == 0) {echo "Sorry, your file was not uploaded.";
} else {if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";} else {echo "Sorry, there was an error uploading your file.";}
}
?>
在这个例子中,用户选择一个文件后,点击上传按钮,文件会被发送到 upload_process.php
脚本。脚本首先定义了一个目标目录和一个目标文件名,然后检查文件是否已存在、文件大小是否超过限制以及文件格式是否允许。最后,如果所有检查都通过,脚本会使用 move_uploaded_file()
函数将临时文件移动到目标位置。
处理文件上传时,安全性非常重要。务必验证上传的文件类型、大小以及是否包含潜在的恶意内容。此外,还应该确保目标目录是可写的,并且服务器配置允许文件上传。
七、$_ENV
$_ENV
是 PHP 中的一个超全局变量,用于访问环境变量。环境变量是在操作系统级别设置的变量,它们可以被运行在该操作系统上的所有进程访问。在 PHP 脚本中,$_ENV
数组用于存储这些环境变量的名称和值。
当 PHP 脚本运行时,它会从操作系统获取当前的环境变量,并将它们存储在 $_ENV
数组中。这样,你就可以在 PHP 脚本中通过访问 $_ENV
数组来获取和操作这些环境变量的值。
例如,你可以使用以下代码来访问名为 PATH
的环境变量的值:
if (isset($_ENV['PATH'])) {echo "PATH: " . $_ENV['PATH'];
} else {echo "PATH environment variable is not set.";
}
需要注意的是,不是所有的环境变量都会自动填充到 $_ENV
数组中。这取决于 PHP 的配置和服务器设置。在某些服务器上,为了安全起见,可能会限制或禁用对环境变量的访问。
此外,你也可以在 PHP 配置文件中(通常是 php.ini
)设置 variables_order
指令来控制哪些超全局变量(包括 $_ENV
)会被注册。例如,将 variables_order
设置为 "EGPCS"
会注册 $_ENV
和 $_GET
、$_POST
、$_COOKIE
和 $_SERVER
变量。
如果你发现 $_ENV
数组中没有你期望的环境变量,你可能需要检查你的 PHP 配置和服务器设置,或者考虑使用 getenv()
函数来直接获取环境变量的值。例如:
$path = getenv('PATH');
if ($path) {echo "PATH: " . $path;
} else {echo "PATH environment variable is not set.";
}
getenv()
函数允许你获取单个环境变量的值,而不需要依赖 $_ENV
数组。
八、$_COOKIE
$_COOKIE
是 PHP 中的一个超全局变量,用于收集通过 HTTP Cookie 发送的用户信息。Cookie 是在用户的浏览器上存储的小段数据,通常用于识别用户会话或跟踪用户行为。当浏览器访问网站时,它会自动将相关的 Cookie 发送到服务器,然后 PHP 可以通过 $_COOKIE
数组来访问这些 Cookie 的值。
当用户首次访问网站时,服务器可能会设置一个或多个 Cookie,并在后续的请求中,浏览器会自动将这些 Cookie 发送回服务器。PHP 脚本可以使用 $_COOKIE
数组来读取这些值,并根据需要进行处理。
下面是一个简单的示例,展示了如何设置和读取 Cookie:
设置 Cookie(假设保存为 set_cookie.php
):
<?php
// 设置一个名为 "username" 的 Cookie,值为 "JohnDoe"
setcookie("username", "JohnDoe", time() + (86400 * 30), "/"); // 有效期为 30 天
?>
读取 Cookie(假设保存为 read_cookie.php
):
<?php
// 检查 "username" Cookie 是否设置
if(isset($_COOKIE["username"])) {echo "Welcome, " . $_COOKIE["username"] . "!";
} else {echo "Welcome, Guest!";
}
?>
在这个例子中,setcookie()
函数用于设置 Cookie。它接受至少三个参数:Cookie 的名称、Cookie 的值以及 Cookie 的过期时间(以 Unix 时间戳表示)。可选的第四个参数是 Cookie 的路径,它定义了哪些页面可以接收这个 Cookie。在这个例子中,我们设置了路径为 "/"
,这意味着该 Cookie 对整个网站都有效。
然后,在 read_cookie.php
脚本中,我们使用 isset()
函数来检查 $_COOKIE
数组中是否存在名为 “username” 的键。如果存在,我们就输出欢迎信息,并将用户名显示为 Cookie 的值。如果不存在,我们输出默认的欢迎信息。
由于安全原因,不应该在 Cookie 中存储敏感信息,如密码或私钥。此外,由于 Cookie 存储在用户的浏览器上,因此它们的大小和内容都受到浏览器和 HTTP 规范的限制。
九、$_SESSION
$_SESSION
是 PHP 中的一个超全局变量,用于在用户会话期间跟踪和存储信息。当 PHP 脚本以会话的方式运行时,可以使用 $_SESSION
变量在用户的不同页面请求之间保存和传递数据。
要使用 $_SESSION
,你需要先启动一个会话,这通常是通过调用 session_start()
函数来完成的。一旦会话启动,你就可以向 $_SESSION
数组中添加数据,然后在后续的页面请求中访问这些数据。
下面是一个简单的示例,展示了如何使用 $_SESSION
来存储和读取用户数据:
<?php
// 启动会话
session_start();// 存储数据到 $_SESSION
$_SESSION["username"] = "JohnDoe";// 可以在同一页面或后续页面读取数据
if(isset($_SESSION["username"])) {echo "Welcome, " . $_SESSION["username"] . "!";
} else {echo "Welcome, Guest!";
}// 结束会话(可选,PHP 脚本结束时会自动结束)
session_write_close();
?>
在这个例子中,我们首先调用 session_start()
来启动会话。然后,我们将用户名 “JohnDoe” 存储在 $_SESSION["username"]
中。在后续的代码中,我们可以检查 $_SESSION["username"]
是否设置,并据此输出不同的欢迎信息。
会话数据存储在服务器上,并且与特定的用户会话相关联。每个用户会话都有一个唯一的会话 ID,该 ID 通常通过 Cookie 发送到用户的浏览器,以便在后续的请求中识别用户会话。这意味着,即使用户关闭了浏览器窗口或重启了计算机,只要 Cookie 仍然有效,会话数据就会保留在服务器上,并在用户下次访问时可用。
为了安全起见,你应该确保会话 ID 是通过安全的连接(如 HTTPS)传输的,以防止会话劫持攻击。此外,你还应该定期清理旧的会话数据,以避免会话固定攻击和占用过多的服务器资源。这通常通过设置会话的过期时间和定期清理会话存储来实现。
十、相关链接
- php官网
- php_Github
- PHP实现Token
- 「PHP系列」PHP简介与起步
- 「PHP系列」PHP语法介绍
- 「PHP系列」PHP变量
- 「PHP系列」PHP echo/print语句、数据类型详解
- 「PHP系列」PHP 常量/字符串、类型比较
- 「PHP系列」PHP 运算符详解
- 「PHP系列」If…Else语句/switch语句
- 「PHP系列」数组详解
- 「PHP系列」PHP数组排序及运用场景