PHP怎样添加检查约束_PHP检查约束写法【校验】
技术百科
絕刀狂花
发布时间:2026-01-17
浏览: 次 MySQL的CHECK约束需通过SQL语句在数据库层面添加,PHP仅能借助PDO或mysqli执行ALTER TABLE语句实现,且要求MySQL≥8.0.16、InnoDB引擎。
MySQL 中的 CHECK 约束在 PHP 里不直接生效
PHP 本身没有“添加 CHECK 约束”的语法;CHECK 是数据库层面的约束,必须通过 SQL 语句交给 MySQL(或 PostgreSQL)执行。你在 PHP 里能做的,是用 PDO 或 mysqli 发送 ALTER TABLE ... ADD CONSTRAINT 这类语句。如果只在 PHP 代码里写个 if 判断,那叫应用层校验,不是数据库约束。
如何用 PHP 执行 SQL 添加 CHECK 约束
必须确保 MySQL 版本 ≥ 8.0.16(早期版本忽略 CHECK),且存储引擎是 InnoDB。以下用 PDO 示例:
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$pdo->exec("ALTER TABLE users ADD CONSTRAINT chk_age CHECK (age >= 0 AND age <= 150)");
-
chk_age是约束名,建议起有意义的名字,便于后续排查 - 约束表达式里不能引用函数(如
NOW())、子查询或其它表字段 - 如果表中已有违反该条件的数据,
ALTER TABLE会直接报错:Check constraint 'chk_age' is viola
ted
- 执行前最好先用
SELECT COUNT(*) FROM users WHERE age 150预检数据
PHP 应用层校验 ≠ 数据库 CHECK,但常需共存
数据库 CHECK 只防写入,不防应用逻辑错误、不拦 API 请求、也不提供友好提示。所以实际项目中,你通常得同时做两件事:
- 数据库加
CHECK (status IN ('active', 'inactive', 'pending'))防脏数据入库 - PHP 接收请求时,用
in_array($input['status'], ['active', 'inactive', 'pending'])提前拦截并返回 JSON 错误 - 注意:PHP 的
filter_var()或filter_input()适合基础类型校验(如邮箱、整数),但无法替代业务规则(如“结束时间必须晚于开始时间”) - 若用 Laravel,可写
Rule::unique('users')->where(fn ($q) => $q->where('deleted_at', null)),这类是 ORM 层校验,和 CHECK 无任何关系
常见失败原因和绕过陷阱
很多人试了没效果,其实不是 PHP 写错了,而是踩了这些坑:
- MySQL 用的是
MyISAM引擎 —— 它完全忽略 CHECK 约束,连警告都不报 - 执行语句时没开启严格模式(
sql_mode不含STRICT_TRANS_TABLES),导致违反 CHECK 的 INSERT 被静默转成默认值 - 用 phpMyAdmin 或某些低版本 Adminer 执行,界面可能自动过滤或重写
CHECK关键字 - PHP 连接 MySQL 用的是旧协议(如
mysql_connect已废弃),或未设置PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,导致错误被吞掉
真正可靠的 CHECK 约束,得靠数据库自己 enforce,PHP 只负责把语句发过去,并检查是否执行成功。别指望它在 PHP 里“运行”这个约束。
# ai
# 的是
# 这类
# 也不
# 很多人
# 你在
# 重写
# 已有
# input
# json
# if
# 数据库
# NULL
# select
# 错了
# php
# mysql
# sql
# postgresql
# count
# laravel
# pdo
# table
# mysqli
# 严格模式
# filter_var
# 应用层
# 不含
# phpMyAdmin
# sql语句
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么开启自动HDR画质_Windows1
- 如何在 Pandas 中按元素交集合并两列字符串
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- c++怎么使用std::unique实现去重_c+
- Python对象比较与排序_魔术方法解析【教程】
- Win11系统占用空间大怎么办 Win11深度瘦身
- 如何使用Golang指针与结构体结合_修改结构体内
- 如何优化Golang程序CPU性能_Golang
- Win11怎么查看显卡显存_查询Win11显卡详细
- 如何使用Golang处理静态文件缓存_提高页面加载
- C++ static_cast和dynamic_c
- Windows10如何删除Windows.old_
- Win11怎么设置桌面图标间距_Windows11
- Python面向对象实战讲解_类与设计模式深入理解
- 如何在Golang中实现CI/CD流水线自动化测试
- Win11怎么设置指纹解锁 Win11笔记本录入指
- 如何使用Golang安装API文档生成工具_快速生
- Python数据抓取合法性_合规说明【指导】
- Win10怎样清理C盘Steam游戏缓存_Win1
- Windows10怎样连接蓝牙设备_Windows
- Win11文件扩展名怎么显示 Win11查看文件后
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- c++输入输出流 c++ cin与cout格式化输
- 如何更改Windows资源管理器的默认启动位置?(
- Win11如何设置系统语言_Win11系统语言切换
- Win11怎么连接投影仪_Win11多显示器投屏设
- Python文件管理规范_工程实践说明【指导】
- Win11截图快捷键是什么_Win11自带截图工具
- php怎么下载安装后测试是否成功_简单脚本验证方法
- php本地部署后数据库连接报错_1045acces
- mac怎么安装pip_MAC Python pip
- Win11时间格式怎么改成12小时制 Win11时
- Win11怎么关闭自动调节亮度_Windows11
- Golang如何实现基本的用户注册_Golang用
- Win11无法拖拽文件到任务栏怎么办_Win11开
- Win11怎么设置ipv4地址_Windows 1
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- 如何使用Golang安装依赖库_管理模块和第三方包
- 如何自定义Windows终端的默认配置文件?(Po
- Win10怎样安装PPT模板_Win10安装PPT
- PHP的FastAdmin架构适合二次开发吗_特点
- c++ std::atomic如何保证原子性 c+
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- php能控制zigbee模块吗_php通过串口与c
- 如何在Golang中实现WebSocket广播_使
- Win11怎么关闭系统透明度_Windows11个
- 如何使用Golang实现错误包装与传递_Golan
- Mac自带的词典App怎么用_Mac添加和使用多语
- Win10如何卸载自带Edge_Win10彻底卸载
- php修改数据怎么改富文本_update更新htm


QQ客服