You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过下拉列表修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:25:23