Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 验证表单不工作_Php_Forms - Fatal编程技术网

Php 验证表单不工作

Php 验证表单不工作,php,forms,Php,Forms,我的表单工作正常,但现在我的表单有一个问题:即使表单正确且完整,也不会发送邮件,如果输入不正确(例如地址邮件或电话号码或输入名称的最小长度),也不会发送错误消息 主机的(最后一个)PHP版本是5.6.10 拜托,有人能帮我吗?Thx 表格编号: <?php session_start(); ?> <!DOCTYPE....> <head> ... </head> <body> ... ... <?ph

我的表单工作正常,但现在我的表单有一个问题:即使表单正确且完整,也不会发送邮件,如果输入不正确(例如地址邮件或电话号码或输入名称的最小长度),也不会发送错误消息

主机的(最后一个)PHP版本是5.6.10

拜托,有人能帮我吗?Thx

表格编号:

<?php session_start(); ?>
<!DOCTYPE....>

<head>
...
</head>

<body>
    ...
    ...

    <?php include 'scripts/contact.php'; ?>

     <form action="Contact.php" method="post" accept-charset="UTF-8">
      <table id="formular">
       <tr>
        <td><label for="nume">Nume:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><input type="text" name="nume" id="nume" maxlenght="20" value="<?php echo $_POST['nume']; ?>" /></td>
        <td><span class="err"><?php if(isset($errors['nume'])&&$error) { print $errors['nume']; } ?></span></td>
       </tr>

       <tr>
        <td><label for="prenume">Prenume:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><input type="text" name="prenume" id="prenume" maxlenght="20" value="<?php echo $_POST['prenume']; ?>" /></td>
        <td><span class="err"><?php if(isset($errors['prenume'])&&$error) { print $errors['prenume']; } ?></span></td>
       </tr>

       <tr>
        <td><label for="telefon">Telefon:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><input type="text" name="tel" id="tel" maxlenght="20" value="<?php echo $_POST['tel']; ?>" /></td>
        <td><span class="err"><?php if(isset($errors['tel'])&&$error) { print $errors['tel']; } ?></span></td>
       </tr>

       <tr>
        <td><label for="email">Email:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</td>
        <td><input type="text" name="email" id="email" maxlength="50" value="<?php echo $_POST['email']; ?>" /></label></td>
        <td><span class="err"><?php if(isset($errors['email'])&&$error) { print $errors['email']; } ?></span></td>
       </tr>

 <tr>
        <td><label for="mesaj">Mesaj:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><textarea cols="20" rows="5" wrap="virtual" id="mesaj" name="mesaj" maxlength="150" onkeyup="nrcaractere()"><?php echo $_POST['mesaj']; ?></textarea><br>
        <div id="ramase">150 chars remaining</div>
        <script type="text/javascript">window.ready = nrcaractere();</script></td>
        <td><span class="err"><?php if(isset($errors['mesaj'])&&$error) { print $errors['mesaj']; } ?></span></td>
       </tr>

  <tr>
        <td></td> 
        <td align="center">
         <button type="submit" name="trimite" />Trimite</button>
         <button type="button" name="reset" onClick="sterge()" />Reset</button></td>
        <td></td>
       </tr>
      </table>
     </form>
...
...

...
...
...
Nume:*

听起来您有两个问题,一个是验证问题,另一个是发送电子邮件问题。首先解决最简单的问题:首先看看您的邮件设置是否正确——php是否可以正常发送电子邮件,或者这是您的代码有问题吗?我使用以下php脚本来告诉我服务器是否正确设置为发送电子邮件:

<?php 
    ini_set( 'display_errors', 1 );
    error_reporting( E_ALL );
    $from = "<YOUR EMAIL>";
    $to = "<YOUR EMAIL>";
    $subject = "PHP Mail Test script";
    $message = "This is a test to check the PHP Mail functionality";
    $headers = "From:" . $from;
    mail($to,$subject,$message, $headers);
    echo "Test email sent";
?>

它不工作,你需要配置服务器让php发送电子邮件。我喜欢使用ssmtp守护进程来简化向SMTP服务器发送电子邮件的过程

至于验证代码,很难理解。您是否考虑过改用验证库?您甚至可以使用原始HTML5——请参见此处:

但如果您真的想使用自己的php验证器,我个人会编写如下内容:

<?php 
$validation_elements = array(
    'nume' => function() {
        if (!isset($_POST['nume'])) return 'You must enter your nume';
        if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume']) return 'Your nume can only be letters.;'
        return false;
    },
    'prenume' => function() {
        if (!isset($_POST['Mandatory'])) return 'Your prenume is mandatory';
        if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) return "Your presume can only consist of letters";
        if (strlen($_POST['prenume'])<3) return "Your presume is too short.";   
        return false;
    }, 
    'tel' => function() {
        if (!isset($_POST['tel']) return false; // in this example tel is not mandatory but must match the following rule if it is present:
        if ( !preg_match('/^[0-9]{4}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{3}$/', $_POST['tel']) && !preg_match('/^[0-9]{3}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{2}[\s.]{0,1}[0-9]{2}$/', $_POST['tel']) && ($_POST['tel'] != '-')) return '&nbsp;Mask: 021.021.02.01 or 0740.123.456 or -';     
        return false;  
    },
    'email' => function() {
        if (!isset($_POST['email'])) return 'Your email is mandatory';
        if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) return "Your email address must be like something@something.something";
        return false;
    },
    'mesaj' => function() {
        if (!isset($_POST['mesaj'])) return 'Your mesaj is mandatory';  
        if (strlen($_POST['mesaj'])<15) return 'Mesaj too short. Min. 15 chars';
        if (strlen($_POST['mesaj'])>150) return 'Mesaj too long. Max 150 chars.';
        return false;
    }
}

foreach ($validation_elements as $validation_element => $validation_rule) {
    $errors = array();
    if ($validation_rule()) {
        $errors[] = $validation_rule($validation_element);
    }
}
if (!empty($errors)) {
    echo "The form was not completed because: <ul>";
    foreach ($errors as $error) {
        echo "<li>$error</li>";
    }
    echo "</ul>";
} else {
    send_email();
}

听起来您有两个问题,一个是验证问题,另一个是发送电子邮件问题。首先解决最简单的问题:首先看看您的邮件设置是否正确——php是否可以正常发送电子邮件,或者这是您的代码有问题吗?我使用以下php脚本来告诉我服务器是否正确设置为发送电子邮件:

<?php 
    ini_set( 'display_errors', 1 );
    error_reporting( E_ALL );
    $from = "<YOUR EMAIL>";
    $to = "<YOUR EMAIL>";
    $subject = "PHP Mail Test script";
    $message = "This is a test to check the PHP Mail functionality";
    $headers = "From:" . $from;
    mail($to,$subject,$message, $headers);
    echo "Test email sent";
?>

它不工作,你需要配置服务器让php发送电子邮件。我喜欢使用ssmtp守护进程来简化向SMTP服务器发送电子邮件的过程

至于验证代码,很难理解。您是否考虑过改用验证库?您甚至可以使用原始HTML5——请参见此处:

但如果您真的想使用自己的php验证器,我个人会编写如下内容:

<?php 
$validation_elements = array(
    'nume' => function() {
        if (!isset($_POST['nume'])) return 'You must enter your nume';
        if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume']) return 'Your nume can only be letters.;'
        return false;
    },
    'prenume' => function() {
        if (!isset($_POST['Mandatory'])) return 'Your prenume is mandatory';
        if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) return "Your presume can only consist of letters";
        if (strlen($_POST['prenume'])<3) return "Your presume is too short.";   
        return false;
    }, 
    'tel' => function() {
        if (!isset($_POST['tel']) return false; // in this example tel is not mandatory but must match the following rule if it is present:
        if ( !preg_match('/^[0-9]{4}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{3}$/', $_POST['tel']) && !preg_match('/^[0-9]{3}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{2}[\s.]{0,1}[0-9]{2}$/', $_POST['tel']) && ($_POST['tel'] != '-')) return '&nbsp;Mask: 021.021.02.01 or 0740.123.456 or -';     
        return false;  
    },
    'email' => function() {
        if (!isset($_POST['email'])) return 'Your email is mandatory';
        if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) return "Your email address must be like something@something.something";
        return false;
    },
    'mesaj' => function() {
        if (!isset($_POST['mesaj'])) return 'Your mesaj is mandatory';  
        if (strlen($_POST['mesaj'])<15) return 'Mesaj too short. Min. 15 chars';
        if (strlen($_POST['mesaj'])>150) return 'Mesaj too long. Max 150 chars.';
        return false;
    }
}

foreach ($validation_elements as $validation_element => $validation_rule) {
    $errors = array();
    if ($validation_rule()) {
        $errors[] = $validation_rule($validation_element);
    }
}
if (!empty($errors)) {
    echo "The form was not completed because: <ul>";
    foreach ($errors as $error) {
        echo "<li>$error</li>";
    }
    echo "</ul>";
} else {
    send_email();
}

我前面的答案的问题是它不可移植——你不能把代码带到别处使用。在我之前的回答中,我暗示有另一种更好的方法来编写验证例程。给你。它更复杂,但只是稍微复杂一点

<?php
$validation_rules = array(
    'tel' => array(
        'required' => true
    ),
    'mesaj' => array(
        'lessThan' => 150,
        'moreThan' => 15,
        'alphanumeric' => true
    ), <etc>
);

$errors = array();

/* Note: you could also write each validation rule like this:
function required($input, $is_required) {
    ... <etc>
} 
The function name is the name of the validation rule in the above array.*/

$validation_types = array() {
    'required' => function($input, $is_required) {
        $isset = isset($_POST[$input]));
        return ($is_required && !$isset) ? "$input is required" : false;
    },
    'alphanumeric' => function($input, $is_required) {
        return preg_match('/^[a-zA-Z]{1,}$/',$_POST[$input] ? "$input must be alphanumeric" : false;
    },
    'likeEmail' => function($input, $is_required) {
        return !preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST[$input]) ? "$input must be like an email address" : false;
    },
    'lessThan' => function($input, $value) {
        return (!strlen($input) < $value) ? "$input must be less than $value" : false;
    }, <etc>
}
foreach ($validation_rules as $input=>$rules) {
    foreach($rules as $rule=>$params) {
        $validation_failed = $validation_types[$rule]($input, $params);
        // if you used the simpler way of declaring validation rules,use this instead:
        // $validation_failed = $rule($input, $params);
        if ($validation_failed) {
            $errors[] = $validation_failed;
        }
    }
}

我前面的答案的问题是它不可移植——你不能把代码带到别处使用。在我之前的回答中,我暗示有另一种更好的方法来编写验证例程。给你。它更复杂,但只是稍微复杂一点

<?php
$validation_rules = array(
    'tel' => array(
        'required' => true
    ),
    'mesaj' => array(
        'lessThan' => 150,
        'moreThan' => 15,
        'alphanumeric' => true
    ), <etc>
);

$errors = array();

/* Note: you could also write each validation rule like this:
function required($input, $is_required) {
    ... <etc>
} 
The function name is the name of the validation rule in the above array.*/

$validation_types = array() {
    'required' => function($input, $is_required) {
        $isset = isset($_POST[$input]));
        return ($is_required && !$isset) ? "$input is required" : false;
    },
    'alphanumeric' => function($input, $is_required) {
        return preg_match('/^[a-zA-Z]{1,}$/',$_POST[$input] ? "$input must be alphanumeric" : false;
    },
    'likeEmail' => function($input, $is_required) {
        return !preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST[$input]) ? "$input must be like an email address" : false;
    },
    'lessThan' => function($input, $value) {
        return (!strlen($input) < $value) ? "$input must be less than $value" : false;
    }, <etc>
}
foreach ($validation_rules as $input=>$rules) {
    foreach($rules as $rule=>$params) {
        $validation_failed = $validation_types[$rule]($input, $params);
        // if you used the simpler way of declaring validation rules,use this instead:
        // $validation_failed = $rule($input, $params);
        if ($validation_failed) {
            $errors[] = $validation_failed;
        }
    }
}

我没有看到
mesaj
name属性。报告错误。抱歉,已编辑并更新。ThxI请参见无
mesaj
name属性。报告错误。抱歉,已编辑并更新。谢谢