在我的 Laravel 應用程式中,我有一個用于注冊新用戶的表單。
在該表單中,我有一個用于輸入用戶生日的欄位。
即使我以d/m/Y格式獲取用戶輸入日期,我也會在將它們Y-m-d保存到資料庫之前將它們轉換為我的控制器。
if(!empty($request->date_of_birth)){
$date = str_replace('/', '-', $request->date_of_birth);
$new_bday=date("Y-m-d", strtotime($date) );
$request->merge(['date_of_birth' => ''.$new_bday.'']);
}
我有以下生日欄位的驗證規則。
'date_of_birth'=>['required','bail','date_format:Y-m-d',function ($attribute, $value, $fail) {
$age=Carbon::createFromFormat('Y-m-d', $value)->diff(Carbon::now())->y;
if($age<18||$age>70){
$date = str_replace('-', '/', $value);
$new_bday=date("d/m/Y", strtotime($date) );
\request()->merge(['date_of_birth' => ''.$new_bday.'']);
$fail('?ge invalide. l\'age devrait être 18-70');
}
},]
但現在的問題是,
如果用戶嘗試輸入文本(如test)而不是從日期選擇器中選擇日期并嘗試提交表單,則會驗證并保存1970-01-01在資料庫中。
用例 - 用戶在生日欄位中鍵入“Hello”并保存表單。1970-01-01 將被存盤為生日
1970-01-01當用戶嘗試插入無效輸入時,如何顯示正確的驗證訊息并避免保存...
uj5u.com熱心網友回復:
您的問題是您在strtotime()不先檢查的情況下使用了用戶提供的值進行了轉換。strtotime('test')將回傳false,它date()解釋為 0,即 1970。然后在自定義驗證函式中,您嘗試在由于某種原因請求失敗之前再次執行此轉換。
假設您正在使用表單請求,您的代碼應如下所示:
<?php
namespace App\Http\Requests;
use Carbon\Carbon;
use Carbon\Exceptions\InvalidFormatException;
use Illuminate\Foundation\Http\FormRequest;
class StoreUser extends FormRequest
{
protected function prepareForValidation()
{
// convert from user-input d/m/Y format if possible
try {
$birthday = Carbon::createFromFormat('d/m/Y', $this->date_of_birth);
$this->replace(['date_of_birth' => $birthday->format('Y-m-d')]);
} catch (InvalidFormatException) {
return;
}
}
public function rules()
{
return [
'date_of_birth' => [
'required',
'bail',
'date_format:Y-m-d',
function ($attribute, $value, $fail) {
$age = Carbon::createFromFormat('Y-m-d', $value)->age;
if($age < 18 || $age > 70) {
$fail('?ge invalide. l\'age devrait être 18-70');
}
}
],
];
}
}
uj5u.com熱心網友回復:
當然,更好的解決方案是首先不讓他們輸入日期以外的任何內容?最簡單的,使用
<input type="date" required>
將強制對他們進行日期格式輸入,并禁止自由輸入,以便他們無法輸入“測驗”。由于這會導致 MySQL 接受的格式 (Ymd),因此您無需對控制器中的輸入執行任何操作。
uj5u.com熱心網友回復:
您存盤了錯誤的日期字串,這就是為什么要獲取 1970-01-01
在存盤之前轉儲/除錯日期。
以下代碼可能會解決您的問題
if($request->date_of_birth) {
$date = \Carbon\Carbon::createFromFormat('d/m/Y', $request->date_of_birth)->format('Y-m-d');
$request->merge(['date_of_birth' => $date]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370924.html
上一篇:為什么在使用串列或for回圈時生成器輸出的結果會有所不同
下一篇:回傳包含搜索字串的句子
