数据表插件中的会话变量

时间:2016-06-29 13:31:07

标签: php jquery mysql ajax datatable

我正在创建一个基于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}");
  4. 这里有完整的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对staff表的处理方式。所以基本上我希望$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作为实现动态表格过滤,搜索和排序的最佳方式(以及我们各部门高度要求的功能)。但我需要能够根据会话变量设置表。

    我为这个问题的长度道歉。如果需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

你是说这不起作用吗? 你有没有试过这样写的呢? (注意FXMLLoader loader = new FXMLLoader(fxmlURL); Parent root = loader.load(); ControllerClass controller = loader.getController(); 之后的空格。这是必要的!)

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