我是PHP和JavaScript的新手,只是学习Web开发,我在空闲时间尝试各种各样的事情,但是,有一件事我找不到解决方案。 我有一个表格,只收集4个数据,名称,出生日期,电子邮件和电话号码。进一步的数据处理需要所有字段。我真的尝试过在Google上找到的每一件事,但它仍然不起作用。表单只是将所有类型的数据保存到数据库中,而不检查输入字段。
稍后我想要验证表单的代码,在同一页面上显示任何错误,而不是在另一个“.php”上,并发送2封电子邮件作为对此人的确认,一封用于通知我表格提交。我应该做什么/改变以实现这一目标?我觉得自己很困惑。
我的表格:
<form class="contactform" id="cfrm" action="process.php" method="post">
<div class="f-data">
<input class="f-error" name="uname" placeholder="NAME" type="text" required="required" data-error="Name is required.">
</div>
<div class="clear"></div>
<div class="f-data">
<select name="birthday" id="forminput" aria-required="true" aria-invalid="false">
<option value="11">11</option>
<option value="12">12</option>
</select>
<select name="birthyear" id="forminput" aria-required="true">
<option value="1900" selected="selected">1900</option>
<option value="2001">2001</option>
</select>
</div>
<div class="f-data">
<input class="f-error" name="uemail" placeholder="EMAIL" type="text" required="required" data-error="Email is required.">
</div>
<div class="f-data">
<input class="f-error" name="uphone" placeholder="PHONE" type="text" required="required" data-error="Phone is required.">
</div>
<div class="clear"></div>
<div class="submit">
<p>
<input type="submit" value="submit" name="submit">
</p>
</div>
和process.php
<?php
require "connection.php";
require "others/phpmailer/PHPMailerAutoload.php";
//form data
$connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
$Name = $connection->real_escape_string($_POST['uname']);
$DoB = $connection->real_escape_string($_POST['birthyear'] . '-' .
$_POST['birthmonth'] . '-' . $_POST['birthday']);
$inputDoB = date("Y-m-d",strtotime($DoB));
$Email = $connection->real_escape_string($_POST['uemail']);
$Phone = $connection->real_escape_string($_POST['uphone']);
if (strlen($agree) == 0) $agree = 0;
// validating
if(isset($_POST['submit']));
{
if(empty($_POST['uname']))
{
$msg_name = "You must enter name";
$name_subject = $_POST['uname'];
$name_pattern = '/^[a-zA-Z ]*$/';
preg_match($name_pattern, $name_subject, $name_matches);
if(!$name_matches[0])
$msg2_name = "Only alphabets and white space allowed";
}
if(empty($_POST['uemail']))
{
$msg_email = "You must enter your email";
$email_subject = $_POST['uemail'];
$email_pattern = '/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/';
preg_match($email_pattern, $email_subject, $email_matches);
if(!$email_matches[0]) $msg2_email = "Must be a valid email address";
}
if($_POST['uphone'])
{
$phone = $_POST['uphone'];
preg_match('/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z {2,3})$/i', $phone, $phone_match);
if(!$phone_match[0]) $msg_phone = "Must be a valid phone number";
if(strlen($phone)!='8') $msg2_phone = "Must be at least 8 characters long";
}
}
//save to db
$query = "INSERT INTO form (Name,DoB,Email,Phone,Date) VALUES ('$Name','$DoB','$Email','$Phone', CURRENT_TIMESTAMP)";
$success = $connection->query($query);
if (!$success) {
die("Couldn't enter data: ".$connection->error);
}
echo "Thank You For Contacting Us";
?>
答案 0 :(得分:1)
至于你的内联错误消息的显示,我建议做的只是使用一个页面来处理主窗体'logic',而另一个include()
来表示窗体本身的原始HTML标记。 “逻辑”页面是您将访问者定位为“表单”的位置。
在if(isset($_POST['submit']))
内,您将检查提交的数据。如果有效,则继续处理提交。如果它无效,则引发错误,然后再次显示该表单。默认情况下也会显示该表单。
这在以下半伪代码中显示:
$error = ''; // Nothing is wrong at first
if(isset($_POST['submit'])) {
// Raise error messages based on submission
if(empty($_POST['uname'])) {
$error = "You must enter name";
}
if(empty($_POST['email'])) {
$error = "You must enter email";
}
// Show the form if there are errors
if ($error) {
include('form.php');
}
// Process the submission if there aren't
else {
//$query = ...
mail($Email, $email_subject, $msg_email);
}
}
else {
include('form.php');
}
form.php
有条件地检查$error
:
<?php
if ($error !== '') {
// Output the error message in a fancy way
echo "<span class='error'>" . $error . "</span>";
}
?>
<form> ... </form>
至于发送这两封电子邮件,你几乎就在那里!您已经拥有$msg_email
,$email_subject
和$Email
。您只是想利用PHP的 mail()
功能:
mail($Email, $email_subject, $msg_email);
请注意,您可能还想在其中添加第四个参数(标题)。
我还注意到你目前在if(isset($_POST['submit']));{
中有一个分号,这会阻止阻止触发。请务必将其删除。
希望这有帮助! :)
答案 1 :(得分:0)
虽然为了问题清晰而格式化代码,但我认为我发现了问题。
您有2个格式问题会导致此类问题。
1)你有一个分号,阻止你的if
成为阻止条件
if(isset($_POST['submit']));
使用该分号,块将分开运行,只是作为范围分隔符。
2)你的正则表达式还没有完成
preg_match('/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z {2,3})$/i', $phone, $phone_match);
在您的上一个捕获论坛(.[a-z {2,3})
中,[a-z]
字符选择器的结束方括号不应为(.[a-z]{2,3})
我还要指出您正在设置$msg_name
和$msg2_name
,但我不会在任何地方看到它们使用,并且您不会因错误而停止执行,因此该过程会继续通过查询,即使你说你希望它停止。