获取用户提交参数

我们已经实现了两种Hello,World的输出方式.但是不灵活啊!

现在想让他通过提交的参数输出内容该怎么实现呢? 比如提交一个name参数:小黄 页面上显示出 hello,小黄.

在显示之前.我们需要获取到这些参数.

$_GET 或 $_POST 可以获取到参数. 但是我们在框架中禁止使用!

Tp6给了我们几种获取方式.

<?php
namespace app\controller;

use app\BaseController;
use think\facade\Request;

class Index extends BaseController {
	public function index() {
		var_dump(input('name'));
		var_dump(request()->param('name'));
		var_dump(Request::param('name'));
	}
}

我们打开浏览器,访问http://localhost:8888/?name=小黄 页面打印出3条 小黄,我们已经成功接收参数

input方法详解

input('?get.name'); // 判断 get 请求下name参数是否存在
input('get.'); // 获取所有get请求参数
input('name'); 获取name参数(包括get post请求)

还可以传入参数进行一定修饰,用于简单过滤变量.对于参数的校验最好使用验证器

Request::get('id/d'); // 强制转换为整型类型
input('post.name/s'); // 强制转换为字符串类型
request()->param('ids/a'); // 强制转换为数组类型

还有很多种获取方法.如果想了解可以去官方文档查找. 但是最终都要做到一点. 不相信任何用户传来的数据 .

可能传递过来的是一条sql注入语句,又或者是getshell.一定要严判断!

继续实现我们的需求!

<?php
namespace app\controller;

use app\BaseController;

class Index extends BaseController {
	public function index() {
		$name = input('name/s', 'World');
		return view()->assign('name', $name);
	}
}

input('name/s', 'World'): 接收一个name参数, 如果没有则默认为'World'

view()->assign('name', $name): 模板中的变量(除了一些系统变量外)必须先进行模板赋值后才能使用,可以使用assign方法进行全局模板变量赋值.

为什么我们的模板中不能直接使用php变量呢? (作为一个思考题)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>第一个页面</title>
</head>
<body>
	<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>

如果安装了模板引擎 可以使用模板方法 {$name} 输出变量.

访问http://localhost:8888/?name=小黄 , 页面中已经显示出 Hello, 小黄 .

我们传递一串js脚本过去: http://localhost:8888/?name=<script>alert('1')</script>

居然执行成了.弹出了一个1 . 这种如果在加以利用是不是可以获取到我们的cookies呢? 细思极恐啊! 所以要做好用户传参验证和过滤!