سؤال

أنا أتعلم PHP وأحاول كتابة نص بريد إلكتروني بسيط. لديّ وظيفة (checkempty) للتحقق مما إذا كان يتم ملء جميع النماذج وإذا كان امتصاص البريد الإلكتروني صالحًا (Isemailvalid). لست متأكدًا من كيفية إرجاع Funciton True CheckEmpty. هذا هو الكود الخاص بي:

عندما يتم النقر على زر الإرسال:

if (isset($_POST['submit'])) {

//INSERT FORM VALUES INTO AN ARRAY
$field = array ('name' => $_POST['name'], 'email' => $_POST['email'], 'message' => $_POST['message']);

//CONVERT ARRAY KEYS TO VARIABLE NAMES
extract ($field);
checkEmpty($name, $email, $message);



function checkEmpty($name, $email, $message) {  
    global $name_error;
    global $mail_error;
    global $message_error;

    //CHECK IF NAME FIELD IS EMPTY
    if (isset($name) === true && empty($name) === true) {
    $name_error = "<span class='error_text'>* Please enter your name</span>";
    }

//CHECK IF EMAIL IS EMPTY
if (isset($email) === true && empty($email) === true) {
    $mail_error = "<span class='error_text'>* Please enter your email address</span>";
    //AND IF IT ISN'T EMPTY CHECK IF IT IS A VALID ONE
    } 
    elseif (!isValidEmail($email)) {
        $mail_error = "<span class='error_text'> * Please enter a valid email</span>"; 
    }

    //CHECK IF MESSAGE IS EMPTY
    if (isset($message) === true && empty($message) === true) {
    $message_error = "<span class='error_text'>* Please enter your message</span>";
    }
} 

// This function tests whether the email address is valid  
function isValidEmail($email){
    $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
    if (eregi($pattern, $email))
        {
            return true;
        } else 
        {
            return false;
        }   
    }

أعلم أنني لا ينبغي أن أستخدم Globals في الوظيفة ، لا أعرف بديلاً. يتم عرض رسائل الخطأ بجانب كل عنصر نموذج.

هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، استخدام Global هو خطيئة. أنت تلوث مساحة الاسم العالمية ، وهذه فكرة سيئة ، باستثناء القليل من البرامج النصية المخصصة والرمز القديم.

ثانياً ، أنت تسيء استخدام ISSET - لسببين: أ) في السياق المعطى ، تقوم بتمرير اسم متغير $ إلى العمل ، لذلك يتم تعيينه دائمًا ب) فحصات فارغة ما إذا كان المتغير قد تم تعيينه أم لا

ثالثًا ، يجب عليك فصل التحقق من صحة HTML.

رابعًا ، يمكنك استخدام Filter_var بدلاً من التعبير العادي لاختبار ما إذا كان البريد صالحًا.

أخيرًا ، يمكن أن يبدو الرمز الخاص بك هكذا:

<?php

if (isset($_POST['submit'])) {

$fields = array ('name' => $_POST['name'], 'email' => $_POST['email'], 'message' =>     $_POST['message']);

//CONVERT ARRAY KEYS TO VARIABLE NAMES
extract ($fields);  

$errors = validateFields($name, $email, $message);

if (!empty($errors)){

    # error 

    foreach ($errors as $error){

        print "<p class='error'>$error</p>";

    }

} else {

    # all ok, do your stuff

} // if

} // if

function validateFields($name, $email, $post){

    $errors = array();

        if (empty($name)){$errors[] = "Name can't be empty";}
        if (empty($email)){$errors[] = "Email can't be empty";}
        if (empty($post)){$errors[] = "Post can't be empty";}

        if (!empty($email) && !filter_var($email,FILTER_VALIDATE_EMAIL)){$errors[] = "Invalid email";}
        if (!empty($post) && strlen($post)<10){$errors[] = "Post too short (minimum 10 characters)";}

    # and so on...

    return $errors;

}

نصائح أخرى

بادئ ذي بدء ، يجب عليك إعادة التفكير في منطقك لتجنب المتغيرات العالمية.

إما ، قم بإنشاء نجاح متغير $ وقم بتعيينه في الجزء العلوي من وظائفك. إذا كان هناك أي ما إذا فشل البيان ، فقم بتعيينه على خطأ. ثم ارجع النجاح في الجزء السفلي من وظيفتك. مثال:

function checkExample($txt) {
    $success = true;

    if (isset($txt) === true && empty($txt) === true) {
        $error = "<span class='error_text'>* Please enter your example text</span>";
        $success = false;
    }

    return $success;
}

لست متأكدًا من أن هذا ما تريده ، والطريقة التي أراها ، تريد الوصول إلى $ mail_error ، $ message_error و $ name_error من خارج الوظيفة. إذا كان هذا هو الحال ، فإن ما تحتاجه هو شيء من هذا القبيل:

function checkEmpty($name, $email, $message) {  
    $results = false;

    //CHECK IF NAME FIELD IS EMPTY
    if (isset($name) === true && empty($name) === true) {
      $results['name_error'] = "<span class='error_text'>* Please enter your name</span>";
    }

    //CHECK IF EMAIL IS EMPTY
    if (isset($email) === true && empty($email) === true) {
      $results['mail_error'] = "<span class='error_text'>* Please enter your email address</span>";
    //AND IF IT ISN'T EMPTY CHECK IF IT IS A VALID ONE
    } 
    elseif (!isValidEmail($email)) {
        $results['mail_error'] = "<span class='error_text'> * Please enter a valid email</span>"; 
    }

    //CHECK IF MESSAGE IS EMPTY
    if (isset($message) === true && empty($message) === true) {
      $results['message_error'] = "<span class='error_text'>* Please enter your message</span>";
    }

    return $results;
} 
$errors = checkEmpty($name, $email, $message);

الآن يمكنك اختبار الأخطاء

if($errors){
    extract ($errors); // or simply extract variables from array to be used next to form inputs
} else {
    // there are no errors, do other thing if needed...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top