从AJAX到PHP(以及返回)获取数据的问题

时间:2014-01-13 01:25:53

标签: javascript php jquery ajax

这个想法是这个脚本将我的html表单中输入的文本的值POST到emailform.php,后者获取该数据并将其添加到.txt文件中。我认为我遇到的麻烦是将PHP中$email的值设置为html文本输入的值。因此,当前脚本被触发时,我会收到两个警报(首先是“错误”,然后是“完成”,来自.fail和.complete函数),然后页面重新加载。这就是为什么我认为问题在于从PHP返回的信息,但也许我错了。

<form method="post">
    <input type="text" name="email" value="" class="emailSubmitSidebar" placeholder=" Your Email">
    <input type="submit" name="submit" value="Add" class="submitButton" id="subscribeButton">
</form>
<script type='text/javascript'>
    $(document).ready(function() {
        var subscribeButton = $('#subscribeButton');
        subscribeButton.click(function() {
            $.ajax({
                url: 'emailform.php',
                type: 'POST',
                dataType: 'text',
                data: {email: $("input[name=email]").val()},
            })
            .done(function(data) {
                alert("Added!");
            })
            .fail(function() {
                alert("error");
            })
            .always(function() {
                alert("complete");
            })
        })
    })
</script>

以下是PHP,我添加了前两行来检查是否有任何错误,其中没有错误。奇怪的是,当我单独运行PHP时,echo行打印页面上的数字3,没有任何明显的原因。我对变量$email进行了注释,因为我认为首先检查isset是否更好/必要。

<?php
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);
    $fileHandle = fopen('emailList.txt', 'a') OR die ("Can't open file\n");
    $email= isset($_POST['email']) ? $_POST['email'] : "";
    // $email=$_POST['email'];
    $result = fwrite ($fileHandle, "$email; \n");
    fclose($fileHandle);
    echo (!$result) ? "error" : $result;
    die;
?>

2 个答案:

答案 0 :(得分:0)

我认为您的数据存在问题,请尝试将其序列化为json数据数组:

var data = $(form).serialize();

$.ajax({
  url: 'emailform.php',
  type: 'POST',
  dataType: 'text',
  data: data,
})

这些值将作为普通的帖子请求发送,因此电子邮件地址将位于$_POST['email'];

从此处更新

jquery .done()和.fail()函数需要http状态代码才能工作,所以你的php文件应该返回这些代码。当请求成功并且成功时,200范围内的任何内容都可以。出错时,应返回400或500范围内的某些内容。这里有完整列表:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

因此,当返回2xx时触发ajax .success函数(用.success替换.done),并在返回状态代码4xx或5xx时调用.error。请参阅下面的php如何实现这一点。

你得到的数字3是fwrite函数的$ return值,根据:http://nl3.php.net/fwrite

  

fwrite()返回写入的字节数,或者出错时返回FALSE。

让你的php像这样:

<?php
//ini_set('display_errors', 'On');
//error_reporting(E_ALL);

if($fileHandle = fopen('emailList.txt', 'a')) {

  if(isset($_POST['email']) && !empty($_POST['email'])) {
    $email = $_POST['email'];

    $result = fwrite ($fileHandle, "$email; \n");
    fclose($fileHandle);

    if(isset($result) && !empty($result)) { // Something was written
      http_response_code(200);
      echo "File written";
    } else { // Writing failed
      http_response_code(500);
      echo "Writing of file failed";
    }
  } else { // Empty email
    http_response_code(500);
    echo "Email was empty";
  }
} else { // File could not be opened
  http_response_code(500);
  echo "File could not be opened for writing";
}
?>

答案 1 :(得分:0)

(简单)

将HTML更改为:

  <input type="text" name="email" value="" class="emailSubmitSidebar" placeholder=" Your Email">

将JS更改为:

     $.ajax({
         url: 'emailform.php',
         type: 'POST',
         dataType: 'text',
         data: {email: $("input[name=email]").val()}
     })
    .done(function(data) {
         // there checking 
         alert("success!")
     })

将PHP更改为:

  $fileHandle = fopen('emailList.txt', 'a') OR die ("Can't open file\n");
  $email=$_POST["email"];
  $result = fwrite ($fileHandle, "$email; <br/>");
  fclose($fileHandle);
  echo (!$result)? "error" : $result;
  die;