使用 ajax 从 php 脚本返回成功/失败变量

Posted

技术标签:

【中文标题】使用 ajax 从 php 脚本返回成功/失败变量【英文标题】:Return success/failure variable with ajax from php script 【发布时间】:2015-06-14 09:52:38 【问题描述】:

我是一个真正的新程序员,正在为一项我现在正在努力并尝试了几天的任务而苦苦挣扎。

我搜索了 Google 和 Stack Overflow,但找不到(对我来说可以理解的)我的问题的解决方案:

我创建了一个 Twitter Bootstrap 登录页面,点击后会显示一个模式。在这个模式中,我有一个订阅时事通讯的表单:

 <form id="newsletter" method="post">
    <label for="email">Email:</label><br/>
    <input type="text" name="email" id="email"/><br/>
    <button type="submit" id="sub">Save</button>
</form>

<span id="result"></span>    

现在我想将数据插入到 mysql 数据库中并进行一些返回错误或成功消息的基本验证。该脚本在没有 ajax 的情况下工作正常,但可能需要更改它为 ajax 返回的内容?

    include("connection.php");

    if ($_POST['email']) 

        if(!empty($_POST['my_url'])) die('Have a nice day elsewhere.');
        if (!$_POST['email']) 
            $error.=" please enter your email address.";
         else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
            $error.=" please enter a valid email address.";
        
        if($error) 
            $error= "There was an error in your signup,".$error;
         else 
            $query="SELECT * FROM `email_list` WHERE email='".mysqli_real_escape_string($link, $_POST['email'])."'";
            $result = mysqli_query($link, $query);
            $results = mysqli_num_rows($result);
            if ($results)  
                $error.=" this email address is already registered.";
             else 
                $query = "INSERT INTO `email_list` (`email`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."')";
                mysqli_query($link, $query);
                $message = "Thanks for subscribing!";
            
        
     

经过大量阅读 ajax 似乎是在提交后不关闭引导模式的方法(以抑制默认事件)。

插入数据库工作正常,验证也是如此。

但我无法获得显示的不同错误消息(存储在 php 文件的 $error 变量中)或者在成功的情况下显示 $message。

这是 jquery 脚本:

$("#sub").submit(function ()
    event.preventDefault();
    $.ajax( 
        url: "newsletter2.php",
        type: "POST",
        data: email: $("#email").val(),
        success: function(message) 
            $("#result").html(message);
        ,
        error: function(error) 
            $("#result").html(error);
        
);

我尝试在 #result 范围内的 php 脚本中显示错误和消息变量的值。

感谢任何帮助。由于我对这个领域真的很陌生,所以请非常直接地表述它。

非常感谢您。

编辑: 在 php 文件中添加了一些以创建一个数组并将消息存储在其中:

    $response = array();
    $response['success'] = $success;
    $response['error']= $errors;
    exit(json_encode($response));

但是让 ajax 工作仍然有些麻烦。尝试了简写 $.post 而不是 $.ajax 但现在他们甚至无法开始发布数据...

$("#sub").submit(function ()
    event.preventDefault();
    $.post("newsletter.php", email: $("#email").val() );
);

非常感谢快速时间。经过数小时的测试后,我被卡住了,找不到错误。如果我定期提交表单,它工作正常,所以 php/mysql 部分不是问题。

我还意识到,当我单击“#sub”按钮时,它仍然尝试通过 get 提交表单(URL 获取传递的值)。所以我不确定 event.preventDefault();不工作? jQuery 已安装并正在运行。

【问题讨论】:

显示你的错误信息。 使用回声伴侣。回声 $message; 【参考方案1】:

$.ajax 错误函数在连接错误或找不到请求的页面时被调用

您必须使用 php 打印一些文本,然后 ajax 成功函数获取此输出。然后你解析这个输出看看它是怎么回事。

最佳做法是这样的:

php部分:

$response = array();
$response['success'] = $success;
$response['general_message'] = $message;
$response['errors']  = $errors;
exit(json_encode($response));

js/html部分:

$.post("yourpage.php", a , function (data) 
    response = JSON.parse(data);
    if(response['success'])
        //handle success here
    else
        //handle errors here with response["errors"] as error messages
    
);

祝你的项目好运

【讨论】:

感谢您的意见!我尝试了使用 json 编码的 php 数组,当我按照 action="newsletter.php" 和 method="post" 正常提交表单时,它工作正常 :) 但我似乎坚持使用 AJAX,甚至无法让它工作现在使用简化版本将数据发布到数据库: $("#sub").submit(function () event.preventDefault(); $.post("newsletter.php", email: $(" #email").val() ); 希望我能尽快完成这项工作。 嘿朱里。让我们调试一下。在控制台中打印出的这段代码是什么? $.post("newsletter.php", a , function (data) console.log(data));您使用 ctrl+shift+J 在 chrome 中打开 javascript 控制台【参考方案2】:

您需要将您的消息echo 发送回您的 AJAX。在您的 AJAX 成功中,您的 PHP 代码中没有消息返回到 message 变量的位置。

include("connection.php");

    if ($_POST['email']) 

        if(!empty($_POST['my_url'])) die('Have a nice day elsewhere.');
        if (!$_POST['email']) 
            $error.=" please enter your email address.";
            echo $error; die;
         else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
            $error.=" please enter a valid email address.";
            echo $error; die;
        
        if($error) 
            $error= "There was an error in your signup,".$error;
            echo $error; die;
         else 
            $query="SELECT * FROM `email_list` WHERE email='".mysqli_real_escape_string($link, $_POST['email'])."'";
            $result = mysqli_query($link, $query);
            $results = mysqli_num_rows($result);
            if ($results)  
                $error.=" this email address is already registered.";
                echo $error; die;
             else 
                $query = "INSERT INTO `email_list` (`email`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."')";
                mysqli_query($link, $query);
                $message = "Thanks for subscribing!";
                echo $message; die;
            
        
     

【讨论】:

我之前尝试过回显答案,但由于 $error 被附加,如果有多个错误部分,我无法让它一次显示所有错误部分。数组解决方案应该可以解决这个问题。【参考方案3】:

我基本上只是有同样的情况。我的代码结构有点不同,但它的工作原理......

$("#sub").submit(function ()
    event.preventDefault();
    $.ajax( 
        url: "newsletter2.php",
        type: "POST",
        dataType: 'json',
        data: email: $("#email").val(),

)
   .success(function(message) 
            $("#result").html(message);
        ),
    .error(function(error) 
            $("#result").html(error);
        )

在服务器端,我使用了 C#(asp.net) 并返回了一个 Json

return Json(new  Message = "Something...", Passed = true, JsonRequestBehavior.AllowGet);

【讨论】:

感谢您的意见!带有 php 的服务器端现在可以工作了,我只需要弄清楚 ajax 调用,我有一个错误,无法让它正常工作,甚至无法将数据发布到服务器。 $("#sub").submit(function () event.preventDefault(); $.post("newsletter.php", email: $("#email").val() ); 很高兴你的解决方案有效!:) 希望我的也很快。【参考方案4】:

好的,最后我设法通过这里的大量输入解决了这个问题。我做了以下事情:

PHP:

$response = array();
$response['success'] = $success;
$response['error'] = $error;
exit(json_encode($response));

JS:

    $("#newsletter").submit(function(event) 
            event.preventDefault();

        $.ajax(
            url: 'newsletter3.php',
            method: 'post',
            data: email: $('#email').val(),
            success: function(data) 
                var response = JSON.parse(data);
                console.log(response);
                if (response['success']) 
                    $("#error").hide();
                    $("#success").html(response['success']);
                    $("#success").toggleClass("alert alert-success");
                 else 
                    $("#error").html(response['error']);

                    if(!$("#error").hasClass("alert alert-danger"))
                        $("#error").toggleClass("alert alert-danger");
                
            
        );
    );

现在的功能是您单击一个按钮并弹出一个模式,然后您可以输入您的电子邮件,php 脚本会验证它是否有效以及它是否已经在数据库中。错误和成功消息会被 JSON 编码,然后显示在一个跨度中,该跨度会根据引导类的危险或成功而改变颜色。

非常感谢你帮助我,我很高兴解决了我的第一个编码问题:)

【讨论】:

【参考方案5】:

我在我的 ajax 上使用它

request.done(function (response, data) 
                   $('#add--response').html(response);
);

这在 PHP 上

die("Success! Whatever text you want here");

【讨论】:

以上是关于使用 ajax 从 php 脚本返回成功/失败变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 从 PHP 文件返回 JSON 数据

Ajax以JSON访问从PHP返回的多维数组

Ajax表单提交我想通过id更改表单元素的值,以便脚本从php中的返回值进行下一次调用

怎么获取AJAX前台返回JSON 数据

从 PHP 运行返回错误。阿贾克斯?

PHP 从 Ajax 调用接收空的 $_POST 变量