关于mysql:html表单提交调用php但不重定向

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('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/')电话regexp(^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$)

这是我的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输出任何其他数据之前,必须设置头。

header('refresh: 3; URL=index.html');

不要使用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
define('DBHOST','localhost');
define('DBUSER','myuser');
define('DBPASS','secretpass');
define('DBNAME','mydb');

编辑/附加:

如果您想进行一些验证,那么在客户机上进行一些验证会很有帮助,这样当您已经知道某些输入不符合要求时,您的用户就不必提交和被拒绝。

但是您还需要在服务器端进行验证(坏用户可以通过在浏览器中编辑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将数据发送到服务器:

    • 您应该在提交按钮上设置一个侦听器,
    • 按下后发送数据,
    • 您还应该禁用默认操作(即跳到目标页面)。
  • 首先,你应该试试第一个,这很容易。