روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۴ عادل غفاری
تکراری بودن ایمیل (ارور)
جامعه پی اچ پی ایجاد شده در ۱۴ شهریور ۱۴۰۱

سلام وقت بخیر

من توی دیتا بیس ستون ایمیل رو unique کردن و وقتی که ایمیل رو دارم تکراری وارد میکنم ارور میده چجور اعتبار سنجی کنم که ایمل تکراری نباشه

function registr($userData)
{
    global $pdo;
    if (!empty($userData['username']) && !empty($userData['email']) && !empty($userData['password'])) {
        $password = password_hash($userData['password'], PASSWORD_BCRYPT);
        $sql = "INSERT INTO users (username,email,password) VALUES(:username,:email,:password);";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([':username' => $userData['username'], ':email' => $userData['email'], ':password' => $password]);
        return $stmt->rowCount() ? true : false;
    }
    return false;
}
عادل غفاری ۱۴ شهریور ۱۴۰۱، ۱۱:۱۵

سلام دوست عزیز

شما میای و یه تابع به نام isUserExist ایجاد میکنی و قبل از عملیاتت داخل اون تابع یه select میزنی روی پایگاه داده و مطمئن میشی اون یوزر نباشه

موفق باشید. ?

محمد گازری ۱۴ شهریور ۱۴۰۱، ۱۴:۱۳

متوجه نشدم چطور بایدانجام بدم میشه واضح‌تر بگین؟

عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۲:۴۹

یه همچین تابعی تعریف کن و چک کن قبل از اینکه رجیستر کنی (این تابع هم ایمیل و هم شماره تلفن رو چک میکنه)

function isUserExists(string $email = null, string $phone = null): bool
{
    global $pdo;
    $sql = 'SELECT * FROM `users` WHERE `email` = :email OR `phone` = :phone;';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':email' => $email ?? '', 'phone' => $phone ?? '']);
    $record = $stmt->fetch(PDO::FETCH_OBJ);
    return $record ? true : false;
}
محمد گازری ۱۵ شهریور ۱۴۰۱، ۰۳:۴۹

خب من الا مقادیر رو دارم از فرم میگیرم کجا ای $email رو اضافه کنم؟

عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۵:۴۶
$stmt->execute([':username' => $userData['username'] ?? $email, ':email' => $userData['email'], ':password' => $password]);
عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۵:۴۶

عادل جان کمی دقت کن!

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

محمد گازری ۱۵ شهریور ۱۴۰۱، ۰۵:۴۹
    if ($action == 'register') {
        $result = registr($params);
        $UserExists = isUserExists();
        if (!$result) {
            message("Error: an error in Registration", 'info');
        } else {
            if ($UserExists == $params['email']) {
                message("Error:", 'info');
            } else {
                message("Registration is successfull welcome to todolist
go to login"
, 'success');             }         } }

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

مشکل کد ام کجاست؟

عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۶:۴۳

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

if ($action == 'register') {
    if (!isUserExists($params['email'])) {
        if (registr($params) {
            message("Registration is successfull welcome to todolistgo to login", 'success');
        } else {
            message("Error: an error in Registration", 'info');
        }
    } else {
        message("Error: user exist with this email", 'info');
    }
}

بنظرم یه مقدار در درک این موارد مشکل داری چون اصلا حتی تابع رو درست صدا نزدی و کلا چیزی که نوشته بودی کامل غلط بود

فرصت کردی مباجث ابتدایی رو بگرد و مرور کن حتما!!

محمد گازری ۱۵ شهریور ۱۴۰۱، ۰۶:۵۳

درس شد

من اومدم الن کد روی توی همون تابع ریجستر اعمال کردم

function registr($userData)
{
    global $pdo;
    if (isset($userData['username']) and isset($userData['email']) and isset($userData['password'])) {
        if (!empty($userData['username']) && !empty($userData['email']) && !empty($userData['password'])) {
            if (!isUserExists($userData['email'])) {
                $password = password_hash($userData['password'], PASSWORD_BCRYPT);
                $sql = "INSERT INTO users (username,email,password) VALUES(:username,:email,:password);";
                $stmt = $pdo->prepare($sql);
                $stmt->execute([':username' => $userData['username'], ':email' => $userData['email'], ':password' => $password]);
                return $stmt->rowCount() ? true : false;
            }
            return false;
        }
        return false;
    }
    return false;
}

این کار که درسته؟ خود اقای اوند گفتن که اینجا یه سری اعبارسنجی هارو انجام بدین که سپرد به خودمون که انجام بدیم

عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۶:۵۷

نه عادل جان خیلی پیچیدش کردی که ?

همون روشی که گفتم باز تمیز تره

محمد گازری ۱۵ شهریور ۱۴۰۱، ۰۶:۵۸

بعد یه سوال دیگ من االان اگر ایمیل وجود داشت اومدم return کردم false بعد الان میخام که روی صفحه یه خطایی چاپ کنه باید چجور انجام بدم ؟

عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۶:۵۹

باشه همون روشی که شما گفتین انجام میدم که بشه یه خطایی هم چاپ کرد

عادل غفاری ۱۵ شهریور ۱۴۰۱، ۰۷:۰۰

اگر تاپیک حل شده میتونید به شکل حل شده در بیارید

موفق باشید ?

بهترین پاسخ
محمد گازری ۱۵ شهریور ۱۴۰۱، ۰۷:۰۲