我有以下表单使用PHP和JavaScript来验证...
问题是,每次我想更新表单中的输入时,我还需要更新PHP中的&& isset
和$input = $_REQUEST['input name'];
!这些重要吗?没有办法让整个过程更容易?!请指教
PHP:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
ob_start();
if(isset($_REQUEST['name'])
&& isset($_REQUEST['email'])
&& isset($_REQUEST['message'])
&& isset($_REQUEST['number'])
&& isset($_REQUEST['date'])
&& isset($_REQUEST['select'])
&& isset($_REQUEST['radio'])
&& isset($_REQUEST['checkbox'])
&& isset($_REQUEST['token'])){
if($_SESSION['token'] != $_POST['token']){
$response = "0";
} else {
$_SESSION['token'] = "";
$name = $_REQUEST['name'];
$email = $_REQUEST['email'];
$message = $_REQUEST['message'];
$number = $_REQUEST['number'];
$date = $_REQUEST['date'];
$select = $_REQUEST['select'];
$radio = $_REQUEST['radio'];
$checkbox = $_REQUEST['checkbox'];
$to = "";
$subject = "New Message From: $name";
$message = "Name: $name<br/>
number: $number<br/>
date: $date<br/>
select: $select<br/>
radio: $radio<br/>
checkbox: $checkbox<br/>
Email: $email<br/>
Message: $message";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'From: '.$email . "\r\n";
$mailed = (mail($to, $subject, $message, $headers));
if( isset($_REQUEST['ajax']))$response = ($mailed) ? "1" :
"0"; else $response = ($mailed) ? "<h2>Success!</h2>" :
"<h2>Error! There was a problem with sending.</h2>";
echo $response;
}
} else {
echo "Form data error!";
}
ob_flush();
die();
}
?>
HTML表单:
<?php
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
?>
<!--Contact Form-->
<form id="contactForm" name="contactForm" action="contact.php" method="post">
<input name="token" type="hidden" value="<?php echo $token; ?>">
<input name="ajax" type="hidden" value="1">
<div class="name">
<p>Your Name</p>
<input name="name" class="required" autocomplete="off">
</div>
<div class="email-address">
<p>Email Address</p>
<input name="email" class="required email" autocomplete="off">
</div>
<div class="message">
<p>Message</p>
<textarea name="message" rows="5" class="required min3"></textarea>
</div>
<div class="number">
<p>Phone Number</p>
<input name="number" class="number" autocomplete="off">
</div>
<div class="date">
<p>Date <small>(dd/mm/yyyy)</small></p>
<input name="date" class="required date calendar" autocomplete="off">
</div>
<div class="dropdown">
<select name="select" class="required">
<option value="">Select</option>
<option value="DropdownA">DropdownA</option>
<option value="DropdownB">DropdownB</option>
</select>
</div>
<div class="radio">
<p>Radios:</p>
<label><input name="radio" type="radio" value="male" class="required">Male</label>
<label><input name="radio" type="radio" value="female" class="required">Female</label>
</div>
<div class="checkbox">
<p>Checkboxs:</p>
<label><input name="checkbox" type="checkbox" value="OptionA" class="required">Option A</label>
<label><input name="checkbox" type="checkbox" value="OptionB" class="required">Option B</label>
</div>
<div>
<p></p>
<input name="" class="required number spamcheck">
</div>
<button id="submit" type="submit">Send</button>
</form>
答案 0 :(得分:1)
在使用变量之前,您需要检查变量是否已设置。否则,您的脚本将引发未定义变量的错误。例如。您每次都会尝试检查$_SESSION['token'] != $_POST['token']
是否会给您错误,因为没有提交表单(或者请求已发送)token
名称,这就是您之前需要检查的原因这一点。
无论如何,对于多个isset()
,您可以使用逗号分隔符
if(isset($var, $var2, $var3...))
而不是
if(isset($var) && isset($var2)...))
此外,如果您的会话令牌也未初始化(对页面的全新请求),并且没有请求发送给它,则您的if()
语句将返回false,从而触发mail()
功能。因此,在特定情况下,在以邮件形式使用它们之前进行检查是非常必要的。
答案 1 :(得分:0)
是。它们很重要。有很多方法可以让这个过程变得更容易。您可能希望查看一个简单的框架,如Symfony(forms component可以独立于整个框架使用。)
请注意,您可能会收到大量的垃圾邮件。添加reCaptcha等验证码。
答案 2 :(得分:0)
是的,验证很重要,但您可以简化代码。我会使用数组来定义必填字段。它易于维护,代码少得多。
$requiredFields = array('name', 'email', 'message', 'number');
$valid = true;
foreach ($requiredFields as $field) {
if (!isset($_REQUEST[$field])) {
$valid = false;
break;
}
}
if ($valid) {
// Do the stuff
} else {
echo "Form data error!";
}
如果要检查当前字段是否实际包含某些内容,请将empty()添加到条件中:
if (!isset($_REQUEST[$field]) || empty($_REQUEST[$field])) {
我认为在这种情况下,将post值分配给单独变量的第二部分实际上是不必要的。