简体   繁体   English

Ajax不发布数据

[英]Ajax doesn't post data

[SOLVED] [解决了]

That was THE most difficult bug ever - all due to copy/paste stuff up. 那是有史以来最困难的错误-全部归因于复制/粘贴内容。

This: 这个:

$('#errors'+bUID).append('<ul id="error_list"'+bUID+'></ul>');

should have been that: 应该是这样的:

$('#errors'+bUID).append('<ul id="error_list'+bUID+'"></ul>');

The damn '+bUID+' was pasted AFTER the " , not BEFORE! 该死的“ + bUID +”粘贴在“之后”,而不是之前!

Of course it couldn't append anything to it... 2 weeks...2 WEEKS wasted!!! 当然,它什么也不能添加... 2周... 2星期浪费了!!! ))) )))


Here's the js: 这是js:

$('form').submit(function(e){
    bUID = $(this).find('input[name=bUID]').data("buid");
    e.preventDefault();
    submitForm(bUID);
    alert(bUID);
});

function submitForm(bUID) {
    var name = $('#name'+bUID).val();
    var email = $('#email'+bUID).val();
    var message = $('#message'+bUID).val();
    var code = $('#code'+bUID).val();
    alert(bUID);

    // also tried this
    var post_data = {
    'name': $('#name'+bUID).val(),
    'email': $('#email'+bUID).val(),
    'message': $('#message'+bUID).val(),
    'code': $('#code'+bUID).val(),
    'buid': bUID,
    };
    alert(Object.keys(post_data).length);


    // ALSO tried this instead of ajax:
    //$.post($('#contact_form'+bUID).attr('action'), post_data, function(response){
    alert(response);
    $.ajax({
        dataType: "json",
        type: "post",
        data: "name=" + name + "&email=" + email + "&message=" + message + "&code=" + code + "&buid=" + bUID,
        //data: post_data,
        url:   $('#contact_form'+bUID).attr('action'),
        success: function(response) {
            if (typeof response !== 'undefined' && response.length > 0) {
                if (response[0] == "success") {
                    $('#success'+bUID).append('<p>Success</p>');
                }
                else {
                    $('#errors'+bUID).append('<p>' + js_errors + '</p>');
                    $('#errors'+bUID).append('<ul id="error_list"'+bUID+'></ul>');
                    $.each(response, function(i, v){
                        if (i > 0) {
                            $('#error_list'+bUID).append('<li>' + v + '</li>');
                        }
                    });
                }
            }
        }
    });
}

here's the action in view.php: 这是view.php中的操作:

<?php
$bUID = $controller->getBlockUID($b);
$form = Loader::helper('form');
$formAction = $view->action('submit', Core::make('token')->generate('contact_form'.$bUID));
?>

<form id="contact_form<?php echo $bUID; ?>" 
    class="contact-form" 
    enctype="multipart/form-data" 
    action="<?php echo $formAction?>" 
    method="post" 
    accept-charset="utf-8">

    <?php echo $bUID; ?><br />
    <input type="hidden" name="bUID" data-buid="<?php echo $bUID; ?>" data-popup="<?php echo $popup; ?>">

   ...etc.

and here's the controller.php: 这是controller.php:

public function action_submit($token = false, $bID = false) 
{
    $this->form_errors = array();
    array_push($this->form_errors, "error");
    array_push($this->form_errors, $_POST['name']);
    array_push($this->form_errors, $_POST['email']);
    array_push($this->form_errors, $_POST['message']);
    array_push($this->form_errors, $_POST['code']);
    array_push($this->form_errors, $_POST['buid']);
    echo Core::make('helper/json')->encode($this->form_errors, JSON_UNESCAPED_UNICODE);
    exit;
}

it gets all data and shows it in alert but then trows the following error in the console: 它获取所有数据并将其显示为警报,但随后在控制台中引发以下错误:

Uncaught TypeError: Cannot use 'in' operator to search for 'length' in ["error","gggg","gggg@gmail.commm","gggggggggggggggggggggggg","gggg","171"]
    at r (jquery.js:2)
    at Function.each (jquery.js:2)
    at Object.success (view.js:132)
    at j (jquery.js:2)
    at Object.fireWith [as resolveWith] (jquery.js:2)
    at x (jquery.js:5)
    at XMLHttpRequest.b (jquery.js:5)

Line 132 of the js file is this: $.each(response, function(i, v){ js文件的第132行是:$ .each(response,function(i,v){

I can't figure out what's wrong. 我不知道怎么了。 The alert works and returns entered data: "error,gggg,gggg@gmail.commm,gggggggggggggggggggggg,gggg,171‌", but php retruns null objects: "["error",null,null,null,null,null]" - $_POST is empty! 警报起作用并返回输入的数据:“ error,gggg,gggg @ gmail.commm,gggggggggggggggggggggg,gggg,171‌”,但是php重新运行null对象:“ [” error“,null,null,null,null,null]]- $ _POST为空!

What's wrong here? 怎么了 Why doesn't the form get posted? 为什么表单不被发布?

Thank you very much. 非常感谢你。

Have you tried adding return false; 您是否尝试添加return false; to prevent your form from submitting to its desired action? 以防止您的表单提交所需的操作?

$('form').submit(function(e){
    bUID = $(this).find('input[name=bUID]').data("buid");
    //e.preventDefault();
    //e.stopPropagation();
    submitForm(bUID);
    alert(bUID);
    return false;
});

Try this way, 试试这个

function submitForm(bUID) {
    var name = $('#name'+bUID).val();
    var email = $('#email'+bUID).val();
    var message = $('#message'+bUID).val();
    var code = $('#code'+bUID).val();

    $.post($('#contact_form'+bUID).attr('action'), {name:name, email:email, message:message, code:code, buid:bUID}, function(result){
        alert(result);
    });
}

Your post_data variable was correct. 您的post_data变量是正确的。 As it is now your data attribute in your ajax is wrong - it's in GET format (a string), not POST . 因为现在您的ajax中的data属性是错误的-它采用GET格式(字符串),而不是POST The correct way (json) is; 正确的方式(json)是;

$.ajax({
   dataType: "json",
   type: "post",
   data: {
       name: nameVar,
       email: emailVar,
       message: messageVar
   },
   url: ...,
   success: function(data) {
       ...
   }
});

I "renamed" your variables to try and avoid variables with the same names as keys (eg you want to post "name", setting a variable "name" might conflict). 我“重命名了”您的变量,以尝试避免使用与键相同名称的变量(例如,您要发布“名称”,设置变量“名称”可能会发生冲突)。

Just use 只需使用

    data: form.serializeArray() 

Like this: 像这样:

$.ajax({
url: 'url to post data',
dataType: "json",
method: "post",
data: form.serializeArray(),
 success: function(data) {
   // another staff here, you can write console.log(data) to see what server responded
 },
 fail: function(data) {
     console.log(data) // if any error happens it will show in browsers console
  }
});

Another tips: in server side you can use http_response_code(200) for success, http_response_code(400) for errors, http_response_code(403) if authorisation is required 另一个提示:在服务器端,您可以使用http_response_code(200)获得成功,使用http_response_code(400)获得错误,使用http_response_code(403)(如果需要授权)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM