Ind*_*ial 5 php mysql validation
是否有可用于PHP的轻量级验证库,可以轻松检查特定字符串或值是否对已知数据库类型有效 -
像这样的东西:
if (is_MEDIUMINT($var)) {
$this->db->insert($anothervar);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
这并不像看起来那么简单,你的is_MEDIUMINT()功能很容易变成:
is_MEDIUMINT()
is_MEDIUMINT_NULL()
is_MEDIUMINT_NOTNULL()
is_MEDIUMINT_UNSIGNED()
is_MEDIUMINT_UNSIGNED_NULL()
is_MEDIUMINT_UNSIGNED_NOTNULL()
Run Code Online (Sandbox Code Playgroud)
然后运行到不同的数据库类型的问题时,SQLite例如仅具有一个INT类型,而MySQL有至少5( ,TINYINT,SMALLINT,MEDIUMINT,INT),BIGINT不计算别名(例如INTEGER,BOOL,BOOLEAN和SERIAL)和float类型-这将是更加困难由于变量精度参数而实现.请记住,我仍然忽略了几个关键功能,例如UNIQUE只能在数据库上验证的外键约束.
我不明白为什么你认为这些函数会有用,因为如果你可以设置数据库以严格模式工作然后只是尝试插入值,如果查询失败你就会知道出错了,引用MySQL手册:
在非严格模式下,当超出范围的值分配给整数列时,MySQL会存储表示列数据类型范围的相应端点的值.如果将256存储到TINYINT或TINYINT UNSIGNED列中,MySQL将分别存储127或255.
无论如何,你在插入之前验证值是什么意思?
if (is_MEDIUMINT($var)) {
$this->db->insert($anothervar);
}
else {
// do what?
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试避免错误,请在事务中运行查询或使用INSERT OR IGNORE语法.
INFORMATION_SCHEMA数据库是 ANSI 2003 规范的一部分,因此您可以在支持它的任何数据库供应商(MySQL、Postgresql、SQLite、MSSQL 2k5+)中使用它。
/*public static*/ function is_dbtype($table, $column, $type) {
$db = (...)::getInstance(); // assuming PDO
$sql = 'SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS '.
'WHERE TABLE_NAME = :table AND COLUMN_NAME = :column';
$st = $db->prepare($sql);
$st->execute(array(':table' => $table, ':column' => $column));
return ($type == $st->fetchColumn());
}
Run Code Online (Sandbox Code Playgroud)
如果您只想使用“varchar”而不是“varchar(64)”,请将 COLUMN_TYPE 更改为 DATA_TYPE。如果您需要更多,有很多:IS_NULLABLE、NUMERIC_PRECISION、CHARACTER_SET_NAME 等。
(虽然不确定我个人是否会使用这个,这些is_*函数通常不需要额外的数据库调用就足够了。更重要的是,info_schema 保存服务器上每个数据库的结构,因此授予它读取权限可能(应该)是一个很大的任务交易。如果您使用共享主机,您可能根本无法访问它。)
仅 MySQL 的替代方案:执行类似操作,但使用DESCRIBE [table]. 不过,它非常明确,如果您想要的话,您必须自己找出“bigint(21) unsigned”中的“bigint”。
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |