我的表单工作正常,但现在我的表单有问题:即使表单正确完整也没有发送邮件,如果输入不正确则没有错误信息(例如地址邮件或电话号码或分钟。输入名称的长度)。
主机的(最后一个)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: <span style="color: red"><sup>*</sup></span> </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: <span style="color: red"><sup>*</sup></span> </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: <span style="color: red"><sup>*</sup></span> </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: <span style="color: red"><sup>*</sup></span> </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: <span style="color: red"><sup>*</sup></span> </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>
...
...
和验证脚本:
<?php
if (isset($_POST['trimite']))
{ $error = FALSE;
if (empty($_POST['nume'])) {
$errors['nume']=' Mandatory';
$error = TRUE;
}
else {
if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume'])) {
$errors['nume']=' Only letters';
$error = TRUE;
}
else {
if (strlen($_POST['nume'])<3) {
$errors['nume']=' Too short. Min. 3 chars';
$error = TRUE;
}
else {
$errors['nume']='<img src=/images/ok.jpg>';
}
}
}
if (empty($_POST['prenume'])) {
$errors['prenume']=' Mandatory';
$error = TRUE;
}
else {
if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) {
$errors['prenume']=' Only letters';
$error = TRUE;
}
else {
if (strlen($_POST['prenume'])<3) {
$errors['prenume']=' Too short. Min. 3 chars';
$error = TRUE;
}
else {
$errors['prenume']='<img src=/images/ok.jpg>';
}
}
}
if (empty($_POST['tel'])) {
$errors['tel']=' Mandatory';
$error = TRUE;
}
else {
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'] != '-')) {
$errors['tel']=' Mask: 021.021.02.01 or 0740.123.456 or -';
$error = TRUE;
}
else {
$errors['tel']='<img src=/images/ok.jpg>';
}
}
if (empty($_POST['email'])) {
$errors['email']=' Mandatory';
$error = TRUE;
}
else {
if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) {
$errors['email']=' Invalid address';
$error = TRUE;
}
else {
$errors['email']='<img src=/images/ok.jpg>';
}
}
if (empty($_POST['mesaj'])) {
$errors['mesaj']=' Mandatory';
$error = TRUE;
}
else {
if (strlen($_POST['mesaj'])<15) {
$errors['mesaj']=' Too short. Min. 15 chars';
$error = TRUE;
}
else {
if (strlen($_POST['mesaj'])>150) {
$errors['mesaj']=' Too long. Max. 150 chars';
$error = TRUE;
}
else {
$errors['mesaj']='<img src=/images/ok.jpg>';
}
}
}
if (!$error) {
$destinatar = "my_address@yahoo.com";
$subject = "Site message";
$body = 'Nume: '.$_POST['nume'].'
<br>
Prenume: '.$_POST['prenume'].'
<br>
Telefon: '.$_POST['tel'].'
<br>
Email: '.$_POST['email'].'
<br><br>
Mesaj: '.$_POST['mesaj'];
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
if (mail($destinatar,$subject,$body,$headers)) {
echo '<script type="text/javascript">alert("Message sent!")</script>';
unset($_POST);
}
else {
echo '<script type="text/javascript">alert("Not sent. Try again!")</script>';
}
}
}
$_SESSION['s']=$s;
?>
PS。请原谅我糟糕的英语。
答案 0 :(得分:1)
听起来你有两个问题,一个是验证,一个是发送电子邮件。首先解决最容易的问题:首先找出你的邮件设置是否正确 - 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 - 请参阅此处:http://www.the-art-of-web.com/html/html5-form-validation/。
但是如果你真的想使用自己的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 ' 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 = array(
'tel' => array(
'required' => true
),
'mesaj' => array(
'lessThan' => 150,
'moreThan' => 15,
'alphanumeric' => true
),
<etc.>
...但如果你想写一些功能齐全的东西,我会留给你弄清楚如何。
最后,关于验证的一个词 - 这很难,大多数程序员都弄错了。您必须非常仔细地评估有效数据的最意外可能性。
例如:如果我尝试给你写信,我的手机会被视为有效吗?我有一个英国电话号码,其格式可以是+44 xxxxx xxxxx,0xxxxxxxxxx,甚至是(+44)xxxxx xxxxx。
您当前的验证规则可能对您有好处,但O'Shea夫人或O'connor女士能否向您发送消息?那么麦克达夫先生呢?来自新加坡的Ng博士甚至来自美国的Nil教授怎么样?或者对于名字,安·王尔德女士呢?所有这些都是完全有效的名称,即使它们在您的预期用户中不典型。我甚至认识一个名叫Ben X的人,虽然这不是他的注册名称。
祝你好运!答案 1 :(得分:1)
我之前回答的问题是它不可移植 - 您无法接受该代码并在其他地方使用它。在我之前的回答中,我暗示还有另一种更好的方法来编写验证例程。这里是。它更复杂,但只是稍微如此。
<?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;
}
}
}
这段代码更好的原因是因为它也可以用于其他形式,但阅读起来并不复杂。