💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۰ Morteza.M
validation form
محسن موحد حل شده توسط محسن موحد

با سلام 

برای اعتبارسنجی فیلدهای فرم روش‌های مختلفی توی اینترنت وجود داره کاش داخل این پروژه  یک جلسه هم در خصوصش میزاشتین خیلی عالی میشد تا جایی که من مطلع هستم تا اینجای دوره راجبش مطالب کاملی گفته نشده و اگر pdf و یا آموزش قابل اعتمادی هم در این خصوص دارین با ما در اشتراک بزارین ممنون میشم 

سلام،

الان ما از توابع پایه‌ای مثل isset و empty برای اعتبارسنجی فرم‌ها استفاده می‌کنیم. این توابع پایه و اساس اعتبارسنجی تو PHP هستن و به ما کمک می‌کنن که مطمئن بشیم ورودی‌ها خالی نیستن و درست ارسال شدن. مثلاً با این توابع می‌تونیم چک کنیم که یه فیلد اجباری حتماً پر شده باشه:

if (isset($_POST['name']) && !empty($_POST['name'])) {
    // فیلد نام پر شده است
} else {
    // فیلد نام خالی است
}

بعد از اینکه با isset و empty چک اولیه رو انجام دادیم، بسته به نوع فیلد، می‌تونیم اعتبارسنجی‌های بیشتری انجام بدیم. مثلاً برای چک کردن ایمیل از فیلتر filter_var استفاده می‌کنیم:

if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    // ایمیل معتبر است
} else {
    // ایمیل معتبر نیست
}

یا برای چک کردن طول رشته:

if (strlen($_POST['username']) >= 5) {
    // طول نام کاربری مناسب است
} else {
    // طول نام کاربری کوتاه است
}

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

<?php
class Validator {
    protected $data;
    protected $errors = [];
    public function __construct($data) {
        $this->data = $data;
    }
    public function required($field, $message = null) {
        if (!isset($this->data[$field]) || empty($this->data[$field])) {
            $this->errors[$field] = $message ?? "$field is required.";
        }
        return $this;
    }
    public function email($field, $message = null) {
        if (isset($this->data[$field]) && !filter_var($this->data[$field], FILTER_VALIDATE_EMAIL)) {
            $this->errors[$field] = $message ?? "$field must be a valid email address.";
        }
        return $this;
    }
    public function minLength($field, $length, $message = null) {
        if (isset($this->data[$field]) && strlen($this->data[$field]) < $length) {
            $this->errors[$field] = $message ?? "$field must be at least $length characters long.";
        }
        return $this;
    }
    public function getErrors() {
        return $this->errors;
    }
    public function passes() {
        return empty($this->errors);
    }
}
// استفاده از کلاس ولیدیشن
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $validator = new Validator($_POST);
    $validator->required('name')
              ->required('email')
              ->email('email')
              ->minLength('password', 6);
    if ($validator->passes()) {
        // Validation passed, process the form
        echo "Form is valid!";
    } else {
        // Validation failed, display errors
        $errors = $validator->getErrors();
        foreach ($errors as $field => $error) {
            echo "$field: $error<br>";
        }
    }
}
?>

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

محسن موحد ۳۰ خرداد ۱۴۰۳، ۰۷:۵۵

با تشکر از توضیحاتتون 

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

 

 

Morteza.M ۳۰ خرداد ۱۴۰۳، ۰۸:۲۷

بله در جلسات جلوتر با مفاهیم شی گرایی و همچنین معماری MVC بطور کامل آشنایی پیدا میکنید.

بهترین پاسخ
محسن موحد ۳۰ خرداد ۱۴۰۳، ۰۸:۴۵

با سلام 

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

Morteza.M ۳۰ خرداد ۱۴۰۳، ۱۲:۳۸

نمیدونم چه مشکلی هست متاسفانه نتونستم عکسارو آپلود کنم !

Morteza.M ۳۰ خرداد ۱۴۰۳، ۱۲:۴۴

میتونید کدهاتون رو در بلاک کد قرار بدید.

محسن موحد ۳۱ خرداد ۱۴۰۳، ۰۶:۴۷

auth.php

// For defining variables to empty values  
// For Showing Errors
$nameErr = "";
$emailErr = "";
$phoneErr = "";
// For holding user data
$name = "";
$email = "";
$phone = "";
// Input fields validation  
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // Validating the User Name 
    if (empty($_POST["name"])) {
        $nameErr = "Name is required";
    } else {
        $name = input_data($_POST["name"]);
        // To check that User Name only contains alphabets, numbers, and underscores 
        if (!preg_match("/^[a-zA-Z]*$/", $name)) {
            $nameErr = 
              "Only alphabets are allowed for Name";
        }
    }
    // Validating the User EmailID ID  
    if (empty($_POST["email"])) {
        $emailErr = "Email is required";
    } else {
        $email = input_data($_POST["email"]);
        // To check that the e-mail address is well-formed  
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $emailErr = "Invalid Email ID format";
        }
    }
    // Validating the User Phone Number 
    if (empty($_POST["phone"])) {
        $phoneErr = "Phone Number is required";
    } else {
        $phone = input_data($_POST["phone"]);
        // To check that Phone No is well-formed  
        if (!preg_match("/^[0-9]*$/", $phone)) {
            $phoneErr = "Only numeric values are allowed!!";
        }
        // To check that Phone No length should not be less and greator than 10  
        // if (strlen($phoneNo) != 10) {
        //     $phoneErr = "Please provide a phone number of 10 digits!!";
        // }
    }
}
function ehcoFieldds(){
    global $name;
    global $phone;
    global $email;
    echo $name .'<br>';
    echo $phone .'<br>';
    echo $email .'<br>';
}
if (isset($_GET['action']) && $_GET['action'] == 'register'){
        include "tpl/register-tpl.php";
    }else{
        include "tpl/login-tpl.php";
    }
Morteza.M ۳۱ خرداد ۱۴۰۳، ۲۱:۲۳

و همچنین این کد‌های html را هم داخل فایل register.php اضافه میکنیم 

<div style="background-color: green;color: white;border: solid white;border-radius: 10px;">
<?php
    // Checking if submit button is pressed or not
    if (isset ($_POST['submit'])) {
    // Checking if there is any error or not
    if ($nameErr == "" && $phoneErr == "" && $emailErr == "" ) {
    echo "<p class='msg'>You have been sucessfully registered👍</p>";
    echo "<h3>Your Details are :</h3>";
    echo "<p class='info'>User Name : " . $name . "</p>";
    echo "<p class='info'>Phone Number : " . $phone . "</p>";
    echo "<p class='info'>EmailID ID : " . $email . "</p>";
    } else {
    echo "<p class='msg'>You shared Invalid details❌
    <br/>Please provide correct data!</p>";
    }
   }
  ?>
</div>  

 

Morteza.M ۳۱ خرداد ۱۴۰۳، ۲۱:۲۹

و همچنین تابع input_data($data) داشتیم که در فایل جداگانه نوشتم اونم به این شکله 

function input_data($data)
{
    // trim() is used to remove any trailing whitespace
    $data = trim($data);
    // htmlspecialchars() is used to convert 
    // special characters into their HTML entities
    // Example - "&" -> "&amp"
    $data = htmlspecialchars($data);
    return $data;
}
Morteza.M ۳۱ خرداد ۱۴۰۳، ۲۱:۳۷