2010-05-08 13 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,這意味着當他們決定隨心所欲地更改它們時,不必更新所有的驗證函數。直到一切都死去,你很可能不會注意到這一點,你不能解決原因。越少代碼你必須保持自己,越容易你的生活:)