Pergunta

Eu estou aprendendo PHP e estou tentando escrever um simples e-mail de script.Eu tenho uma função (checkEmpty) para verificar se todos os formulários são preenchidos e se o endereço de email é válido (isEmailValid).Eu não sou certo como retornar true checkEmpty funciton.Aqui está o meu código:

Quando o botão enviar é clicado:

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;
        }   
    }

Eu sei que eu não deveria estar usando globais na função, eu não sei alternativa.As mensagens de erro são exibidos ao lado de cada elemento de formulário.

Foi útil?

Solução

Primeiro de tudo, usar global é um pecado. Você está poluindo o espaço para nome global, e isso é uma má idéia, exceto pequenos scripts ad-hoc e código legado.

Segundo, você está usando mal o istet - por dois motivos: a) No contexto, você passa a variável $ nome para funcionar, por isso é sempre definido b) verifica se a variável está definida ou não

Terceiro, você deve separar a validação da geração de HTML.

Quarto, você pode usar o filter_var em vez de expressão regular para testar se o email for válido.

Por último, seu código pode parecer assim:

<?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;

}

Outras dicas

Primeiro de tudo, você realmente deve repensar a sua lógica como para evitar a variáveis globais.

Eitherway, crie uma variável $sucesso e defini-lo como true no topo de suas funções.Se qualquer um se instrução de falha, definida como false.Em seguida, retornar $sucesso no fundo de sua função.Exemplo:

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;
}

Não tenho certeza se é isso que você deseja, da maneira que eu vejo, você deseja que $ Mail_error, $ message_error e $ name_error sejam acessíveis de fora da função. Se for esse o caso, o que você precisa é algo assim:

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);

Agora você pode testar erros

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...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top