序列化窗体并发布阿贾克斯功能

问题描述:

我想通过窗体字段值到位于文件中的php函数。问题是我无法理解如何将这个序列化的表单数据从这个ajax传递给函数中的函数。序列化窗体并发布阿贾克斯功能

$('#insert_news').submit(function(event) { 
    event.preventDefault(); 
    var form = $('#insert_news').serialize(); 
    $.ajax({ 
     type: 'POST', 
     url: 'includes/ajax.php', 
     data: { 
      action: 'insert_news', 
      $('#insert_news').serialize(); // how do I add this data here? 
     }, 
     success: function(datas) { 
      $('#message').html(datas).show() /*fadeIn(1000).fadeOut(1000)*/ ; 
     } 
    }); 
}); 

这个ajax将值传递给ajax.php文件的右边。并从ajax.php被称为函数位于functions.php。

ajax.php

if (isset($_POST['action']) && $_POST['action'] == 'insert_news') { 
    $cp->insert_into_table('newss', array(
             'NewsTitle' => $_POST['title'], 
             'NewsDescrption' => $_POST['description'], 
             'Date' => date('Y-m-d H:i:s'), 
             'status' => '1' 
            ) 
          ); 
} 

function.php

public function insert_into_table($table_name, array $data){ 
    foreach($data as $col=>$value) { 
     $cols[] = $col; 
     $values[] = '\''.$value.'\''; 
    } 
    $cols = implode(', ', $cols); 
    $values = implode(', ', $values); 
    $this->db->query("INSERT INTO $table_name ($cols) VALUES ($values)"); 
    echo "INSERT INTO $table_name ($cols) VALUES ($values)"; 
} 

的问题是serialize()产生一个URL编码键值配对的字符串,所以你不能混用,以你的数据对象。

您可以使用serializeArray()获得对象的数组,代表表单元素,然后遍历它们,并将它们添加到数据对象:

var data = { action: 'insert_news' }; 

$.each($('#insert_news').serializeArray(), function(){ 
    data[this.name] = this.value; 
}); 

$.ajax({ 
    type: 'POST', 
    url: 'includes/ajax.php', 
    data: data, 
    success: function(datas) { 
     $('#message').html(datas).show() /*fadeIn(1000).fadeOut(1000)*/ ; 
    } 
}); 

旁注:你的PHP代码是脆弱的到SQL注入。考虑使用Prepared Statement而不是将用户输入连接到SQL中。

+0

这是行得通的。 – user3467855 2014-10-03 09:58:31

您可以通过AJAX传递序列化数据的功能,你正在做的方式,但你的代码需要稍作修改。

$('#insert_news').submit(function(event) { 
    event.preventDefault(); 
    var form = $('#insert_news').serialize(); 
    $.ajax({ 
     type: 'POST', 
     url: 'includes/ajax.php', 
     data: { 
      action: 'insert_news', 
  serializedData: form // use variable to assign data here 
 }, 
     success: function(datas) { 
      $('#message').html(datas).show() /*fadeIn(1000).fadeOut(1000)*/ ; 
     } 
    }); 
}); 
+0

试图与变量加入serializeddata,但我得到在PHP'注意事项:未定义指数:title',像不知何故没有经过他们的名字。 – user3467855 2014-10-03 09:55:20

+0

您必须通过打印精确数组格式的post变量进行调试。你只是因为你的数组键会有所不同而遇到这个问题。 – 2014-10-03 10:00:57

+0

了解。谢谢,这也是一个非常简单的解决方案。 – user3467855 2014-10-03 10:04:50

$('#insert_news').submit(function(event) { 
    var name = $("#t1").val(); 
    var pass = $("#t2").val(); //add more var as u need 
    var key = 0; 

    var formName = new FormData(); 

    formName.append(key++,name) 
    formName.append(key++,pass) //append the the var to formdata 


     $.ajax({ 
      url   : 'includes/ajax.php', 
      dataType : 'text', 
      cache  : false, 
      contentType : false, 
      processData : false, 
      data  : formName,          
      type  : 'post', 

      success  : function(data){ 
         $('#message').html(data).show() /*fadeIn(1000).fadeOut(1000)*/ ; 
       } 

     }); 
}); 

这工作得很好,我:-)

我想你可以使用备用这样

第一:添加隐藏的输入动作的形式

<input type="hidden" name="action" value="insert_news"/> 

然后你阿贾克斯这样的帖子

$('#insert_news').submit(function(event) { 
    event.preventDefault(); 
    $.ajax({ 
     type: 'POST', 
     url: 'includes/ajax.php', 
     data: $(this).serialize(), // $(this) is from <form id="insert_news"> 
     success: function(datas) { 
      $('#message').html(datas).show() /*fadeIn(1000).fadeOut(1000)*/ ; 
     } 
    }); 
}); 

然后使用的print_r您ajax.php

print_r($_POST);