جواد
5 ماه پیش توسط جواد مطرح شد
5 پاسخ

auth در لاراول

سلام من یه خطا دارم
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'password' cannot be null (SQL: insert into users (password, name, email, updated_at, created_at) values (?, javad123, www.olivertooooo@gmail.com, 2024-07-02 03:13:56, 2024-07-02 03:13:56))

مدل من :

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',

    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

controller:

<?php

namespace App\Http\Controllers\frontend;

use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit(User $user)
    {
        $pageTitel = 'edit profile';
        return view('auth/profile', compact('user'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, User $user)
    {
        if (!empty($request->password)) {
            $validateData = $request->validate([
                'name' => 'required',
                'email' => 'required|unique:users,email,' . $user->id,
                'password' => 'min:8',
                'password_confirmation' => 'min:8',
            ]);
            $password = Hash::make($request->password);
            $user->password = $password;
        } else {
            $user->password = $user->password;
        }
        if ($request->has('name') && $request->name !== $user->name) {
            $user->name = $request->name;
        }

        if ($request->has('email') && $request->email !== $user->email) {
            $user->email = $request->email;
        }

        try {
            $user->save();
        } catch (Exception $exeption) {
            switch ($exeption->getCode()) {
            }
            return redirect()->back()->with('warning', $exeption->getCode());
        }
        $msg = 'done successfully!!';
        return redirect(route('home'))->with('success', $msg);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

migrate:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->tinyInteger('role')->default(22);
            $table->tinyInteger('status')->default(1);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

form

@extends('frontend/layout')
@section('content')
    <ol class="breadcrumb mt-5">
        <li class="breadcrumb-item"><a href="">Home</a></li>
        <li class="breadcrumb-item"><a href="">User</a></li>
        <li class="breadcrumb-item active" aria-current="page">Profile Settings</li>
    </ol>
    <section class="site-section pt-5 pb-5">

        <div class="container">
            <div class="row main-content p-3">

                <main class="form-signup w-100 m-auto">
                    <form action="{{ route('profileUpdate') }}" method="POST">
                        @csrf
                        <h4>Welcome!!!
                        </h4>
                        <h1 class="h3 mb-3 fw-normal">Edit Profile</h1>
                        <div class="form-floating">
                            <label for="floatingInput">Name</label>
                            <input type="text" class="form-control"name='name' value="{{ $user->name }}"
                                class="@error('name') is-invalid
                                    @enderror">
                            @error('name')
                                <div class="alert alert-danger">{{ $message }}</div>
                            @enderror
                        </div>
                        <div class="form-floating">
                            <label for="floatingInput">Email</label>
                            <input type="email" class="form-control"name='email' value="{{ $user->email }}"
                                class="@error('email') is-invalid
                                    @enderror">
                            @error('email')
                                <div class="alert alert-danger">{{ $message }}</div>
                            @enderror
                        </div>
                        <div class="form-floating">
                            <label for="floatingInput">Password</label>
                            <input type="password" class="form-control"name='password'
                                class="@error('password') is-invalid
                                @enderror">
                            @error('password')
                                <div class="alert alert-danger">{{ $message }}</div>
                            @enderror
                        </div>
                        <div class="form-floating mb-5">
                            <label for="floatingInput">Confirmed password</label>
                            <input type="password" class="form-control"name='password_confirmation'
                                class="@error('password_confirmation') is-invalid
                                @enderror">
                            @error('password_confirmation')
                                <div class="alert alert-danger">{{ $message }}</div>
                            @enderror
                        </div>

                        <button class="btn btn-primary w-100 py-2" type="submit">Update <i
                                class="bi bi-check-square"></i></button>
                    </form>

                </main>

            </div>
        </div>
    </section>
@endsection

route:

<?php

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\backend\adminController;
use App\Http\Controllers\frontend\HomeController;
use App\Http\Controllers\frontend\UserController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
 */

Auth::routes();
Route::get('/', [HomeController::class, 'index'])->name('home');
Route::get('/1381', [adminController::class, 'index'])
    ->name('admin.index')
    ->middleware('CheckRole');

Route::get('/profile/{user?}', [UserController::class, 'edit'])->name('profile');
Route::post('/update/{user?}', [UserController::class, 'update'])->name('profileUpdate');

من میخام کاربر اگه هر کدوم از فیلد های خودش رو تغییر داد ثبت بشه
و اگر تغییر نکرد همون مقدار قبلی براش بمونه با زدن دکمه اپدیت
خسته نباشید کمک کنید دارم دیونه میشم ممنون.!


ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 5 ماه پیش مطرح شد
0

سلام مجدد
داداش وقتی پیام میدی لطفا تگ کن متوجه پیامت نمیشم

مشکل اینه که چون توی فرم بخش action امدی اسم روت نوشتی و user رو مشخص نکردی توی کنترلر یوزر رو نمیگیریش
قبلا خطا داشتی مشکل خطا الان حل کردی ولی الان موضوع اینه که user نمیفرستی به کنترلر خب اون از کجا بدونه کیو ابدیت کنه
توی ادرس فرم دقیق url رو با id کاربر قرار بده
ولی از یه طرف هم حس میکنم خواستی متد ثبت و ویرایشت یکی باشه کنترلر و فرمش و دلیل که توی روت امدی علامت سوال گذاشتی بعد یوزر همینه

حالا شما چند تا کار میتونی بکنی

یک این که همه ی validation رو بزار اول کار و از nullable استفاده کن این که توی if میزاری همش جالب نیست فقط بخش hash:make رو بزار توی همون شرط باشه ولیدشن رو بر دار

شما باید مرحله به مرحله dd بگیری

سعی کن کدت تمیز کنی
خیلی از چک کردنات الکیه
مثلا داری اولش میگی اگر کاربر اسم جدیدش با قبلیش یکی نیست بیا ببین اسم وارد شده و اعتبار سنجیش میکنی
خو وقتی اسم اجباریه چیکار داری که قدیم و جدید یکی هست یا نه تو ویرایشتو بکن برای ایمیل هم همینطور
کلا بجز پسورد به نظر بقیه الکیه چک کردنشون

ته ته کار قبل متد save هم بیا یک بار dd بگیر و ببین user چی داره چی نداره بعد که ذخیره میکنی ببین جی در میاد

کلا مشکلت کد شلوغته و برای همین هست میگن خوانایی و تمیزی کد مهمه

خیلی خوبه کارت خیلی همه چی عالیه اما از جهت بهبود دارم بهت میگم یه وقت ناراحت نشی فک کنی الکی میخام تخریب کنم یا چیزی

این سایت خیلی جمع بندی های خوبی راجب خیلی از امکانات لاراول و مخصوصا کد تمیز داره حتما یه بررسی بکنش برای پیشرفتت


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 5 ماه پیش مطرح شد
1

سلام عزیز
اول قبل از حل مسئله بگم که معمولا شما تمام اطلاعات قبلی شخص رو توی فرم قرار میدی ، مثل اسم و ایمیل و هرچی که هست و بعد توی اعتبار سنجی هم همه رو اعتبار سنجی میکنی کاربر هرکدومو که خواست خودش تغییر میده کار به بقیه اطلاعات نداره این که اسم جدا چک کنی خالی باشه نباشه فلان داده جدا جالب نیست

راجب مشکلی که پیش امده هم به وضوح داره میگه پسورد ندادی و داری ذخیره میکنی

حدس اولیه من اینه کاربری که ذخیره کردی از قبل پسورد نداره خودش در صورتی که جوری کدت به نظر میاد که انگار کاربر باید از قبل پسورد داشته باشه

if (!empty($request->password)) {
            $validateData = $request->validate([
                'name' => 'required',
                'email' => 'required|unique:users,email,' . $user->id,
                'password' => 'min:8',
                'password_confirmation' => 'min:8',
            ]);
            $password = Hash::make($request->password);
            $user->password = $password;
        } else {
            $user->password = $user->password;
        }

توی این تیکه کد گفتی اگر کاربر پسورد نداد که عوضش کنه همون پسورد قبلیش رو بزار ( هر چند که حرکت کاملا اشتباهیه داری میگه خودت رو برابر با خودت کن خب هست دیگه باز یه چیزو دوباره بریزی توی خودش که معنی نمیده کلا else اینجا اصلا کاری نمیکنه عملا الکیه)

خلاصه کلام این که شما توی همین else اگر کاربر که $user هست رو dd بگیری و همین کدت رو اجرا کنی احتمالا میبینی که کاربر قبلی ذخیره شدت پسوردی نداره

اگر غیر این بود باید توی همه ی مراحل dd بگیری همین کنترلر update ببینی کجا داری این پسورد رو null میکنی و یا دریافت نمیکنی و هرچیزی از این موارد


جواد
تخصص : php
@node.core 5 ماه پیش مطرح شد
0

سلام دوست خوبم ممنون که جواب دادی
من کد هامو به روش زیر تغییر دادم ولی باز هم تغییرات ذخیره نمیشن و این که دیگه ارور ندارم نه توی لاگ و نه جایه دیگه

     public function update(Request $request, User $user)
     {
         try {
             if ($user->name != $request->name) {
                 $validatedData = $request->validate([
                     'name' => 'required|string|max:60|min:3',
                 ]);
                 $user->name = $validatedData['name'];
             }

             if ($user->email != $request->email) {
                 $validatedData = $request->validate([
                     'email' => 'required|email|unique:users,email,' . $user->id,
                 ]);
                 $user->email = $validatedData['email'];
             }

             if (!empty($request->password)) {
                 $validatedData = $request->validate([
                     'password' => 'nullable|string|min:8|confirmed',
                 ]);
                 $user->password = Hash::make($validatedData['password']);
             }

             $user->save();

             return redirect()->route('home')->with('success', 'Profile updated successfully.');

         } catch (ValidationException $e) {
             return redirect()->back()->withErrors($e->errors())->withInput();
         } catch (\Exception $e) {
             return redirect()->back()->with('error', 'An error occurred while updating profile.');
         }
     }

سر حل این ترکیدم...


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 5 ماه پیش مطرح شد
0

سلام مجدد
داداش وقتی پیام میدی لطفا تگ کن متوجه پیامت نمیشم

مشکل اینه که چون توی فرم بخش action امدی اسم روت نوشتی و user رو مشخص نکردی توی کنترلر یوزر رو نمیگیریش
قبلا خطا داشتی مشکل خطا الان حل کردی ولی الان موضوع اینه که user نمیفرستی به کنترلر خب اون از کجا بدونه کیو ابدیت کنه
توی ادرس فرم دقیق url رو با id کاربر قرار بده
ولی از یه طرف هم حس میکنم خواستی متد ثبت و ویرایشت یکی باشه کنترلر و فرمش و دلیل که توی روت امدی علامت سوال گذاشتی بعد یوزر همینه

حالا شما چند تا کار میتونی بکنی

یک این که همه ی validation رو بزار اول کار و از nullable استفاده کن این که توی if میزاری همش جالب نیست فقط بخش hash:make رو بزار توی همون شرط باشه ولیدشن رو بر دار

شما باید مرحله به مرحله dd بگیری

سعی کن کدت تمیز کنی
خیلی از چک کردنات الکیه
مثلا داری اولش میگی اگر کاربر اسم جدیدش با قبلیش یکی نیست بیا ببین اسم وارد شده و اعتبار سنجیش میکنی
خو وقتی اسم اجباریه چیکار داری که قدیم و جدید یکی هست یا نه تو ویرایشتو بکن برای ایمیل هم همینطور
کلا بجز پسورد به نظر بقیه الکیه چک کردنشون

ته ته کار قبل متد save هم بیا یک بار dd بگیر و ببین user چی داره چی نداره بعد که ذخیره میکنی ببین جی در میاد

کلا مشکلت کد شلوغته و برای همین هست میگن خوانایی و تمیزی کد مهمه

خیلی خوبه کارت خیلی همه چی عالیه اما از جهت بهبود دارم بهت میگم یه وقت ناراحت نشی فک کنی الکی میخام تخریب کنم یا چیزی

این سایت خیلی جمع بندی های خوبی راجب خیلی از امکانات لاراول و مخصوصا کد تمیز داره حتما یه بررسی بکنش برای پیشرفتت


جواد
تخصص : php
@node.core 5 ماه پیش مطرح شد
1

salar.mohammad2013@
بازم سلام دوست خوبم !
مشکلم حل شد با کمکت .
اما در مورد این حرف شما :
خیلی خوبه کارت خیلی همه چی عالیه اما از جهت بهبود دارم بهت میگم یه وقت ناراحت نشی فک کنی الکی میخام تخریب کنم یا چیزی.

باید بگم که اولا دمت گرم و پرچمت بالا و حلال اولسون
دوما که این کار شما که چیزی با ارزش مثله وقتت رو میزاری و کد من تازه کارو میخونی و اشکال زدایی میکنی و بهم کمک میکنی.
نشونه شخصیتی که ایثار درش وجود دراه .
بازم ممنون.و موفق باشی همیشه.


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 5 ماه پیش مطرح شد
0

عزیزی لطف داری
خوشحال شدم مشکلت حل شد
همیشه موفق باشی عزیز
در پناه حق


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام