html form submit calls a php but does not redirect
好的,朋友们,我对这个基本的东西很困惑。我读过很多贴子,上面写着"我需要添加自我贴子"之类的,但我不理解。
我有两个文件index.html和submit.php。index.html有一个带有submit按钮的表单,单击该按钮可以调用submit.php文件,并显示一条消息"添加了1条记录"。我想将submit.php文件重定向回index.html文件。我不知道我做错了什么。是因为一个是HTML文件,另一个是PHP?请帮忙。这是我的密码
索引文件
1 | <form method="post" action="submit.php"> |
提交文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php $con = mysql_connect("localhost","myuser","mypassword"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("mydb", $con); $sql="INSERT INTO members (sName, sCity, sMobile, sEmail, sSub, sSlogan) VALUES ('$_POST[name]', '$_POST[city]', '$_POST[mobile]', '$_POST[email]', '$_POST[sub]', '$_POST[slogan]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } echo"1 record added"; mysql_close($con) ?> </body> </html> |
编辑
请找到index.html和submit.php文件的代码。在你的帮助下,他们都工作得很好。我仍然在努力把验证码放在哪里。我在HTML文件中使用HTML5输入类型,我不知道submit.php文件中在哪里进行验证。是的,我有多个表单,并按照您的建议制作了validations.php文件。我不明白的是,如果validations.php文件中的name字段有函数validate_name($input),那么为什么要在submit.php中再次验证name?(如果)!空($_post['name'])。我也不明白错误信息会在哪里显示?如果我尝试添加这些函数,它会在单击提交时给我一个空白页,数据不会转到数据库。
您能在submit.php文件中建议一个位置,在那里我应该通过编辑submit.php文件来添加这些验证吗?电子邮件regexp(
这是我的index.html文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <!DOCTYPE HTML> <html> <head> My Title </head> <body> <form method="post" action="submit.php"> <input type="text" name="name" placeholder="Name" /> <input type="text" name="city" placeholder="City" /> <input type="text" name="mobile" placeholder="Mobile" /> <input type="email" name="email" placeholder="Email" /> <input type="text" name="sub" placeholder="Want 3 m Free Subscription (Yes/No)?"></textarea> <input type="text" name="slogan" placeholder="Suggest a slogan for 6 m subscription"></textarea> <ul class="action"> <li> <input type="submit" value="Submit" /> </li> </ul> </form> </body> </html> |
这是我从您那里得到的submit.php文件帮助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?php include 'config.php'; // store your configuration in a seperate file so // you only need to update it once when your environment changes $errors = false; $output = ''; $nl = ''.PHP_EOL; $redirect_url = 'index.html'; if (!$con = new mysqli(DBHOST,DBUSER,DBPASS,DBNAME)){ $errors = true; $output .="ERROR Can't connect to DB".$nl; }; if (!$errors){ //should validate/clean $_POST before using in query $name = $con->escape_string($_POST['name']); $city = $con->escape_string($_POST['city']); $email = $con->escape_string($_POST['email']); $mobile = $con->escape_string($_POST['mobile']); $sub = $con->escape_string($_POST['sub']); $slogan = $con->escape_string($_POST['slogan']); $sql="INSERT INTO members (sName, sCity, sMobile, sEmail, sSub, sSlogan) VALUES ('$name', '$city', '$mobile', '$email', '$sub','$slogan')"; if (!$con->query($sql)){ //forgot a parenthesis here earlier $output .= 'ERROR: DB said: ('.$con->errno.') '.$con->error.$nl; $output .= 'Query was:'.$sql.$nl; $errors = true; }else{ $output .="1 record added".$nl; } } if (!$errors){ //if there are no errors redirect to index.html; header('refresh: 2; URL='.$redirect_url); $output .= '...Redirecting...'.$nl; }else{ //show the errors and allow display a link to go back/try again $output .= 'Try again'.$nl; } echo $output; ?> |
PS:我观察到的一件事是,HTML5(input type="email")在您进入下一个字段后立即显示无效的电子邮件警报,该字段正下方。如何对所有字段进行此操作?(类似于对丢失焦点的字段进行验证检查)
谢谢
您可以对提交脚本进行失败检查,并重定向到index.html以添加更多成功信息。
记住,在用echo输出任何其他数据之前,必须设置头。
不要使用mysql,使用mysqli或pdo。
了解SQL注入。
所以您的sumbit.php可能看起来像:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?php include 'config.php'; // store your configuration in a seperate file so // you only need to update it once when your environment changes $errors = false; $output = ''; $nl = ''.PHP_EOL; $redirect_url = 'index.html'; $con = new mysqli(DBHOST,DBUSER,DBPASS,DBNAME); if ($con->connect_errno){ $errors = true; $output .="ERROR Can't connect to DB".$nl; }; if (!$errors){ //should validate/clean $_POST before using in query $name = $con->escape_string($_POST['name']); $city = $con->escape_string($_POST['city']); $email = $con->escape_string($_POST['email']); $mobile = $con->escape_string($_POST['mobile']); $sub = $con->escape_string($_POST['sub']); $slogan = $con->escape_string($_POST['slogan']); $sql="INSERT INTO members (sName, sCity, sMobile, sEmail, sSub, sSlogan) VALUES ('$name', '$city', '$mobile', '$email', '$sub','$slogan')"; if (!$con->query($sql)){ //forgot a parenthesis here earlier $output .= 'ERROR: DB said: ('.$con->errno.') '.$con->error.$nl; $output .= 'Query was:'.$sql.$nl; $errors = true; }else{ $output .="1 record added".$nl; } } if (!$errors){ //if there are no errors redirect to index.html; header('refresh: 2; URL='.$redirect_url); $output .= '...Redirecting...'.$nl; }else{ //show the errors and allow display a link to go back/try again $output .= 'Try again'.$nl; } echo $output; |
php将包含
1 2 3 4 |
编辑/附加:
如果您想进行一些验证,那么在客户机上进行一些验证会很有帮助,这样当您已经知道某些输入不符合要求时,您的用户就不必提交和被拒绝。
但是您还需要在服务器端进行验证(坏用户可以通过在浏览器中编辑HTML来绕过任何客户端验证)
为了帮助您的用户,您可以使用一些可用的新HTML5输入类型,也可以使用一些附加的javascript:如
index.html可以保持为静态页面。它只显示输入表单,并可能加载一些JavaScript资源进行验证。
您的验证应该在submit.php中进行。如果您的应用程序中有更多的表单,您可以考虑将服务器端验证函数放在单独的validations.php中,您可以将其包含在submit.php中。
它可以包含如下函数:
1 2 3 4 5 6 7 8 9 10 11 12 | function validate_name($input){ // fairly naive rule: // upper and lower case latin characters and space // at least three character long // you may want to look at allowing other characters such as é ? etc. $input = trim($input); //get rid of spaces at either end if (preg_match('/^[a-zA-Z ]{3,}$/',$input) == 1){ return $input; }else{ return false; } } |
在submit.php中,您可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ... include_once 'validations.php'; ... if (!empty($_POST['name'])){ if (!$name = $con->escape_string(validate_name($_POST['name'])){ $errors = true; $output .= 'ERROR: Invalid Name: '.$_POST['name'].$nl; } }else{ $errors = true; $output .= 'ERROR: No name specified'.$nl; } if (!empty($_POST['city']){ ... ... |
要获取已输入的数据,以便在出现故障时进行填充,可以通过get参数将数据发送回原始数据。
在submit.php中,在结尾处可以添加类似…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | if (!$errors){ //if there are no errors redirect to index.html; header('refresh: 2; URL='.$redirect_url); $output .= '...Redirecting...'.$nl; }else{ //show the errors and allow display a link to go back/try again //add parameters to show the data already entered $redirect_url .= '?'. http_build_query( array('name'=>$name, 'city'=>$city, 'mobile'=>$mobile, ... )); $output .= 'Try again'.$nl; } echo $output; |
在index.php中,如果输入字段存在的话,就必须读取它们并设置它们的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php //we'll use urldecode() so that any special characters will be interpreted correctly if (!empty($_GET['name'])){ $name = urldecode($_GET['name']); }else{ $name = ''; } if (!empty($_GET['city'])){ $city = urldecode($_GET['city']); }else{ $city = ''; } .... ?> <input type="text" name="name" value="<?php echo $name; ?>"/> <input type="text" name="city" value="<?php echo $city; ?>"/> |
索引文件
1 2 3 | <form method="post" action="submit.php"> //Html Codes </form> |
提交文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php $con = mysql_connect("localhost","myuser","mypassword"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("mydb", $con); $sql="INSERT INTO members (sName, sCity, sMobile, sEmail, sSub, sSlogan) VALUES ('$_POST[name]', '$_POST[city]', '$_POST[mobile]', '$_POST[email]', '$_POST[sub]', '$_POST[slogan]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } else { header("location:index.html?Message=Success") } ?> |
提交表单时,浏览器将跳转表单标记的target属性中指定的页面,在您的情况下,它是submit.php。
在处理了日志数据之后,提交页面应该呈现一些内容,这些内容将重定向回index.html,替代:
- 标题http://php.net/manual/en/function.header.php
- html"meta"标签https://en.wikipedia.org/wiki/meta_refresh
如果不想重新加载页面,则应使用Ajax将数据发送到服务器:
- 您应该在提交按钮上设置一个侦听器,
- 按下后发送数据,
- 您还应该禁用默认操作(即跳到目标页面)。
首先,你应该试试第一个,这很容易。