场景,我们正在 Laravel 中构建一个 Web 应用程序,并分配了一条路由,如下所示:
Route::get('/sample/{client}', 'SampleController@SampleMethod')->name('SampleNaming');
方法 SampleMethod 从客户端变量读取,并在页面中显示有关客户端的数据。
例如,如果我们转到 http://localhost/appurl/sample/1,它会显示有关客户端 ID 1 的数据。诀窍是,如果我们去 http://localhost/appurl/sample/1abc ,它仍然会显示客户端 ID 1 的数据。
尝试了在 MySQL 中的查询,
select * from clients where ID = '1abc'
ID 列是一个整数,是客户端表的主键。
上面的查询给了我客户端 ID 1 的结果,结果 MySQL 检查提供的字符串并搜索其中的整数部分并相应地获取行。
当然,我们可以在PHP/Laravel中逃避这一点,但我的问题是,有没有办法使MySQL在这种情况下严格?
纯Laravel解决方案是使用正则表达式约束。
Route::get('/sample/{client}', 'SampleController@SampleMethod')
->name('SampleNaming')
->where(['client' => '[0-9]+']);
更改服务器的设置sql_mode。 您需要使用严格模式。在此处输入链接描述
防止类型转换在MySQL中不可配置。 MySQL 隐式类型转换规则
您可以使用强制转换函数在 SQL 级别解决问题
select * from t where cast(id as char) = "1abcd"