【问题标题】:form action not working after ajax successfulajax成功后表单动作不起作用
【发布时间】:2017-03-08 17:00:50
【问题描述】:

我有一个带有文件上传的表单。我想执行两项任务:一项是将数据提交到数据库并通过 ajax 上传文件,然后在 ajax 成功后另一个将要形成 action.ajax 正常工作但在 ajax 成功后表单动作不起作用 请帮忙

ma​​in.php

<!doctype html>
<html>
    <head>
        <!-- Latest compiled and minified CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

        <!-- Optional theme -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

        <!-- Latest compiled and minified JavaScript -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

        <script type="text/javascript">
            function mycall() {

                //disable the default form submission
                event.preventDefault();

                //grab all form data  
                var formData = new FormData(document.getElementById('data'));

                $.ajax({
                    url: 'addToMySQL.php',
                    type: 'POST',
                    data: formData,
                    async: false,
                    cache: false,
                    contentType: false,
                    processData: false,
                    success: function (returndata) {
                       alert(returndata);
                    }
                });

                return false;
            }
        </script> 
    </head>
    <body>
        <form method='post' enctype="multipart/form-data" id="data" action="try.php" >
            <div class="form-input">
                <label for="exampleSelect1" class="col-md-3 control-label">Type of Paper</label>
                <div class="col-md-9">
                    <select class="form-control"  id="Otop" name="Otop" required>
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                    </select>
                </div>
            </div>

            <div class="col-md-12">
                <div class="form-input">
                    <label for="exampleSelect1" class="col-md-3 control-label">Paper upload</label>
                    <div class="col-md-9">
                        <input type="file" id="file" name="profileImg" >
                    </div>
                </div>
            </div>
            <div class="form-input">
                <div class="col-sm-12">
                    <input type="submit" class="btn btn-primary btn-lg btn-block" onclick="mycall()" name="OrderSubmit" value="Order">
                </div>
            </div>
        </form>
    </body>
</html>

addToMySQL.php

<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include("dbconfig.php");
include('class/userClass.php');

$userClass = new userClass();

$Otop           = $_POST['Otop'];
$Odiscipline    = $_FILES['profileImg']['name']; 

$target         = "uploads/";       
$fileTarget     = $target.$Odiscipline; 

$result         = move_uploaded_file($_FILES['profileImg']['tmp_name'], "uploads/".$_FILES['profileImg']['name']);

$id             = $userClass->userOrderInfo($Otop,$Odiscipline, $fileTarget);

if ($id) {
    echo "done";
} else {
    echo "Notdone";
}

userClass.php 中的 userOrderInfo 函数

/* User Payment */
     public function userOrderInfo($Otop, $Odiscipline, $fileTarget)
     {
          try {
              $db = getDB();

              $stmt = $db->prepare("INSERT INTO orderinfo(Otop, Odiscipline, fileTarget) VALUES (:Otop, :Odiscipline, :fileTarget)");  
              $stmt->bindParam("Odiscipline", $Odiscipline) ;
              $stmt->bindParam("Otop", $Otop) ;
              $stmt->bindParam("fileTarget", $fileTarget) ;
              $stmt->execute();
              $db = null;

              return true;

          } catch(PDOException $e) {
              echo '{"error":{"text":'. $e->getMessage() .'}}'; 
          }
     }

【问题讨论】:

  • 不起作用是什么意思?告诉我们具体细节
  • @CamiloGo ya 在 ajax 成功后它不会去 try.php 这是表单操作。
  • 我没有看到任何 id = data 的元素 ..
  • @scaisEdge var formData = new FormData(document.getElementById('data'));并且 id="data" 是提及表单标签
  • 如果不执行ajax调用,你认为如何执行相关的成功函数?

标签: php ajax


【解决方案1】:

好吧,让我明白这一点,你的代码正在做的是:

  1. 表格已填写,然后单击“提交”,这会阻止表格 提交的默认操作。相反,这采取了形式 数据并通过ajax提交给addToMySQL.php
  2. addToMySQL.php 然后处理文件的上传并在userClass.php 上调用userOrderInfo()
  3. userOrderInfo 将返回 (string)(boolean) true 两者中的一个,对于 if() 语句,PHP 将把这两者都视为 true
  4. addToMySQL.php(string) "done" 的响应返回到main.php
  5. ajax 调用main.php 接收来自addToMySQL.php 的响应并触发带有"done" 内容的javascript 警报。

由于这种编写方式,表单永远不会使用它的 action 属性,而是会不断尝试将表单的内容 ajax 到 addToMySQL.php,因为您使用的是 event.preventDefault();

解决方案

一个快速的解决方案是向 ajax 成功方法添加一个 javascript 重定向,或者添加隐藏的 &lt;form&gt; 以及您希望发送给用户执行的操作,然后在文件上传后使用 javascript 填充并发送它.

无论您决定采用哪种方式,我都建议您修复 addToMySQL.php,这样它就不会经常发回 "done"

【讨论】:

  • 没有问题@ManojMali。如果这有帮助,请确保投票并接受答案。这将有助于提高我的声誉;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多