提交ajax表单并停留在同一页面上不起作用

Posted

技术标签:

【中文标题】提交ajax表单并停留在同一页面上不起作用【英文标题】:Submit ajax form and stay on same page not working 【发布时间】:2015-08-14 02:42:02 【问题描述】:

我想将来自用户的 cmets 存储在我的数据库中。当用户提交时,我不想将他们重定向到新页面。 我有以下代码,但它不起作用。

我的 html 代码:

<form id="formA" action="test.php" method="post" enctype="multipart/form-data">
<input id="commentData" name="commentData" type="text" >'
<input type="submit" value="toDb" id="toDB" name="toDB" /></form>

javascript

var frm = $('#formA');

$(document).submit(function(e) 
e.preventDefault();

$.ajax(

    url: frm.attr('action'),

    type: frm.attr('method'),

    data: frm.serialize(),

    success: function(html) 

        alert('ok');

    

);
);

这是我的 PHP 文件:

//Connect to database server
mysql_connect("localhost", "user", "") or die (mysql_error ());
mysql_select_db("test") or die(mysql_error());
$strSQL = "SELECT * FROM comments order by RAND() LIMIT 5";
$rs = mysql_query($strSQL);

if (!$rs) 
     echo 'Could not run query ' . mysql_error();
     exit;


$dt1=date("Y-m-d");

if(isset($_POST['toDB']))
  $dataA = $_POST['commentData'];
  $sql = "INSERT INTO comments(id, comment, datum)VALUES(DEFAULT,'$dataA', '$dt1')";
  $result=mysql_query($sql);

mysql_close();

当我单击提交按钮时,它将停留在同一页面上并显示警报,但输入字段的数据未插入我的数据库中。当我删除 e.preventDefault() 数据进入数据库但页面重定向到 test.php

尝试了不同的东西,但无法弄清楚。 有人可以帮我吗? 提前致谢!

【问题讨论】:

var frm = $('#formA');放在$(document).submit(function(e) 旁边,请检查一次。 $dataA 应进行消毒以防止注射。 php.net/manual/en/function.mysql-real-escape-string.php 还要注意mysql_,应该使用mysqli 或pdo,然后你可以使用prepared statements。如果你给datum 一个默认时间戳,你就不必每次都插入日期。还有 DEFAULT 我以前没见过,但如果你有自动递增的字段,你不需要发送它。 感谢您的快速响应,但不幸的是它仍然无法正常工作。这些变化没有任何区别。 你加载了jquery.min.js 吗? 检查您的 xhr 请求包含哪些发布数据。我用.serialize() 做了一个快速测试,它没有包含提交按钮的键或值,这是你的PHP 所依赖的。 【参考方案1】:

由于表单上的action属性和正常的提交按钮,表单提交并不会停留在同一页面上。

这会导致您的 .submit() 方法包括 .preventDefault() 在加载 html 后也可能不会被解释。

你可以这样做:

<html>
  ...
  <body>
  ...
    <form id="formA" action="test.php" method="post" enctype="multipart/form-data">
      <input id="commentData" name="commentData" type="text" />
      <input type="submit" value="toDb" id="toDB" name="toDB" />
    </form>
  ...
  </body>
  <script>
   ...script here...
  </script>
 </html>

而 javascript 可能是这样的:

( function( $ )
  
    var submit = $( 'input[id=toDB]' );
    $( submit ).on
    (
      'click',
      function( event )
      
        event.preventDefault();
        var form = $( this ).parent();

        // Get form fields
        var data = $( form ).serializeArray(), obj = , j = 0;
        for( var i = 0; i < data.length; i++ )
        
          if( data[i].name in obj )                                                                  
          
            var key = data[i].name + '_' + j;
            obj[key] = data[i].value;
            j++;
          
          else
          
            obj[data[i].name] = data[i].value;
          
        ;

        // Make AJAX request
        $.ajax
        (
             
            url: $( form ).attr( 'action' ),    
            type: 'POST',
            data: 'toDB=' + JSON.stringify( obj ),    
            success: function( data, textStatus, xhr )
            
              // Do something with data?
              ...    
              alert( 'ok' );    
            
          
        );
      
    );
  ( jQuery )
);

请自行查看jsfiddle。

您可以判断它正在运行,因为您收到一个控制台错误,即找不到请求目标 - 404 - 尽管页面没有刷新,但您仍然在原处...有一个正确的页面可以提交给它完全。

编辑

我在ajax() 调用中修改了“数据”的设置,以便将表单字段设置为 POST 变量 [toDB] 的 json 字符串。

所以在你的 PHP 中你会这样做:

$datas = json_decode( $_POST['toDB'], true );

现在您的$datas 变量是一个关联数组,其中包含您所有的表单字段名称和值。我不是 100% 同意下一个声明,但您可能需要在使用 json_decode() 之前对 POSTED 数据使用 PHP 的 stripslashes() 方法

即:

//Connect to database server
mysql_connect( "localhost", "user", "" ) or die ( mysql_error() );
mysql_select_db( "test" ) or die( mysql_error() );
$strSQL = "SELECT * FROM comments order by RAND() LIMIT 5";
$rs = mysql_query( $strSQL );

if( !$rs ) 

  echo 'Could not run query ' . mysql_error();
  exit;


$dt1=date("Y-m-d");

if( isset( $_POST['toDB'] ) )

  $datas = json_decode( stripslashes( $_POST['toDB'] ), true );
  $dataA = $datas['commentData'];
  $sql = "INSERT INTO comments( id, comment, datum )VALUES( DEFAULT, '" . $dataA . "', '" . $dt1 . "' );";
  $result=mysql_query( $sql );

mysql_close();

希望有帮助

【讨论】:

使用此代码,我的控制台中出现错误:此对象不支持 Stringnify 属性或方法 它应该是JSON.stringify(),我打错了。它已修复,现在也带有 jsfiddle 链接。 谢谢,它确实保留在同一页面上,但我的数据库中没有插入任何内容。我不明白。这几天我一直在努力解决这个问题! 是的,使用此解决方案 - 我进行了编辑,以便您可以从 PHP 访问发布的数据...请参阅上面的编辑,这应该可以为您解决问题。 耶啊啊啊啊!有用!太感谢了!我自己永远无法解决这个问题。【参考方案2】:

通过表单提交事件来实现

var frm = $('#formA');
frm.submit(function(e) 
  //....
  //....
  e.preventDefault();
);

是的,使用mysql_real_escape_string($dataA) 清理数据库插入以防止 SQL 注入。

编辑 抱歉,答案不完整(您仍然需要在表单上提交,而不是在文件上)

EDIT2 :) $(this) 的错误用法 :)

$('#formA').submit(function(e)   
  var formAction = $(this).attr('action');
  var formData = $(this).serialize();
  $.ajax(   
    url: formAction,    
    type: 'POST',     // try uppercase, 'post' !== 'POST', dont know if this must be uppercase or can be lowercase
    data: formData, // or try  $(this).serializeArray()    
    success: function(html)     
        alert('ok');    
    )
  );
  e.preventDefault();
);

EDIT2.5enctype="multipart/form-data" 可能有问题 你需要做一些修改: var formData = new FormData(this); 并为 AJAX 调用添加一些选项

mimeType:"multipart/form-data",
contentType: false,
cache: false,
processData:false

通过示例找到此页面 http://hayageek.com/jquery-ajax-form-submit/

尝试使用大写/小写POST,如果不需要,请尝试删除multipart/form-data(文件上传等...)

EDIT3 使用多部分形式,也许你应该在某些情况下在 PHP 中使用它来访问你的帖子数据$GLOBALS['HTTP_RAW_POST_DATA']

【讨论】:

感谢您的帮助,但没有区别。仍然遇到同样的问题。 用控制台看一些错误,说不定会有答案 试试我的edit2块并检查那个url,希望能给你答案 解决此问题的最佳解决方案是执行 print_r($_POST);exit;在 test.php 文件的顶部。然后在你的 jquery 类型 console.log(html) 的成功函数中,看看你得到的输出是应该发布的数据吗? 我迷失在所有的编辑中。你在哪里使用我的 PHP 中的 $GLOBALS['HTTP_RAW_POST_DATA'] 。在第二次编辑中,您建议进行一些修改,这是否意味着替换 var formData = $(this).serialize(); with var formData = new FormData(this);【参考方案3】:

在脚本末尾添加 return false 以防止重定向

【讨论】:

以上是关于提交ajax表单并停留在同一页面上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery 验证插件提交 Ajax 表单不起作用

表单提交按钮在智能手机上不起作用

在允许提交之前复选框在表单上不起作用

插件管理页面中的 Ajax 表单不起作用

选择 Datalist 选项后,iPhone Go/Search 键盘提交在搜索表单上不起作用

Laravel 中的注册和登录表单不起作用