2010-05-08 61 views
5

是否有可用的PHP的轻量级验证库,可以轻松地检查是否有特定的字符串或值的有效期为已知的数据库类型 -验证库PHP/MySQL的

事情是这样的:

if (is_MEDIUMINT($var)) { 
     $this->db->insert($anothervar); 
} 

谢谢!

+0

没有人知道这一点?我不能成为第一个认为这可能会得心应手的人! – Industrial 2010-05-10 12:54:15

+0

BOUNTY已开启! – Industrial 2010-05-16 11:29:30

回答

3

INFORMATION_SCHEMA数据库是ANSI 2003规范的一部分,所以你可以使用跨支持它的所有DB供应商(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()); 
} 

变化COLUMN_TYPE到DATA_TYPE如果你只是想 “VARCHAR”,而不是 “为varchar(64)”。如果你需要更多的,有很多:IS_NULLABLE,NUMERIC_PRECISION,CHARACTER_SET_NAME等

(不知道我会用个人使用这个虽然,is_*函数通常做的不够不需要额外的数据库调用更重要的是,info_schema持有如果你在一个共享的主机上,你可能根本无法访问它。)

MySQL-只有替代方法:与DESCRIBE [table]相似。这很明显,但如果你想要的只是在“bigint(21)unsigned”中找到“bigint”。

+0

如果某个特定值是特定数据类型的值,这将如何验证?这只会返回数据类型... – 2010-05-20 11:17:11

+0

这是更多的反应阅读其他答案,不知道我已经标记为答案。但是通过I_S/DESCRIBE,你至少可以检查数据库中的内容,而不是看看发生了什么。就个人而言,只要存在char/varchar/text/nvarchar/etc类型,我认为输入端就是徒劳无功。 – tadamson 2010-05-20 19:51:03

1

据我所知。 当然,您可以根据特定数据库类型的规则创建自己的函数或类来执行此操作。

对不起,我不能更多的帮助。 (快乐地通过任何其他用户进行教育,如果有一类/功能那里)

+0

谢谢卢卡斯。当然,我可以写一些行来做到这一点,但我会假设我不是第一个需要这个:) – Industrial 2010-05-08 15:17:01

6

这并不像看起来那么简单,你is_MEDIUMINT()功能很可能会成为:

is_MEDIUMINT() 
is_MEDIUMINT_NULL() 
is_MEDIUMINT_NOTNULL() 
is_MEDIUMINT_UNSIGNED() 
is_MEDIUMINT_UNSIGNED_NULL() 
is_MEDIUMINT_UNSIGNED_NOTNULL() 

然后碰上不同的数据库类型的问题时,SQLite例如仅具有一个INT类型而MySQL有至少5(TINYINTSMALLINTMEDIUMINTINTBIGINT),不计算别名(如INTEGERBOOLBOOLEANSERIAL)和f loat类型 - 由于可变精度参数,实现更加困难。请记住,我仍然忽略了几个关键功能,例如UNIQUE和只能在数据库上验证的外键约束。

我不明白你为什么认为这样的函数会有用,因为如果你可以设置你的数据库在严格模式下工作,然后简单地尝试插入值,如果查询失败,你知道一些错误,引述的MySQL手册:

非严格模式,当 外的范围值被分配给一个 整数列,MySQL的存储表示对应 端点列数据类型 的值 范围。如果将256存储到TINYINT 或TINYINT UNSIGNED列中,则MySQL 将分别存储127或255。

无论如何,您在插入之前是否需要验证值?

if (is_MEDIUMINT($var)) { 
    $this->db->insert($anothervar); 
} 

else { 
    // do what? 
} 

如果您尝试避免错误,请在事务中运行查询或使用INSERT OR IGNORE语法。

2

将它扔到数据库中,看它是否返回错误。如果没有,你的类型就足够了。

这也意味着你正在使用的dbms将处理valiation,这意味着当他们决定随心所欲地更改它们时,不必更新所有的验证函数。直到一切都死去,你很可能不会注意到这一点,你不能解决原因。越少代码你必须保持自己,越容易你的生活:)