我的网页名为 train_detail.php 。我在该页面上有一个表,它是使用SQL创建的,并且 train_id 是其列属性之一。在每行的末尾有一个名为 check_availability 的按钮。单击此按钮时,将打开一个新模态。它会将行值( train_id )传递给模态。我通过将值通过post方法传递给页面 helpe.php 来使用JS。现在,我已经创建了$ _SESSION变量并将$ _POST变量的值传递给了SESSION变量。但问题是会话变量无法更新其值。请帮帮我。
train_detail.php-
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<title>Home</title>
<link rel="stylesheet" type="text/css" href="style.css">
<style>
.header{
width: 70%;
}
.content {
width: 70%;
}
<?php
session_start();
$db = mysqli_connect('localhost', 'root', '', 'registration');
$Source =$_SESSION['Source'];
$Destination = $_SESSION['Destination'];
$query = "SELECT * FROM train_details WHERE train_source='$Source' AND train_destination='$Destination'";
$results = mysqli_query($db, $query);
?>
</style>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: center;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
<style>
#myDIV {
width: 100%;
padding: 50px 0;
text-align: center;
background-color: lightblue;
margin-top:20px;
}
.hidden{
display:none;
}
</style>
</head>
<body>
<div class="header">
<h2>Train details</h2>
</div>
<div class="content">
<table>
<tr>
<th>Train no.</th>
<th>Train name</th>
<th>Train departure</th>
<th>Train arrival</th>
<th></th>
</tr>
<script>
function myFunction() {
}
</script>
<tbody>
<!--Use a while loop to make a table row for every DB row-->
<?php while( $row = mysqli_fetch_array($results)) : ?>
<tr>
<!--Each table column is echoed in to a td cell-->
<td><?php echo $row["train_id"]; ?></td>
<td><?php echo $row["train_name"]; ?></a></td>
<td><?php echo $row["train_departure"]; ?></td>
<td><?php echo $row["train_arrival"]; ?></td>
<td>
<button type="button" id="availability" class=" open-AddBookDialog btn btn-info btn-lg" data-toggle="modal" data-id="<?php echo $row["train_id"]; ?>"
href="#addBookDialog">Check availability</button>
</td>
</tr>
<?php endwhile ?>
</tbody>
</table>
<!--modal-->
<div class="modal fade" id="addBookDialog" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body">
<p><?php echo $_SESSION['var_train2'] ?></p>
<input type="text" name="bookId" id="bookId" value=""/>
<div id="train">
</div>
<table style="width: 100%">
<tr>
<th>Date</th>
<?php
$query = "SELECT * FROM train_status WHERE 1";
$results = mysqli_query($db, $query);
?>
<?php while( $row = mysqli_fetch_array($results)) : ?>
<th><?php echo $row["train_date"]; ?></th>
<?php endwhile ?>
</tr>
<tr>
<th>availability</th>
<?php
$query = "SELECT * FROM train_status WHERE 1";
$results = mysqli_query($db, $query);
?>
<?php while( $row = mysqli_fetch_array($results)) : ?>
<th><?php echo $row["availability"]; ?><br>
<a href="login.php?logout='1'" style="color: blue;">book now</a></th>
<?php endwhile ?>
</tr>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" onclick="myFunction()" data-dismiss="modal">Close</button>
<script>
function myFunction() {
location.reload();
}
</script>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).on("click", ".open-AddBookDialog", function () {
var myBookId = $(this).data('id');
$(".modal-body #bookId").val( myBookId );
$.ajax({
type: 'post', // the method (could be GET btw)
url: 'helper.php', // The file where my php code is
data: {
'test': myBookId // all variables i want to pass. In this case, only one.
},
success: function(data) { // in case of success get the output, i named data
alert(data); // do something with the output, like an alert
}
});
});
</script>
<p> <a href="login.php?logout='1'" style="color: red;">logout</a> </p>
</div>
</body>
</html>
helper.php -
<?php
session_start();
if(isset($_POST['test'])) { //if i have this post
echo $_POST['test']+1; // print it
$_SESSION["var_train2"] =$_POST['test'];
echo $_SESSION['var_train2'];
}
?>
答案 0 :(得分:0)
您正在混合两个编程层:
在服务器 之前处理PHP图层将任何内容传送到客户端。
JS层在客户端处理, 服务器完成处理后,内容已经传送到客户端。
所以客户端(JS)无法读取任何服务器var的内容,包括'$ _SESSION'vars。 模态对话框显示为引导程序(BS)框架的一部分通过JS (隐藏在BS代码的深处)。它通过纯粹使用客户端JS代码显示,没有额外的服务器往返。所以这一行中的PHP:
<p><?php echo $_SESSION['var_train2'] ?></p>
处理服务器一侧,之前用户点击任何按钮,甚至在客户端甚至收到任何HTML之前。因此,假设会话首先为空,呈现的HTML代码如下所示:
<p></p>
检查浏览器的本机HTML显示(查看源命令)以进行验证。这就是原因,当您单击按钮时,对话框中没有任何值。
现在,当您单击客户端按钮时,您可以在AJAX调用中调用帮助程序脚本。这将设置会话var中按钮的ID。会发生什么:
按下按钮触发客户端 JS脚本,无法设置任何$_SERVER
var。
JS脚本运行AJAX调用,请求服务器端帮助程序脚本。
服务器端帮助程序脚本在服务器上执行,设置$_SESSION
var,其中包含AJAX调用发布的内容。
服务器端帮助程序脚本终止,$_SESSION
var现在包含新值。
客户端引导程序部分显示仍包含原始空行的模式对话框:
<p></p>
现在你得到了这笔交易的一部分,你已经设置了$_SERVER
var。但是如果没有重新加载,它就不会显示客户端。要获得客户端上显示的代码,您有多种可能性:
将模态对话框放在单独的php文件(dialog.php)中,然后在浏览器弹出窗口或浏览器主窗口中打开该文件,替换当前内容。将火车ID发布到该dialog.php并从数据库中读取您需要的所有内容。这里不需要任何ajax或任何BS模态对话框。
使用当前的BS模式对话框,但使用JS填充内容。
我不会详述案例1,只是案例2:
更改以上行以包含ID:
<p id="myID"></p>
在onclick函数中使用JQuery以及现有代码来设置<p id="myID"></p>
标记的内容:
$(".modal-body #bookId").val( myBookId );
$("#myID").text(myBookId); // new
现在对话框应显示相应按钮的ID。如果您希望通过AJAX从服务器加载更多数据并显示在对话框中,您可以考虑使用像AngularJS这样的框架来为您完成工作。那里的学习曲线当然是陡峭的。
另一个(完全不同的)问题可能是构建查询的行中可能的SQL注入错误:
$query = "SELECT * FROM train_details WHERE train_source='$Source' AND train_destination='$Destination'";
这看起来很容易受到SQL注入错误的影响。如果是有人将源设置为somethimg恶意,它可以完全改变查询的含义。您应该使用mysqli_real_escape_string封装您的值,或者首先使用prepared statement。