在ajax请求中存储来自php的响应

时间:2017-06-16 19:47:45

标签: php jquery ajax

我试图将来自ajax(jquery)响应的数据存储到变量中,因为我需要稍后在代码中使用它。

Jquery代码:

  $(document).ready(function () {
  $("#submitReg").click(function () {
    var email = $("#email").val();
    var password = $("#password").val();
    var confpassword = $("#confpassword").val();
    if (email == '' || password == '' || confpassword == '') {
        swal({
            type: "error",
            timer: 10000,
            showConfirmButton: true,
            confirmButtonText: "OK",
            confirmButtonColor: "#f4511e",
            title: "Prosím vyplňte všetky polia!"
        });
    } else {
        $.get("./php/register.php", {
            email: email,
            password: password,
            confpassword: confpassword,
            dataType: 'json',
            //data: '1',

            success: function ($data) {
                var controlNumber = $data;
                alert(controlNumber);
                if (controlNumber != 1) {
                    swal({
                        type: "success",
                        timer: 10000,
                        showConfirmButton: true,
                        confirmButtonText: "OK",
                        confirmButtonColor: "#f4511e",
                        title: "Registrácia prebehla úspešne."
                    });
                  //  $('#registerme')[0].reset();
                } else {
                    swal({
                        type: "error",
                        timer: 10000,
                        showConfirmButton: true,
                        confirmButtonText: "OK",
                        confirmButtonColor: "#f4511e",
                        title: "Mail už bol zaregistrovaný."
                    });

                }
            }
        })
    }
});
}); 

PHP代码:

<?php

require_once 'connect.php';

$email = ($_GET['email']);
$password = ($_GET['password']);
$passwordR = ($_GET['confpassword']);

if ($password == $passwordR) {

$password = hash('sha256', $password);
$emailCheck = mysqli_query(connect(), "SELECT * FROM users WHERE email='" . 
$email . "'");

if (mysqli_num_rows($emailCheck) > 0) {
    echo json_encode(1);
    die();
 } else {
    $sql = "INSERT INTO users (email, password) VALUES ('$email','$password')";
}
}

if (connect()->query($sql) === TRUE) {
//implementuj reset kody ptm
} else {
echo "Error: " . $sql . "<br>" . connect()->error;
}

die();

?>

我收到回复 - 1所以我认为这样有效,但我需要以某种方式存储它 感谢大家的任何答案

3 个答案:

答案 0 :(得分:0)

我试图将来自ajax(jquery)响应的数据存储到变量 ,因为 我需要稍后在代码中使用它。

接受的答案有&#39; var controlNumber = $data;&#39; Ajax Success Callback中的声明,它不能从Ajax函数外部访问。这句话很清楚,你不能得到controlNumber&#39;变量在...之外 Ajax回调成功函数,因为 it's a local variable declared inside a function ..所以最好是声明一个全局JavaScript变量并再次重新分配值在Ajax Success回调中

按照他们的方式,如果我按照&#34; I'm trying to store data from ajax (jquery) response to variable &#34;然后接受的答案很好。

但如果我按照声明&#34; I need to use it later in code &#34;在这里创造了两个假设..

  

1 - 如果您的代码仍然在ajax函数内 - 那么很好

     

2 - 如果您的代码在外部ajax函数上使用ajax响应,那么您将无法获得&#39; controlNumber&#39;值。如果你尝试,你会得到&#39; undefined &#39;

那么处理Ajax响应的最佳方法是什么,创建一个负责返回成功或错误响应的ajax对象的函数。我确信它听起来不太清楚..;)不用担心这里更多或更多阅读:)

首先要了解什么是ajax以及它是如何工作的??

  

AJAX = A 同步 J avaScript a nd X ML。

     

AJAX是一种用于创建快速动态网页的技术。

     

AJAX允许通过交换更新异步网页   幕后服务器的少量数据。这意味着   可以更新网页的各个部分,而无需重新加载   整个页面。

内容参考: W3CSCHOOL

请注意单词&#39; asynchronously &#39;,这意味着如果您调用ajax并尝试在下一行使用ajax响应数据,那么您可以&#39;吨。因为,DOM不会等待Ajax Response&amp;脚本不会停止等待完成ajax的过程它会继续&amp;你会得到“未定义的”#39;直到您没有使用&#39; async: false &#39; 来生成ajax请求选项。 *但是从jQuery 1.8开始,不推荐使用async:false! Wohooo!听起来很棒!!! @ - @ *

许多人还建议稍后在ajax成功回调中使用global var并设置变量值。但问题是 尽管你尝试在下一个ajax调用之后使用变量,然后它将产生与上述描述相同的错误。

  

所以最好的方法是存储或使用或获取Ajax响应   使用返回ajax对象的函数,稍后可以使用它   ajax对象与&#39; YourAjaxObject.success(callback) &#39;随地   在您的应用程序中的任何时候,不用担心你也可以使用/ put   你的函数需要在ajax成功中进行ajax响应   回调。

一个非常简单的例子,我与你分享,以便更好地理解这一点......

// global var declare here
var collect = null;
$(document).ready(function() {
    var btn = $('#mySubmitButton');
    btn.on('click', function(e) {
        e.preventDefault();
        $.post('url.php', {
            id: 1
        }, function(ajx_res) {
            // store ajax response in global var
            collect = ajx_res;
            // 'I will execute last with collect = ajx_res data
            alert(collect);
        });
        // 'I will execute first with collect = null data
        alert(collect);
        // When btn click again, I will execute first with previous ajx_res data
        alert(collect);
    });
});
$(document).ready(function() {
    var btn = $('#mySubmitButton');
    btn.on('click', function(e) {
        e.preventDefault();
        $.post('url.php', {
            id: 1
        }, function(ajx_res) {
            // now I am local var
            var collect = null;
            // store ajax response in local var
            collect = ajx_res;
            // 'I will execute last with collect = ajx_res data
            alert(collect);
        });
        // I will execute first with collect = undefined
        alert(collect);
        // When btn click again I will execute first with same collect = undefined
        alert(collect);
    });
});
/**
 * Ajax Request & Return Response
 * @param url _url         action url
 * @param object options send payloads
 */
function AjaxCall(_url, _options) {
    return $.ajax(_url, {
        method: 'POST',
        data: _options,
        error: function(xhr, ajaxOptions, thrownError) {
            alert("Request Error:" + thrownError + " with Status" + xhr.status);
        }
    });
}
// I am again as global var
var collect = null;
$(document).ready(function() {
    var btn = $('#mySubmitButton');
    // first button, click
    btn.on('click', function(e) {
        e.preventDefault();
        // return ajax object, and can be use within entire application via callback
        collect = AjaxCall(_url, _options);
        // use success callback to retrieve data
        collect.success(function(ajx_res) {
            // I will execute first with ajx_res
            alert(ajx_res);
        });
    });
    var btns = $('#mySubmitButtons');
    // on another button, another click
    btns.on('click', function(e) {
        e.preventDefault();
        // using previous ajax obj to get data
        collect.success(function(ajx_res) {
            // I will execute first with previous ajx_res
            alert(ajx_res);
        });
    });
});

// I am again as global var
var collect = null;
$(document).ready(function() {
    var btn = $('#mySubmitButton');
    // first button, click
    btn.on('click', function(e) {
        e.preventDefault();
        // return ajax object, and can be use within entire application via callback
        collect = AjaxCall(_url, _options);
    });
    var btns = $('#mySubmitButtons');
    // on another button, another click
    btns.on('click', function(e) {
        e.preventDefault();
        // using previous ajax obj to get data
        collect.success(function(ajx_res) {
            // I will execute first with previous ajx_res
            alert(ajx_res);
        });
    });
});

简而言之:

  

1 - 你不能使用局部变量(在函数或函数内声明)   循环)他们的宣言区域外。

     

2 - Ajax不会返回响应,您可以通过使用获得响应   回调。

     

3 - 将Ajax响应存储在全局变量中以在ajax之外使用   回调函数。

     

4 - 如果任何代码,函数依赖于ajax响应,请将它们放入其中   ajax成功回调。

     

5 - 如果任何特定函数需要ajax响应值,则调用   成功回调中的那些功能&amp;传递ajax响应为   参数或您可以使用&#39;注射技术&#39; (功能起作用   使用相同的参数)例如

function Hello (ajx_res) {
    alert (ajx_res);
    // send in another function
    Foo (ajx_res);
}

function Foo (ajx_res) {
    alert (ajx_res);
    // send in another function
    Bar (ajx_res);
}

function Bar (ajx_res) {
    alert (ajx_res);
}

所以我的答案是针对这个问题使用Ajax Object&amp;通过Callbacks获得回复。

/**
 * Ajax Request & Return Response
 * @param url _url         action url
 * @param object options send payloads
 */
function AjaxCall(_url, _options) {
    return $.ajax(_url, {
        method: 'POST',
        data: _options,
        error: function(xhr, ajaxOptions, thrownError) {
            alert("Request Error:" + thrownError + " with Status" + xhr.status);
        }
    });
}
$(document).ready(function() {
    $("#submitReg").click(function() {
        var email = $("#email").val();
        var password = $("#password").val();
        var confpassword = $("#confpassword").val();
        if (!email || !password || !confpassword) {
            swal({
                type: "error",
                timer: 10000,
                showConfirmButton: true,
                confirmButtonText: "OK",
                confirmButtonColor: "#f4511e",
                title: "Prosím vyplňte všetky polia!"
            });
        } else {
            var ajaxObj = AjaxCall("./php/register.php", {
                email: email,
                password: password,
                confpassword: confpassword,
            });
            // your ajax callback function for success
            ajaxObj.success(function(response) {
                var controlNumber = response;
                if (controlNumber == '1') {
                    swal({
                        type: "success",
                        timer: 10000,
                        showConfirmButton: true,
                        confirmButtonText: "OK",
                        confirmButtonColor: "#f4511e",
                        title: "Registrácia prebehla úspešne."
                    });
                } else if (controlNumber == '0') {
                    swal({
                        type: "error",
                        timer: 10000,
                        showConfirmButton: true,
                        confirmButtonText: "OK",
                        confirmButtonColor: "#f4511e",
                        title: "Mail už bol zaregistrovaný."
                    });
                } else {
                    alert(controlNumber);
                }
            });
        }
    });
});

希望这会让初学者用户一见倾心,一见钟情的初学者,初恋:D ^ _ ^ Tadaaa .. :)

答案 1 :(得分:-2)

在你的php中,如果在找到行时尝试返回1,则只需echo 1;而不是echo json_encode(1);。无论何时调用php页面,输出的值都是Ajax响应中检索到的数据。没有理由对json进行编码,因为它不是json格式的值。它将作为输出的字面值返回。

如果您尝试将响应值存储在同一页面会话中,则需要将变量初始化为全局变量,而不是Ajax请求的局部变量。

var test;

$.ajax({
  url:'',
  data:{index: value, index: value}, //if you have a form, $('[form selector]').serialize();
  method:'', // get or post
  success: function(data){
    // the data here is the data returned from the Ajax request
    test=data.whatever;
  }
});

因为测试是在Ajax调用之外初始化的,所以它现在将存储在mem中,直到页面被刷新或更改,并且可以在javascript的其他部分中使用。

答案 2 :(得分:-2)

您的代码看起来没问题做了一些改进尝试:

JS:

$(document).ready(function () {
  $("#submitReg").click(function () {
    var email = $("#email").val();
    var password = $("#password").val();
    var confpassword = $("#confpassword").val();
    if (email == '' || password == '' || confpassword == '') {
        swal({
            type: "error",
            timer: 10000,
            showConfirmButton: true,
            confirmButtonText: "OK",
            confirmButtonColor: "#f4511e",
            title: "Prosím vyplňte všetky polia!"
        });
    } else {
        $.ajax("./php/register.php", {
            method:'POST',
            data: {
            email: email,
            password: password,
            confpassword: confpassword,
             },

            success: function ($data) {
                var controlNumber = $data;
               // alert(controlNumber);
                if (controlNumber == 1) {
                    swal({
                        type: "success",
                        timer: 10000,
                        showConfirmButton: true,
                        confirmButtonText: "OK",
                        confirmButtonColor: "#f4511e",
                        title: "Registrácia prebehla úspešne."
                    });
                  //  $('#registerme')[0].reset();
                } 
                 else if(controlNumber == 0)
                 {
                    swal({
                        type: "error",
                        timer: 10000,
                        showConfirmButton: true,
                        confirmButtonText: "OK",
                        confirmButtonColor: "#f4511e",
                        title: "Mail už bol zaregistrovaný."
                    });

                }
                else
               {
                alert(controlNumber );
               }

            }
        })
    }
});
}); 

PHP:

<?php

require_once 'connect.php';

$email = ($_POST['email']);
$password = ($_POST['password']);
$passwordR = ($_POST['confpassword']);

if ($password == $passwordR) {

$password = hash('sha256', $password);
$emailCheck = mysqli_query(connect(), "SELECT * FROM users WHERE email='" . 
$email . "'");

if (mysqli_num_rows($emailCheck) > 0) {
    echo 0;
    die();
 } else {
    $sql = "INSERT INTO users (email, password) VALUES ('$email','$password')";
}
}

if (connect()->query($sql) === TRUE) {
 echo 1;
 die();
} else {
echo "Error: " . $sql . "<br>" . connect()->error;
die();
}