heather
6 سال پیش توسط heather مطرح شد
10 پاسخ

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

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


ثبت پرسش جدید
محمد عبدی
تخصص : Full Stack Developer
@mohammadm69 6 سال پیش مطرح شد
0

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


heather
تخصص : برنامه نویس بک اند
@heather 6 سال پیش مطرح شد
0

این کلاس مربوط به ارتباط با دیتابیس از طریق 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);

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


heather
تخصص : برنامه نویس بک اند
@heather 6 سال پیش مطرح شد
0

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


علیرضا بهمئی
تخصص : برنامه نویس
@bahmei.alireza 6 سال پیش مطرح شد
0

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


heather
تخصص : برنامه نویس بک اند
@heather 6 سال پیش آپدیت شد
0

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


heather
تخصص : برنامه نویس بک اند
@heather 6 سال پیش مطرح شد
1

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


heather
تخصص : برنامه نویس بک اند
@heather 6 سال پیش مطرح شد
1

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


heather
تخصص : برنامه نویس بک اند
@heather 6 سال پیش مطرح شد
0

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


کوثر
تخصص : برنامه نویس وب
@kowsar 3 سال پیش مطرح شد
0

سلام چطوری رفع کردین منم این مشکل رو دارم تورو خدا بگین


کوثر
تخصص : برنامه نویس وب
@kowsar 3 سال پیش مطرح شد
0

دوستان برای من هم همین مشکل پیش اومده چطوری درست کنم ؟


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

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