使用 ajax 将数据从 Jquery 传递到 PHP 而无需刷新

Passing data to PHP from Jquery using ajax without refreshing

我已经问过类似的问题,但我无法获得足够的信息。我尝试将代码减少到我需要的代码。

我正在尝试向 php 代码传递一个标题变量,我希望 php 代码在完成时给我一条成功消息。我想在不刷新页面的情况下执行此操作。

当我 运行 这段代码中没有 ajax 位时,它会让我点击按钮,它会在不刷新的情况下执行检查。但是一旦我输入 ajax 代码,它就不会执行检查并且会刷新。它也不 运行 对 php 代码进行任何检查。

我使用的 ajax 代码错了吗?我怎样才能让它在不刷新的情况下将数据发送到 php 文件并向我发送成功消息?

编辑:我在发送到 php 文件的数据周围添加了括号。现在 "fill out the form" 检查有效。但是当填写表格时,成功检查不会从 php 文件返回。

EDIT2:我将 .val() 插入到启动语句中并从 if 语句中删除了 .val() 。我从按钮中删除了 onclick 属性。并将JS中的数据更新为"data: {title1:title},"。到目前为止,状态保持不变。

EDIT3:我添加了 "dataType: JSON," 以及一些 error/success 代码。谢谢罗恩的帮助。现在,当我提交时,我得到一个 500 的 xhr 状态和一个空白的响应文本。我一直在寻找解决方案,但到目前为止还没有。

EDIT4:我将 title1 更改为 title's,这样就不会再有混淆了。现在它工作正常!谢谢罗恩的帮助。

<?php
//getting values from JS
$title = $_POST['title'];

if(!$title == "")
{
  $res="Data received successfully:";
  echo json_encode($res);
}
else {
  $error="Not received,some problem occurred.";
  echo json_encode($error);
}
?>
<!DOCTYPE html>
<html>
  <head>
 <meta charset = "utf-8">
 <title>Insert</title>
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
 <script type="text/javascript">
  $(document).ready(function () {
   $('#form').submit(function (e) {
    e.preventDefault();
   
    //debug
    var x =  document.getElementById("msg");
    var title = $('#title').val();
    var year = $('#year').val();
    var director = $('#director').val();
    var genre = $('#genre').val();
    var runtime = $('#runtime').val();
       
       
       if( title=="" || year=="" || director=="" || genre=="" || runtime=="" ) {
        x.style.color = "red";
        x.innerHTML = "Please fill out all of the blanks.";
       } else {
        //is the value being sent correct?
        x.style.color = "lightGreen";
        x.innerHTML = "Title is: "+title+ 
          "<br>Year is: "+year+
          "<br>Director is: "+director+
          "<br>Genre is: "+genre+
          "<br>Runtime is: "+runtime;
        
        $.ajax({  
     type: "POST",
     url: "insert_DVD.php",
     data: {
      title: title,
      year: year,
      director: director,
      genre: genre,
      runtime: runtime,
      },
     dataType: "JSON",
     error: function(xhr, ajaxOptions, thrownError, data) {
      alert(xhr.status);
      alert(thrownError);
      alert(xhr.responseText);
      console.log(data);
     },
     success: function(data) {
                    console.log(data);
                }
        });
         return false;
        }
    });
  });
 </script>
    <link rel="stylesheet" href="webpage.css">
  </head>
  <body class="subStyle">
   
 <div class="topnav">
    <a href="#">Home</a>
    <a href="#">Database</a>
    <a class="active" href="#">Insert</a>
 </div>
 
 <form id="form" method="post">
  If there is more than one director, separate with comma.
  <table border=0>
  <tr>
  <th>Movie Title</th>
  <th>Year Made</th>
  <th>Director</th>
  <th>Genre</th>
  <th>Runtime(Minutes)</th>
  </tr>
  
  <tr>
  <td><input type=text name="title"    id="title"    maxlength=100 size=30></td>
  <td><input type=text name="year"     id="year"     maxlength=4   size=10></td>
  <td><input type=text name="director" id="director" maxlength=100 size=30></td>
  <td><input type=text name="genre"    id="genre"    maxlength=20  size=20></td>
  <td><input type=text name="runtime"  id="runtime"  maxlength=4   size=20></td>
  </tr>
  
  <tr><td>
  <button type="submit" id="update" value="send">Update Database</button></td></tr>
  </table>
 </form>
 
 <p id="msg">Click the update button.</p>
   </body>
</html>

可能应该是一个对象

data: {title1:title1}

我不在我的开发计算机旁,所以我无法真正测试 php 方面的事情,但你确实有两个 javascript 错误,其中一个可能导致了问题。

不是您的问题,而是控制台出错。

1) 从 onclick 中删除 passData() 函数。它不是必需的,因为您正在使用 .submit.

观察表单提交

可能是您遇到问题的原因

2) 当您定义 "title1" 时,您没有得到它的值,这将导致当前提交表单时出现 HTMLFormElement.toString 错误。取而代之的是通过以下方式继续并在定义标题 1 时获取值:

$('#title').val();

然后从 if 语句中删除 title1.val() 以检查其是否已填充,而只是将 title1 == ""

现在您正在通过 ajax 调用发送一个 HTML 元素,这将导致 jquery 失败。换句话说,您目前正在发送:

data: {title: (HTML ELEMENT)}

让我知道这是否解决了问题。如果没有,我会在到达可以 运行 PHP 的位置时将其拉起。

EDIT:此外,正如其中一条评论所指出的,您需要将 PHP 更改为成为 $_POST['title'] 以匹配您发送的内容。您可以通过回显一些错误来验证 php 方面发生的事情。我已经有很长时间没有做过 php 但我通常会做这样的事情:

error_reporting(E_ALL & ~E_DEPRECATED);
ini_set('display_errors', 1);

在我的脚本顶部进行调试以调试它们。这会将错误从 php 传递回 Ajax 响应(如果有的话)。不过那是在 PHP 5 天后。

EDIT2:我就是这样工作的

test.php

<?php
  //getting values from JS
  $title = $_POST['title'];

  if(!$title == "") {
    $res="Data received su ccessfully:";
    echo json_encode($res);
  } else {
    $error="Not received,some problem occurred.";
    echo json_encode($error);
  }
?>

index.html 只是 ajax 部分:

$(document).ready(function() {
$('#form').submit(function(e) {
    e.preventDefault();

    //debug
    var x = document.getElementById("msg");
    var title1 = $('#title').val();



    if (title1 == "") {
        x.style.color = "red";
        x.innerHTML = "Please fill out all of the blanks.";
    } else {
        $.ajax({
            type: "POST",
            url: "test.php",
            data: {
                title: title1
            },
            dataType: "JSON",
            error: function(xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
                alert(xhr.responseText);
            },
            success: function(data) {
                console.log(data);
            }
        });
        return false;

    }
});
});

很遗憾,我现在没有时间解释更改的内容,但我明天会解释! (希望 :)

此外,我没有将成功消息放在 html 中,我忘记了,而是 console.logging 您可以在浏览器控制台中看到的响应。抱歉,我希望我今晚有更多时间来回复。