علی ولی‌نژاد
3 سال پیش توسط علی ولی‌نژاد مطرح شد
7 پاسخ

ایجاد دیتابیس تکراری در هنگام رفرش شدن صفحه

سلام دوستان وقت بخیر
من با php یک صفحه ثبت نام طراحی کرده ام که اطلاعات وارد شده رو میگیره و در دیتابیس سایت ذخیره میکنه ولی وقتی خودم برای اشکال زدایی صفحه رو رفرش میکنم یک مقدار پیشفرضی به دیتابیس ارسال و در اونجا ذخیره میشه کسی میتونه راهنماییم کنه که از این کار جلوگیری کنم؟ چون اگر کاربر هم این صفحه رو به هردلیلی توی مرورگرش رفرش کنه به دیتابیس محتوای فرم هارو میفرسته و عملا این کار درست نیست.
بخش PHP کدم رو میزارم که اگر اشکالی در کد بود راهنماییم کنید

<?php
include 'mdb.php';
if(isset($_POST['sub'])){
    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $email = $_POST['email'];
    $uname = $_POST['uname'];
    $pword = $_POST['pword'];
    $bdate = $_POST['bdate'];
    $gnder = $_POST['gnder'];
    $sender = $connect->prepare("INSERT INTO users SET firstname=?, lastname=?, email=?, username=?, password=?, birthdate=?, gender=?");
    $sender->bindValue(1, $fname);
    $sender->bindValue(2, $lname);
    $sender->bindValue(3, $email);
    $sender->bindValue(4, $uname);
    $sender->bindValue(5, $pword);
    $sender->bindValue(6, $bdate);
    $sender->bindValue(7, $gnder);
    $sender->execute();
}
?>

@ali.bayat @mhyeganeh @milad @Rp76 @hesammousavi


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
2

در کل نمیشه پاسخ مشخص داد. چون اطلاعات دقیقی از صفحات و کاری که میخواهید انجام بدید ندادید و با این شرایط احتمالا بهترین پیشنهاد یادگیری بهتر PHP هست. ولی اگر صرفا دنبال حل کردن این موضوع خاصتون هستید کدهای زیر رو جایگزین کدهایی که خودتون ارسال کردید، بکنید و مجدد تست کنید:

<?php

include 'mdb.php';

if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['sub'])){

    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $email = $_POST['email'];
    $uname = $_POST['uname'];
    $pword = $_POST['pword'];
    $bdate = $_POST['bdate'];
    $gnder = $_POST['gnder'];
    $sender = $connect->prepare("INSERT INTO users SET firstname=?, lastname=?, email=?, username=?, password=?, birthdate=?, gender=?");
    $sender->bindValue(1, $fname);
    $sender->bindValue(2, $lname);
    $sender->bindValue(3, $email);
    $sender->bindValue(4, $uname);
    $sender->bindValue(5, $pword);
    $sender->bindValue(6, $bdate);
    $sender->bindValue(7, $gnder);
    $sender->execute();

}

?>

همچنین دقت کنید که این کدها رو داخل همون صفحه فرمتون بذارید و بعد مقدار action المنت form تون رو هم همون صفحه تنظیم کنید یا اینکه خالی بگذارید تا پیشفرض همون صفحه تنظیم بشه.


رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 3 سال پیش مطرح شد
2

سلام

if(isset($_POST['sub'] && !empty($_POST['sub'])){

}

محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
3

منظورتون از اینکه یک مقدار پیش فرض ذخیره میشه چیه...؟ داده اش از کجا میاد؟!

به طور کلی اگر این اطلاعات از طریق submit کردن فرم هست یکی از راه هاش اینه که باید مطمئن بشید تکه کد بالایی که ارسال کردید فقط در شرایطی اجرا بشه که کاربر فرم رو با متد POST سابمیت کرده. یعنی یک http ریکوئست با متد POST ارسال شده باشه. (اینجوری دیگه رفرش صفحه درباره اش صدق نمی‌کنه و اصلا اجرا نمی شه)

مثلا با کد زیر می‌تونید از این قضیه مطمئن بشید:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    //Request is POST!
}

شرط بالا رو می‌تونید با شرط خودتون و یا کد آقای پارسیان که بالاتر نوشتند ترکیب کنید تا به نتیجه مورد نظرتون برسید.


علی ولی‌نژاد
تخصص : طراح گرافیک و برنامه نویس
@AliValinejad 3 سال پیش مطرح شد
3

@mhyeganeh
یعنی یکسری داده ک قبلا وارد کرده بودم رو به دیتابیس ارسال میکنه اون هم در حالی که تکست اینپوت ها خالی هستن :/


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
1

مقدار action رو برای المنت form آدرس همون صفحه فرم قرار بدید. و یا اینکه بعد از انجام عملیات ذخیره در دیتابیس کاربر رو به یک صفحه دیگر ریدایرکت کنید.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

مواردی که دوستان گفتند رو بررسی کن

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

SELECT EXISTS(SELECT * FROM users WHERE email=`john@example.com`)

کوئری بالا true/false برمیگردونه

همچنین میتونی در سطح دیتابیس چک کنی
و مثلا فیلد ایمیل رو UNIQUE در نظر بگیری


علی ولی‌نژاد
تخصص : طراح گرافیک و برنامه نویس
@AliValinejad 3 سال پیش آپدیت شد
3

خیلی ممنون @ali.bayat
مشکل اینه که در باب PHP هیچی بلد نیستم فقط بلدم متغیر تعریف کنم😶 و دوتا کد بالایی که دوستان عرض کردند رو خواستم امتحان کنم ولی فک کنم اشتباه توی کدم وارد میکردم💔. واقعیتش فقط از css و html سردرمیارم و ازطریق یک آموزش ویدیوی این مبحث رو دنبال میکنم توی اون هم این مشکل رو برطرف نکردن من هم موندم که خب چیکار کنم دیتابیسم با موارد تکراری پر نشه.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
2

در کل نمیشه پاسخ مشخص داد. چون اطلاعات دقیقی از صفحات و کاری که میخواهید انجام بدید ندادید و با این شرایط احتمالا بهترین پیشنهاد یادگیری بهتر PHP هست. ولی اگر صرفا دنبال حل کردن این موضوع خاصتون هستید کدهای زیر رو جایگزین کدهایی که خودتون ارسال کردید، بکنید و مجدد تست کنید:

<?php

include 'mdb.php';

if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['sub'])){

    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $email = $_POST['email'];
    $uname = $_POST['uname'];
    $pword = $_POST['pword'];
    $bdate = $_POST['bdate'];
    $gnder = $_POST['gnder'];
    $sender = $connect->prepare("INSERT INTO users SET firstname=?, lastname=?, email=?, username=?, password=?, birthdate=?, gender=?");
    $sender->bindValue(1, $fname);
    $sender->bindValue(2, $lname);
    $sender->bindValue(3, $email);
    $sender->bindValue(4, $uname);
    $sender->bindValue(5, $pword);
    $sender->bindValue(6, $bdate);
    $sender->bindValue(7, $gnder);
    $sender->execute();

}

?>

همچنین دقت کنید که این کدها رو داخل همون صفحه فرمتون بذارید و بعد مقدار action المنت form تون رو هم همون صفحه تنظیم کنید یا اینکه خالی بگذارید تا پیشفرض همون صفحه تنظیم بشه.


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

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