【问题标题】:Session Variables in Datatables Plugin数据表插件中的会话变量
【发布时间】:2016-11-01 06:02:36
【问题描述】:

我正在创建一个基于 PHP/MySQL 的应用程序,它需要能够将会话变量传递到我在应用程序页面上使用的 DataTable 插件中。该应用程序相当复杂,因此在我提出具体问题之前,我将解释它是如何工作的。

index.php 上,有一个下拉菜单显示在我的组织中使用此应用程序的部门。部门列表由具有部门名称和部门代码的 mySQL 表生成。 $dept 变量存储提交时下拉菜单中所选选项的部门代码值。反过来,$_SESSION["department"] 变量存储$dept,如果成功则重定向到签入页面。

<?php
require_once('connection.php');
session_start();

if (isset($_POST['submit'])) 
{
$dept = $_POST['dept'];
$_SESSION["department"] = $dept;
header("Location: checkin.php");
}
?>
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Visitor Management</title>
<link rel="stylesheet" href="css/foundation.min.css" />
<link rel="stylesheet" href="css/app.css" />
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/24365087-b739-4314-af6e-741946b60bef.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/b05259d9-ca62-44a8-8a19-d3facdbd64df.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/2603d516-f938-4b52-ae3a-11d25bb4c555.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/510266cf-74ab-4fa8-9b39-dd37b90d6ab0.css"/>
</head>
<body>

<!-- nav -->
<div class="top-bar">
<div class="top-bar-left">
<ul class="menu">
</ul>
</div>
<div class="top-bar-right">
</div>
</div>

<div class="row text-center" style="margin-top: 5%;">

    <h1>Syracuse University</h1>
    <h2>Visitor Management</h2>
    <br/>
    <form id="dept" method="post" name="dept">
    <?php

   echo "<select name='dept'>";
    echo '<option>'.'Please select a department'.'</option>';
    $query = mysqli_query($VisitorManagement, "SELECT * FROM departments");

            while($row=mysqli_fetch_array($query))
            {
                echo "<option value='". $row['code']."'>".$row['name']
                .'</option>';


                }

    echo '</select>';



    ?>

    <input type="submit" class="button" value="Submit" name="submit">
    </form>

</div>

<script src="js/vendor/jquery.min.js"></script>
<script src="js/vendor/what-input.min.js"></script>
<script src="js/foundation.min.js"></script>
<script src="js/app.js"></script>
</body>
</html>

会话变量随后会在整个站点中携带,并用于确定需要显示哪个表格。例如,在 checkin.php 中,我们需要在下拉列表中显示员工。根据使用该应用程序的部门,我们有多个表。我们拥有的一个表称为ts_staff 如果会话变量存储为字符串ts,我们执行以下步骤以确保应用程序连接到正确的数据库:

  1. 我们将 index.php 中的会话变量存储到 checkin.php 上的全局变量$dept = $_SESSION[department];
  2. 我们创建另一个新变量来连接全局变量和在我们所有的 mySQL 员工表中使用的 _staff 字符串:$staffTable = $dept . "_staff";
  3. 最后,我们使用$staffTable变量作为需要显示的数据库表:$query = mysqli_query($VisitorManagement, "SELECT * FROM {$staffTable}");

这是完整的 checkin.php 代码:

<?php
// connect to database
require_once('connection.php');
session_start();

//get session variable, if empty, unset and logout
if(empty($_SESSION['department'])) {
session_unset();
session_destroy();
header("Location: index.php");
} else {
$dept = $_SESSION[department];
}

//submit values on submit
if (isset($_POST['submit'])) 
{
// store form data values
$suid = mysqli_real_escape_string($VisitorManagement, $_POST['suid']);
$staff = mysqli_real_escape_string($VisitorManagement, $_POST['staff']);

$checkinTable = $dept . "_checkin";
// insert varaibles into table rows
$sql = "INSERT INTO {$checkinTable} (suid, staffMember) VALUES ('$suid', '$staff')";

// check if row was inserted correctly
if (mysqli_query($VisitorManagement, $sql)) {
    header('Location: thank-you.php');
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($VisitorManagement);
}

}


?>

<!doctype html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Visitor Management</title>
<link rel="stylesheet" href="css/foundation.min.css" />
<link rel="stylesheet" href="css/app.css" />
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/24365087-b739-4314-af6e-741946b60bef.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/b05259d9-ca62-44a8-8a19-d3facdbd64df.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/2603d516-f938-4b52-ae3a-11d25bb4c555.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/510266cf-74ab-4fa8-9b39-dd37b90d6ab0.css"/>
</head>
<body>

<!-- nav -->
<div class="top-bar">
<div class="top-bar-left">
<ul class="menu">
<li><a href="checkin.php" class="active">Check-In</a></li>
</ul>
</div>
<div class="top-bar-right">
<ul class="menu">
  <li><a href="login.php">Admin Login</a></li>
  <li><a href="logout.php">Logout</a></li>
</ul>
</div>
</div>

<div class="row text-center" style="margin-top: 5%;">

    <h1>Syracuse University</h1>
    <!-- replace with whatever department they select -->
    <h2>Technical Services</h2>
  </div>

   <div class="row">
    <form id="checkin" method="post" name="checkin">
  <div class="row">
  <div class="medium-12 columns">
  <label>Please Swipe Your SUID Card
    <input type="text" placeholder="SUID Number Here" id="suid" name="suid" required>
  </label>
</div>
<div class="medium-12 columns">
  <label>Who Are You Here to See?
    <?php

            $staffTable = $dept . "_staff";

            echo "<select name='staff'>";
            echo '<option value="">'.'Please select a staff member'.'</option>';
            $query = mysqli_query($VisitorManagement, "SELECT * FROM {$staffTable}");

            while($row=mysqli_fetch_array($query))
            {
                echo "<option value='". $row['fullName']."'>".$row['fullName']
                .'</option>';

                }

                echo '</select>';

          // close connection
        mysqli_close($VisitorManagement);
    ?>
</label>
</div>
<div class="medium-12 columns">
<input type="submit" class="button" value="Submit" name="submit">
  </div>
</div>
</form>


</div>

<script src="js/vendor/jquery.min.js"></script>
<script src="js/vendor/what-input.min.js"></script>
<script src="js/foundation.min.js"></script>
<script src="js/app.js"></script>
</body>
</html>

问题是在 reports.php 上,我使用DataTables 插件来动态组织和过滤表格,但我需要能够将会话变量传递到插件中所以它知道根据用户在 index.php 屏幕上选择的内容来组织特定的表格。

reports.php 只是调用 DataTables 并使用另一个页面 response.php 将表格中的数据转换为 JSON 来显示。这是reports.php:

<?php session_start();
if(empty($_SESSION['department'])) {
session_unset();
session_destroy();
header("Location: index.php");
} else {
$dept = $_SESSION[department];
}
$checkinTable = $dept . "_checkin";
?>
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Visitor Management</title>
<link rel="stylesheet" href="../css/foundation.min.css" />
<link rel="stylesheet" href="../css/app.css" />
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/24365087-b739-4314-af6e-741946b60bef.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/b05259d9-ca62-44a8-8a19-d3facdbd64df.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/2603d516-f938-4b52-ae3a-11d25bb4c555.css"/>
<link type="text/css" rel="stylesheet" href="http://fast.fonts.net/cssapi/510266cf-74ab-4fa8-9b39-dd37b90d6ab0.css"/>
<link type="text/css" rel="stylesheet" href="https://cdn.datatables.net/r/dt/jq-2.1.4,jszip-2.5.0,pdfmake-0.1.18,dt-1.10.9,af-2.0.0,b-1.0.3,b-colvis-1.0.3,b-html5-1.0.3,b-print-1.0.3,se-1.0.1/datatables.min.css"/>
</head>
<body>
<?php
    if (!isset($_SESSION['user'])) {
    header("Location: ../login.php"); // If session is not set that redirect to Login Page
  }
?> 
<div class="top-bar admin">
<div class="top-bar-left">
<ul class="menu">
<li class="menu-text">Visitor Management</li>
</ul>
</div>
<div class="top-bar-right">
 <ul class="menu">
  <li><a href="logout.php">Logout</a></li>
  <li><a href="#">Help</a></li>
 </ul>
</div>
</div>

<div class="medium-2 columns dash">
    <ul>
        <li><a href="dashboard.php">Dashboard</a></li>
        <li><a href="staff.php">Staff</a></li>
        <li class="active"><a href="reports.php">Reports</a></li>
    </ul>
</div>

<div class="medium-10 columns">
     <div class="row checkin">
        <h2>Reports</h2>

         <table class="checkin" id="checkin">
            <thead>
            <tr>
            <th>ID</th>
            <th>SUID #</th>
            <th>Staff Member</th>
            <th>Student Name</th>
            <th>Student Email</th>
            <th>Check In Date/Time</th>
            </tr>
            </thead>


        </table>

   <!--<div class="float-left">
              <a href="export.php" class="button success">Export to Excel</a>
   </div>
   <div class="float-right">
   </div>-->

     </div>
</div>

<script type="text/javascript" charset="utf8" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"></script>
<script src="../js/vendor/what-input.min.js"></script>
<script src="../js/foundation.min.js"></script>
<script src="../js/app.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/r/dt/jq-2.1.4,jszip-2.5.0,pdfmake-0.1.18,dt-1.10.9,af-2.0.0,b-1.0.3,b-colvis-1.0.3,b-html5-1.0.3,b-print-1.0.3,se-1.0.1/datatables.min.js"></script>

<script>
    $(document).ready(function() {

        $('#checkin').DataTable({
        "bProcessing": true,
        "serverSide": false,
        "dom": 'lBfrtip',
     "buttons": [
        {
            extend: 'collection',
            text: 'Export',
            buttons: [
                'copy',
                'excel',
                'csv',
                'pdf',
                'print'
            ]
        }
    ],
        "ajax":{
            url :"response.php", // json datasource
            type: "post",  // type of method  ,GET/POST/DELETE
            data: {}
            }
        });   
});
</script>
</body>
</html>

这里是 response.php:

<?php
//include connection file 
include_once("../connection.php");

// initilize all variable
$params = $columns = $totalRecords = $data = array();

$params = $_REQUEST;

//define index of column
$columns = array( 
0 => 'id',
1 => 'suid', 
2 => 'staffMember',
3 => 'studentName',
4 => 'studentEmail',
5 => 'checkinDateTime'
);

$where = $sqlTot = $sqlRec = "";

// check search value exist
if( !empty($params['search']['value']) ) {   
$where .=" WHERE ";
$where .=" ( studentName LIKE '".$params['search']['value']."%' ";    
$where .=" OR staffMember LIKE '".$params['search']['value']."%' ";
$where .=" OR studentEmail LIKE '".$params['search']['value']."%' ";
$where .=" OR suid LIKE '".$params['search']['value']."%' ";
$where .=" OR checkinDate LIKE '".$params['search']['value']."%' )";
}

// getting total number records without any search
$sql = "SELECT id, suid, staffMember, studentName, studentEmail, date_format(checkinDateTime, '%b %d, %Y, %h:%i %p') as checkinDateTime FROM `ts_checkin`";
$sqlTot .= $sql;
$sqlRec .= $sql;
//concatenate search sql if value exist
if(isset($where) && $where != '') {

$sqlTot .= $where;
$sqlRec .= $where;
}


//$sqlRec .=  " ORDER BY ". $columns[$params['order'][0]['column']]."   ".$params['order'][0]['dir']."  LIMIT ".$params['start']." ,".$params['length']." ";

$queryTot = mysqli_query($VisitorManagement, $sqlTot) or die("database error:". mysqli_error($VisitorManagement));


$totalRecords = mysqli_num_rows($queryTot);

$queryRecords = mysqli_query($VisitorManagement, $sqlRec) or die("error to fetch check-in data");

//iterate on results row and create new index array of data
while( $row = mysqli_fetch_row($queryRecords) ) { 
$data[] = $row;
}   

$json_data = array(
    "draw"            => intval( $params['draw'] ),   
    "recordsTotal"    => intval( $totalRecords ),  
    "recordsFiltered" => intval($totalRecords),
    "data"            => $data   // total data array
    );

echo json_encode($json_data);  // send data as json format
?>

在 response.php 中,我需要能够替换 ts_checkin,显示在这一行:

$sql = "SELECT id, suid, staffMember, studentName, studentEmail, date_format(checkinDateTime, '%b %d, %Y, %h:%i %p') as checkinDateTime FROM `ts_checkin`";`

使用名为$checkinTable 的变量进行连接,类似于 checkin.php 对人员表的处理方式。所以基本上我希望$checkinTable = $dept . "_checkin"$dept 等于会话变量的值。

当我执行此操作时,我从 DataTables 收到此错误:DataTables warning: table id=checkin - Invalid JSON response. For more information about this error, please see http://datatables.net/tn/1

是否有可能让这个工作?我希望将 DataTables 保留为实现动态表过滤、搜索和排序的最佳方式(此外,它是我们部门高度要求的功能)。但我需要能够根据会话变量设置表。

对于这个问题的冗长,我深表歉意。如果需要澄清,请告诉我。

【问题讨论】:

    标签: php jquery mysql ajax datatable


    【解决方案1】:

    我不确定是否理解这个问题......

    你是说这行不通吗?
    你试过这样写吗?
    (注意FROM后面的空格,有必要!)

    $checkinTable = $dept . "_checkin";
    
    $sql = "SELECT id, suid, staffMember, studentName, studentEmail, date_format(checkinDateTime, '%b %d, %Y, %h:%i %p') as checkinDateTime FROM " . $checkinTable;
    

    当然,$dept 也必须定义。
    生成的 $checkinTable 必须是现有的表名。

    好的...
    您的response.php 中似乎缺少此内容:

    session_start();
    $dept = $_SESSION[department];
    $checkinTable = $dept . "_checkin";
    

    【讨论】:

    • 我很抱歉这个令人困惑的问题。很难解释该应用程序,因为它是我公司内部的。这是我所做的:首先,我将 $dept = $_SESSION[department]; $checkinTable = $dept . "_checkin"; 添加到 response.php 的顶部,然后我将 $sql 变量更改为 $sql = "SELECT id, suid, staffMember, studentName, studentEmail, date_format(checkinDateTime, '%b %d, %Y, %h:%i %p') as checkinDateTime FROM " . $checkinTable;,但我仍然从 DataTables 中收到相同的错误。
    • session_start() ??
    • 如果你不在这个被调用的页面中启动会话,$dept 将是未定义的。
    • 当然,缺少了这么简单的东西,这样就解决了问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2011-04-17
    相关资源
    最近更新 更多