【问题标题】:How to post a form to PHP using Ajax .serialize() data?如何使用 Ajax .serialize() 数据将表单发布到 PHP?
【发布时间】:2013-10-22 06:47:57
【问题描述】:

我正在使用 WordPress,但无法确定如何处理来自 Ajax 的序列化数据发送过来后。我在这个网站上读到parse_str 是我需要的,但我不确定如何使用它。

这是表单提交的 jQuery

jQuery( document ).ready( function( $ ) { 
    $( '#log_data' ).submit( function( event ) { 
        event.preventDefault(); 
        console.log( $( this ).serialize() );

        var data = $(this).serialize();
        action = 'my_submit_log_action';
        $.post( 
            ajaxurl, 
            data,
            function ( response ) { 
                if ( ! response.success ) { 
                    alert( 'Failure!' ); 
                } 
                alert( 'Success!' );                          
            } 
        ); 
    }); 
});

因为这是在 WordPress 中,所以我必须传递一个操作,以便 WordPress 知道将这些数据传递给哪个函数。我不确定我是否正确通过了该操作(见上文)。

第二部分是PHP,这个是我看不懂的。如何获取序列化数据并将其发布到数据库?

add_action('wp_ajax_my_submit_log_action', 'my_submit_log_action');
add_action('wp_ajax_nopriv_my_submit_log_action', 'my_submit_log_action');
function my_submit_log_action() {
    global $wpdb;

    $user_id = $_POST['user_id'];
    $length = $_POST['length'];
    $ground = $_POST['ground'];
    $date = $_POST['date'];
    $notes = $_POST['notes'];

    $wpdb->insert('wp_jo_plugin_options', array (
        'user_id' => $user_id,
        'length'  => $length,
        'ground'  => $ground,
        'date'    => $date,
        'notes'    => $notes,
    ) );

    die();
}

【问题讨论】:

  • 您正在向未定义的 ajaxurl 发送 $.post(ajax 帖子)(我想它应该与 action 连接,但它不是,它必须是 url),并且您没有使用 'action ' 无论如何都是变量。所以问题出在你的 jQuery 中,也许可以了解更多关于 $.post api.jquery.com/jQuery.post 的信息
  • ajaxurl 被定义为我的 wordpress ajax - 这就是在 wordpress 中调用 ajax 的方式。

标签: javascript php jquery ajax wordpress


【解决方案1】:

表单数据提交后序列化

<input type="hidden" value="<?php echo base64_encode(serialize($_POST)); ?>" name="posted" />

然后在 ajax 中通过 POST 发送此数据。或者你可以使用这个--------

$( "form" ).on( "submit", function( event ) {
  event.preventDefault();
  console.log( $( this ).serialize() ); //serialize form on client side
  var pdata = {
     action: "ajaxFunction",
     postdata: $(this).serialize()
  }
  $.post( "<?php echo admin_url('admin-ajax.php'); ?>", pdata, function( data ) {
       $( ".result" ).html( data );
  });
});

【讨论】:

【解决方案2】:

您的代码存在许多问题:安全性、脚本排队和本地化、前端连接、数据编码、响应处理。尝试使其适应以下示例:[ 1 ][ 2 ]

但是,为了让您的示例代码正常工作(仅在后端,除非您对 ajaxurl 进行硬编码):

var data = {
    values: $(this).serializeArray(), // <--- Important
    action: 'my_submit_log_action'
}

【讨论】:

    【解决方案3】:

    试试serialize()unserialize()

    • WordPress 有一些我们使用的辅助函数来代替 serialize()unserialize()maybe_serialize()maybe_unserialize()

    例如

    // 'serialize' the data
    update_option( '_option_data', serialize( array( 'foo', bar' ) ) );
    
    // 'unserialize' the data
    unserialize( get_option( '_option_data' ) );
    

    https://codex.wordpress.org/Function_Reference/maybe_unserialize

    将数据转换为序列化并存储如下:

    add_action('wp_ajax_my_submit_log_action', 'my_submit_log_action');
    add_action('wp_ajax_nopriv_my_submit_log_action', 'my_submit_log_action');
    function my_submit_log_action() {
        global $wpdb;
    
        // DEFINE AN ARRAY
        $optionArray = [];
    
        $user_id = $_POST['user_id'];
        $length = $_POST['length'];
        $ground = $_POST['ground'];
        $date = $_POST['date'];
    
        // PASS TO ARRAY
        if(isset($user_id) && !empty($user_id){
             $optionArray['user_id'] = $user_id; 
        }
        if(isset($length ) && !empty($length ){
             $optionArray['length'] = $length;
        }
        if(isset($ground ) && !empty($ground ){
             $optionArray['ground'] = $ground;
        }
        if(isset($date ) && !empty($date ){
             $optionArray['date'] = $date;
        }
    
        // OUTPUT AS SERIALIZED - BOTH ARE SAME
        // echo 'maybe_serialize: '. maybe_serialize( $optionArray );
        // echo 'serialize: '. serialize( $optionArray );
    
        // INSERT IN DATABASE - HERE USED maybe_serialize()
        $wpdb->insert('wp_jo_plugin_options', maybe_serialize( $optionArray ) );
    
        die();
    }
    

    【讨论】:

      【解决方案4】:

      .serialize() 方法在标准 URL-encoded notation 中创建一个文本字符串。

      它可以作用于已选择单个表单控件的 jQuery 对象,例如 &lt;input&gt;&lt;textarea&gt;&lt;select&gt;

      $user_id = $_POST['user_id'];
      //Make sure here user_id will be the name attribute of your text field
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-15
        相关资源
        最近更新 更多