mysql - Laravel 路由参数未修剪(通常在添加空格时有效)

标签 mysql laravel laravel-5

我在 web.php 有以下路线:

Route::get('posts/{encoded_id}/{slug}', 'PostController@show')

...并且工作正常:

http://example.test/posts/1Dl89aRjpk/this-is-some-title

但“问题”是,当我在路由参数末尾添加空格 时,它也会起作用 {encoded_id} :

http://example.test/posts/1Dl89aRjpk /this-is-some-title

// or

http://example.test/posts/1Dl89aRjpk%20 /this-is-some-title

// or

http://example.test/posts/1Dl89aRjpk%20%20 /this-is-some-title

在末尾添加空格 - 这将正常工作并且没有 404:

Post::where('encoded_id', $encoded_id)->firstOrFail();

...但是为什么? 我怎样才能让它失败(给出 404)?

也许是因为数据库中的字段类型( CHAR )?

$table->char('encoded_id', 10)

如果这就是原因 - 有没有办法配置 MySQL databases.php这样就可以防止这种情况发生?

或者可能与.htaccess有关。 (我使用的是 XAMPP/Windows)?

我使用的是 Laravel 5.6。

编辑:

我问的是为什么会发生这种情况以及如何防止它,而不是如何修剪路由参数。例如,在 question id 末尾添加空格在 stackoverflow url 上,您将得到 404:

https://stackoverflow.com/questions/51068436 /laravel-route-parameters-not-trimmed-it-normally-works-when-whitespace-is-added

最佳答案

这是由于预期的 SQL 行为造成的。在您的 Controller 中,您会收到带有空格的完整$encoded_id。 Laravel 为您所做的一切就是使用 WHERE 调用 SQL 选择查询。 SQL 忽略 WHERE 比较中的尾随空格。

查看此question .

如果您想要 404,请将 ID 中的空格替换为某个虚拟字符:

$encoded_id = str_replace(' ', '#', $encoded_id);

只有在保证 ID 不包含空格或散列标记的情况下才执行此操作。

关于mysql - Laravel 路由参数未修剪(通常在添加空格时有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51068436/

相关文章:

Mysql多表UPDATE第一条记录

php - Laravel Eloquent : Best Way to Calculate Total Price

php - 如何在 Laravel 5+ 中获取客户端 IP 地址

laravel - 为什么我使用 Laravel 和 Docker 得到 "No alive nodes found in your cluster"?

php - Laravel - 以 .php 结尾的重定向捕获/重定向 Urls

Mysql order by if 条件 - 错误的顺序

mysql - 使用 nginx 和两个物理 Linux 服务器实现 Web 应用程序的可扩展性

c# - 生成mysql表主键字符串+数字的最佳方式

Laravel 查询构建器增量更新

php - 如何在Laravel Controller 中使用变量?