如何通过下拉列表修改PHP类私有变量$empTable实现数据表切换
问题描述
我有两个结构一致但数据不同的MySQL数据表,想在index页面通过下拉列表选择要连接的数据表。需要修改的变量$empTable是employee.php中PHP类的私有变量,要求无需页面跳转就能更新这个变量。目前下拉列表能正常输出选中结果,但没法同步到employee.php里,相关代码如下:
index页面表单代码
<?php $conn = new mysqli('localhost', 'root', '', '1601') or die ('Cannot connect to db'); $result = $conn->query("SELECT TABLE_NAME FROM `information_schema`.`tables` WHERE table_schema = '1601'"); echo "<html>"; echo "<body>"; echo "<form method='post' action=''>"; echo "<select name='GetTableName' onchange='this.form.submit()' >"; echo "<option selected='selected' value='select table'>select table</option>"; while ($row = $result->fetch_assoc()) { unset($name); /* $id = $row['id']; */ $name = $row['TABLE_NAME']; echo '<option value="'.trim($name).'">'.trim($name).'</option>'; } echo "</select>"; echo "</br>"; echo "</form>"; echo "</body>"; echo "</html>"; ?> <?php $Tname = $_POST['GetTableName']; // 用来查看提交结果 echo htmlspecialchars($Tname); // 这里输出"array" ?>
employee.php中的PHP类代码
<?php require('config.php'); class Employee extends Dbconfig { protected $hostName; protected $userName; protected $password; protected $dbName; private $empTable; // <== 需要修改这个变量的值 private $dbConnect = false; public function __construct(){ if(!$this->dbConnect){ $database = new dbConfig(); $this -> hostName = $database -> serverName; $this -> userName = $database -> userName; $this -> password = $database ->password; $this -> dbName = $database -> dbName; $conn = new mysqli($this->hostName, $this->userName, $this->password, $this->dbName); if($conn->connect_error){ die("Error failed to connect to MySQL: " . $conn->connect_error); } else{ $this->dbConnect = $conn; } } } // 新增的用来更新empTable的方法 public function setEmpTable(string $tableName) { $this->empTable = $tableName; } .....更多方法
DataTable代码
$(document).ready(function(){ var employeeData = $('#employeeList').DataTable({ // <--- 数据表格ID为employeeList "lengthChange": false, "processing":true, "serverSide":true, "order":[], "ajax":{ url:"action.php", type:"POST", data:{action:'listEmployee'}, dataType:"json" }, "columnDefs":[{ "targets":[0,4,5], "orderable":false, }, ], "pageLength": 10 });
action.php代码
<?php include('Employee.php'); $emp = new Employee(); if(!empty($_POST['action']) && $_POST['action'] == 'listEmployee') { $emp->employeeList(); // <--- 加载表格数据的方法listemployee } if(!empty($_POST['action']) && $_POST['action'] == 'addEmployee') { $emp->addEmployee(); } if(!empty($_POST['action']) && $_POST['action'] == 'getEmployee') { $emp->getEmployee(); } if(!empty($_POST['action']) && $_POST['action'] == 'updateEmployee') { $emp->updateEmployee(); } if(!empty($_POST['action']) && $_POST['action'] == 'empDelete') { $emp->deleteEmployee(); } ?>
解决方案
1. 改造下拉列表,用AJAX异步提交避免页面跳转
替换原表单的提交逻辑,用jQuery AJAX异步传递选中的表名,同时保留选中状态:
<!-- 先引入jQuery --> <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> <!-- 重构下拉列表 --> <select name='GetTableName' id='tableSelector'> <option selected='selected' value='select table'>选择数据表</option> <?php while ($row = $result->fetch_assoc()) { $name = trim($row['TABLE_NAME']); // 页面刷新后保持选中状态 $selected = isset($_SESSION['selected_table']) && $_SESSION['selected_table'] == $name ? 'selected' : ''; echo "<option value='$name' $selected>$name</option>"; } ?> </select> <!-- AJAX处理脚本 --> <script> $(document).ready(function(){ $('#tableSelector').change(function(){ var selectedTable = $(this).val(); if(selectedTable != 'select table'){ $.ajax({ url: 'action.php', type: 'POST', data: {action: 'setTable', tableName: selectedTable}, success: function(response){ // 成功后重新加载DataTable数据 employeeData.ajax.reload(); } }); } }); }); </script>
2. 启用Session保存选中的表名
在index.php和action.php的最顶部添加Session初始化代码:
<?php session_start(); // ... 其他代码 ?>
3. 修改action.php,处理表名设置请求
添加处理表名设置的逻辑,并在初始化Employee类时传入选中的表名:
<?php session_start(); include('Employee.php'); // 处理设置表名的AJAX请求 if(!empty($_POST['action']) && $_POST['action'] == 'setTable'){ $_SESSION['selected_table'] = $_POST['tableName']; echo 'success'; exit; } // 初始化Employee类并设置表名 $emp = new Employee(); if(isset($_SESSION['selected_table'])){ $emp->setEmpTable($_SESSION['selected_table']); } // ... 原有处理逻辑 ?>
4. 修复index页面$Tname输出"array"的问题
出现这个问题大概率是表单name属性被误写为数组格式(如GetTableName[]),检查代码确保name为GetTableName。改用Session保存表名后,这个输出代码可以直接删除。
内容的提问来源于stack exchange,提问作者silverspr
相关产品推荐
相关产品推荐

