多公司文档注册系统: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存储当前登录的公司标识,然后在数据库查询/写入时带上这个标识做权限过滤:
- 用户登录验证通过后,把当前公司的ID存入Session:
// 登录验证通过后获取合法公司ID $_SESSION['current_company_id'] = $validatedCompanyId; // 注意:所有用到Session的页面开头必须加 session_start(); - 查询文档时,强制带上公司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); - 新增文档时,自动把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
相关产品推荐
相关产品推荐

