آفلاین
user-avatar

مشکل در ذخیره کردن اطلاعات در دیتابیس

PHP -
3 سال پیش
توسط heather آپدیت شد
آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

سلام خدمت شما استاد موسوی و کاربران محترم سایت .
اقای موسوی اموزشاتون خیلی عالیه .فقط یک مشکلی واسم پیش اومده .در قسمت 21 شی گرایی در php در کلاس DB .متد create رو ساختم به اون روش شما ولی اطلاعات رو در صفحه ی register.php فقط برای یک بار در table user ذخیره میکنه.حتی منم redirect می کنه به صفحه ی اصلی ولی برای دومین بار که می خوام امتحان کنم دیگه row دیگری اضافه نمیکنه .نمیدونم این مشکل مربوط به کد نویسیه یا در mysql و در table مربوطه.؟اگه میتونید راهنماییم کنین.
وااقعا ممنونم از شما و وقتی که میذارین.

آفلاین
user-avatar
محمد عبدی ( 8405 تجربه )
3 سال پیش
تخصص : Full Stack Developer

سلام دوست عزیز ، اگه لطف کنید کد هایی که زدید رو اینجا بنویسید ، بیشتر میتونیم کمکتون کنیم

آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

این کلاس مربوط به ارتباط با دیتابیس از طریق pdo و متد create مربوط به گرفتن اطلاعات و insert کردن و bind کردن(از طریق متد bindvalue())و در نهایت اجرا کردن یا execute کردن این دستور insert است.
class DB
{
protected $pdo;
protected $table;
protected $stmt;
protected $bind = [];
protected $fetchMode = \PDO::FETCH_OBJ;

public function __construct()
{
    $config = require __DIR__ . '/../config.php';
    try {
        $this->pdo = new \PDO("mysql:host=127.0.0.1;dbname={$config['db']['database']}",$config['db']['username'] , $config['db']['password']);
    } catch (\Exception $e) {
        die('Error : ' . $e->getMessage());
    }
}

public function create($data)
{
    $field = join(', ', array_keys($data));
    $param = ':'. join(', :' , array_keys($data));

    $this->stmt = $this->pdo->prepare("INSERT INTO $this->table ($field) VALUES ($param)");

    $this->bind = $data;
    $this->bindValue();

    return $this->stmt->execute();
}

private function bindValue()
{
    foreach ($this->bind as $key => $value) {
        $this->stmt->bindValue(":$key" , $value);
    }
}

}

class UserController extends Controller
{
public function register()
{
if(! request()->isPost())
return;

    $rules = [
        'name' => 'required',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:6|max:20',
        'confirm_password' => 'confirm:password'
    ];

    if(! $this->validation(request()->all() , $rules)) {
        return;
    }

در یک فایل دیگه اومدیم کلاس register رو ساختیم و درون اون کلاس Users رو که از کلاس DB ارث بری کرده رو تبدیل به شی ء کردیم.بامتد create اطلاعات رو از فیلدها گرفتیم البته قبلا ولدیشن رو انجام دادیم ولی اونو ننوشتم چون فکر کنم نیازی نیس چون قبلا تست شده و دقیق کار می کنه.created_at هم مربوط به زمانیه که کاربر register کرده و برای اون پکیج Carbon رو نصب کردیم از طریق composer.و در اخر اگه ذخیره کردن اطلاعات با موفقیت انجام بشه ما رو ریدایرکت می کنه یه صفحه ی اصلی.

    $user = new Users();
    $success = $user->create([
        'name' => request('name'),
        'email' => request('email'),
        'password' => password_hash(request('password') , PASSWORD_BCRYPT , ['cost' => 12]),
        'created_at' => Carbon::now()
    ]);

    if($success) {
           //login....
    }

    $this->flash->success('عضویت شما با موفقیت انجام شد');

    redirect();
    return;
}

و در اخز هم در صفحه ی register.php کلاس register رو تبدیل به شیء کردیم و فراخوانیش کردیم:

$user = new \App\Controller\UserController();
$user->register($_POST);

کدها همگی کار می کنن ولی فقط برای یک بار اطلاعات ذخیره میشه! در اموزش اقای موسوی که دیدم همه چیز عالی پیش رفت ولی من واقعا نمیدونم کجای کار رو اشتباه کردم؟
ممنون از شما من تازه کارم اگه می تونید من رو راهنمایی کنین.

آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

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

آفلاین
user-avatar
علیرضا بهمئی ( 14100 تجربه )
3 سال پیش
تخصص : برنامه نویس

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

آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

با سلام ممنون از جوابتون...ولی من هر بار واسه ی امتحان کردن نام های متفاوت و جیمیلهای متفاوت وارد کردم ولی نتیجه همین بود.
یعنی بازم منطقیه؟
ولیدیشن unique رو هم البته پاک کردم تا ببینم چی میشه ولی نتیجه همون بود.
5 روزه که گیر کردم .هه ی میام کدهامو پاک می کنم دوباره مینویسم .اموزش رو هم که نگا می کنم همونه.ولی واسه من اینجوری هستش .راستش هه ی می خواستم next بزنم ولی نمیتونم تا اینو نفهمیدم چرا اینجوریه بقیشم یاد نمیگیرم!
راستش چون این روش مثل فریمورکهای پیشرفتس واسه این همین روش واسم خوبه چون بعدا میخوام برم سراغ لاراول.
کسی میتونه بهم بگه اگه کجا اشتباه کنم منجر به این میشه؟

آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

خیلی ممنون ازتون مشکل رو رفع کردم....

آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

خیلی ممنون ازتون مشکل رو رفع کردم....

آفلاین
user-avatar
heather ( 4388 تجربه )
3 سال پیش
تخصص : برنامه نویس بک اند

خیلی ممنون ازتون مشکل رو رفع کردم....

برای ارسال پاسخ باید وارد سایت شوید