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

多公司文档注册系统:PHP表单查找字段及MySQL中PHP Session变量应用

嘿,Jonathan,我来帮你拆解下这个多公司文档系统的问题,从表结构设计到Session的使用都给你梳理清楚~

一、优化你的表结构设计

你之前复制模板表到客户表的做法虽然能跑,但长期来看会有数据冗余、维护麻烦的问题(比如通用文档类型更新时,要同步所有客户表)。推荐用关联表的方案,更符合数据库范式:

  • 通用文档类型表(document_types):存policy、procedure这些通用类型,字段比如 id(主键)、type_name(类型名称)、description(描述)
  • 公司信息表(companies):存各公司的基础信息,id(主键)、company_name、contact_info等
  • 文档主表(documents):核心业务表,关联公司和文档类型,字段包括 id(主键)、company_id(外键关联companies.id)、document_type_id(外键关联document_types.id)、title、content、upload_time等
  • 如果部分公司需要自定义专属文档类型,可以加一张公司自定义类型表(company_custom_doc_types),字段 id、company_id、custom_type_name,然后文档表的document_type_id可以关联这个表或者通用类型表(也可以在通用类型表加is_custom标记,关联对应公司ID)

这种结构不用复制表,所有通用类型统一维护,权限控制也更清晰。

二、PHP Session在数据库操作中的正确用法

你提到的Session变量在MySQL表中的使用,核心是用Session存储当前登录的公司标识,然后在数据库查询/写入时带上这个标识做权限过滤:

  1. 用户登录验证通过后,把当前公司的ID存入Session:
    // 登录验证通过后获取合法公司ID
    $_SESSION['current_company_id'] = $validatedCompanyId;
    // 注意:所有用到Session的页面开头必须加 session_start();
    
  2. 查询文档时,强制带上公司ID条件,确保只能查到自身公司的文档:
    session_start();
    if (!isset($_SESSION['current_company_id'])) {
        // 未登录,跳转到登录页或提示权限不足
        header("Location: login.php");
        exit;
    }
    
    $companyId = $_SESSION['current_company_id'];
    // 用PDO预处理语句防止SQL注入
    $pdo = new PDO("mysql:host=localhost;dbname=your_db", "user", "pass");
    $stmt = $pdo->prepare("SELECT * FROM documents WHERE company_id = ?");
    $stmt->execute([$companyId]);
    $companyDocuments = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
  3. 新增文档时,自动把Session中的公司ID写入文档表:
    $title = $_POST['doc_title'];
    $typeId = $_POST['doc_type_id'];
    $content = $_POST['doc_content'];
    $companyId = $_SESSION['current_company_id'];
    
    $stmt = $pdo->prepare("INSERT INTO documents (company_id, document_type_id, title, content) VALUES (?, ?, ?, ?)");
    $stmt->execute([$companyId, $typeId, $title, $content]);
    

如果是想把Session本身的存储介质改成MySQL(比如应对大流量场景,默认Session存在服务器文件里),那可以配置PHP的Session处理器,把Session数据存在专门的Session表,但这和业务表是独立的,不影响你业务逻辑中用Session取公司ID的方式。

三、查找字段的实现思路

基于上面的结构,你可以做一个带搜索功能的表单,比如根据文档标题、类型名称搜索,同时自动带上公司ID过滤:

session_start();
$companyId = $_SESSION['current_company_id'];
$searchKeyword = $_GET['search'] ?? '';

$stmt = $pdo->prepare("
    SELECT d.*, dt.type_name 
    FROM documents d
    LEFT JOIN document_types dt ON d.document_type_id = dt.id
    WHERE d.company_id = ? 
    AND (d.title LIKE ? OR dt.type_name LIKE ?)
");
// 模糊查询的匹配格式
$matchKeyword = "%{$searchKeyword}%";
$stmt->execute([$companyId, $matchKeyword, $matchKeyword]);
$searchResults = $stmt->fetchAll(PDO::FETCH_ASSOC);

前端就做一个简单的搜索表单,提交关键词到这个PHP脚本即可。


内容的提问来源于stack exchange,提问作者Jonathan Green

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:17:31