使用 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 脚本返回成功/失败变量的主要内容,如果未能解决你的问题,请参考以下文章