【发布时间】:2017-02-03 06:57:37
【问题描述】:
我仍在学习正确且更有效的代码编写方法 - 目前我被困在当前的问题上。
我有一个当前工作正常的表单 - 写入 sql 数据库,然后重新加载当前页面。我希望表单不重新加载页面。
我知道有一种方法可以使用 jQuery 和 Ajax 来做到这一点——老实说,我对这些还不是很熟练。
如果有办法用 PHP/HTML 做到这一点 - 我会喜欢这种方法的指导。
如果唯一的答案是 Java 和 Ajax - 我希望能获得有关更改此表单以不重新加载页面的特定实例的指导。
按钮外观的屏幕截图 - 三种颜色代表跟踪发票付款的 3 个阶段。单击时红色变为黄色,黄色变为绿色,绿色变为红色(以防点击错误)。
这是我的表单的前端代码:
<form action="jump_invoicepaid.php" method="post">
<input type="hidden" name="invoicepaid" value="'.$projectid.'">');
if ($projectpaid == 2) {
echo('<button type="submit" name="action" class="greenbutton" value="unpaid">Paid</button></form>');
} else if ($projectpaid == 1) {
echo('<button type="submit" name="action" class="yellowbutton" value="paid">Paid</button></form>');
} else {
echo('<button type="submit" name="action" class="redbutton" value="sent">Paid</button></form>');
}
这是我的表单的后端代码:
if ($_POST['action'] == paid) {
///marking project as paid
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='2' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
} else if ($_POST['action'] == sent) {
///marking project as sent
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='1' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
} else if ($_POST['action'] == unpaid) {
///marking project as unpaid
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='0' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
}
我确实想全面学习 jQuery 和 ajax,这是我学习列表中的下一个。我知道他们会让这个问题更容易解决。
更新——我花了一些时间发布链接,表明这是链接的重复问题。我确实明白为什么......但它与我所问的内容或链接中给出的答案的核心不同。我认为该链接可能是该问题的“一个”答案——但我对任何无需使用 jQuery 和 AJAX 即可解决问题的方法感兴趣——如果这是不可避免的,那么特别是 AJAX 如何适合我的代码和这种具体情况。我同样认为这在链接中是独一无二的,因为我的按钮填充了 3 个不同的“if”检查,根据填充和单击的按钮写入不同的值。
更新 2 -- 这是我正在使用的当前代码。尽管看起来,ajax 并没有发送按钮的名称或值。
<script>
$( document ).ready(function() {
$("button").click(function(e) {
e.preventDefault(); // prevent page refresh
$.ajax({
type: "POST",
url: "jump_invoicepaid.php",
data: $(this).serialize(), // serialize form data
success: function(data) {
window.location.replace("?page=pastevents");
},
error: function() {
// Error ...
}
});
});
});
</script>
<form action="">
<input type="hidden" name="invoicepaid" value="'.$projectid.'">
if ($projectpaid == 2) {
echo('<button type="submit" name="action" class="greenbutton" value="unpaid">Paid</button></form>');
} else if ($projectpaid == 1) {
echo('<button type="submit" name="action" class="yellowbutton" value="paid">Paid</button></form>');
} else {
echo('<button type="submit" name="action" class="redbutton" value="sent">Paid</button></form>');
}
【问题讨论】:
-
stackoverflow.com/questions/18169933/…@userK1400 的可能重复项,您的答案可以在此答案中找到:stackoverflow.com/a/18170009/2280505
-
您真正想要的并不难,但您的代码还有一些其他问题需要解决。 1) 如果您要使用 Ajax,则必须从您的 PHP 代码中删除
header('Location: ..);。 2) 您的代码对 SQL 注入开放。学习使用MySQLi Prepared Statements 来防止这种情况。 3) 将 HTML 与 PHP 分开是一种更好的做法:if( .. ){ ?> <html> <?php } ?> -
如果您想避免使用 AJAX,您可以在页面上将表单目标设置为隐藏的
<iframe>。但是,之后您将无法更改 DOM - 为此,您几乎必须使用 JavaScript(或将整个表单放在它自己的<iframe>中,然后只会重新加载该框架)。 stackoverflow.com/a/168488/1743676 -
@userK1400 我个人会提倡 AJAX - 你可以用它做一些非常简洁的事情。我刚刚在您的 OP 中看到您很好奇是否有办法在没有 AJAX 的情况下做到这一点。有,但它有一些严重的限制。 :)
-
在这种情况下,您可能希望手动序列化数据,而不是使用 jQuery 的
$.fn.serialize()函数。它可以像普通的 POST 请求一样工作。只需发送一个关联数组,其中包含您希望推送的表单元素的键/值。编辑:不过,看起来serialize应该这样做。我会看看console.log($(this).serialize())的样子,让您更好地了解正在通过网络传输的数据结构。