2012-01-25 53 views
1

我正在開發一個基於數據庫中的表創建PHP類的工具。大部分功能都基於來自SHOW COLUMNS FROM $table的數據。每列通常涉及正在創建的新類中的實例變量。基於MySQL的動態PHP代碼創建列數據類型

我現在擁有的是如果用戶傳遞的「十二條」相關INT類型的列有一個變量,它不會失敗所處的環境,但在數據庫中的值變爲0

我想要的是該班級返回false,確認UPDATEINSERT無法完成。

您會爲此推薦什麼方法?

我現在要做的是構造一個列名稱數組,其中包含具有數字數據類型(INT,FLOAT等)的每列。當用戶嘗試設置變量時,它會檢查變量是否在此列表中,然後檢查設置的值以確定它是否爲數字。

PHP 5.3.3使用的MySQLi

我假設任何列,它是不是數字將接受的文本數據。

+0

請詳細說明你的意思是「我想讓班級返回假」 - 如果你的意思是「新」,那不是班級工作的方式。 –

+2

建議:現在停止,並檢出ORMs;例如:doctirne(http://www.doctrine-project.org/) – erenon

+0

@erenon感謝您的鏈接,我不能夠/允許對我們當前的系統做出巨大的改變,但我一定會帶來它爲未來的工作。 – Chris

回答

3

什麼是你問被稱爲ORM。 PHP中有一些很好的ORM庫。

  1. Doctrine
  2. Propel
  3. Outlet ORM
  4. Leap ORM for Kohana(我用它)
  5. PHP Data Mapper

順便說一句,我回答你的問題。

如果設置了任何無效數據,則可以拋出異常。

查看樣本。

class MyTable extends DbTable{ 
    function __set($var, $val){ 
     switch($var){ 
      case 'age': // age should be numeric type 
       if(!is_numeric($val)){ 
        throw new InvalidDataTypeException("$val of $var is not numeric"); 
       } 
      /// do other operation here 

      ... 
      ... // more cases 
     } 
    } 
} 
+0

這與我現在所做的工作類似。除了開關($ var)以外,我在做if(in_array($ var,$ numericVars)){//檢查數值}並構建一個應該是數字的變量數組。 SWITCH效率可能更高,但我覺得這個數組更容易閱讀和維護。我最大的桌子大約有30列,性能差異並不明顯。 – Chris

+0

另外,感謝ORM的列表,儘管我目前無法實現它們。 – Chris

+0

在使用任何PHP框架之前,我還構建了自己的Data映射器庫。 –

0

如果您想驗證輸入,也許您可​​以將jQuery Validate插件集成到創建數據庫實例的內核類中。

例如,您有一列是INT,使用SHOW COLUMNS您可以確定此列必須具有所需的十進制數,因此如果不正確,則無法提交表單並將其插入數據庫驗證。

+0

客戶端驗證並不是一種保證的方式,即所有發送到服務器的數據都是安全有效的。需要有服務器端選項。 – Chris

1

我的做法是爲每個字段創建不僅爲值的變量,也是一個用於驗證功能。

現在有一些靜態的驗證功能,如MyClass::ValidateInt()MyClass::ValidateFloat()和朋友,對於INT領域的驗證函數變量將會MyClass::ValidateInt,稱此同時生成SQL更新或插入

+0

所以像創建「公共函數驗證$ varName(){返回自我:: ValidateInt();}」 – Chris

+0

是的東西。通過在創建SQL時調用這些方法,您可以在打擊數據庫之前驗證這些值,另外通過將它們公開,您可以讓API消費者獲得更多自由(並減少代碼重複) –

0

UI倡導者可能會說接受「十二「,並將其轉換爲」12「。

從編程的角度來看,如果您必須在函數的當前範圍之外指示故障,處理這種情況的典型方法是引發異常並讓調用者處理這種情況。

+0

「十二」至「12」轉換可以在客戶端或代碼中處理在數據庫抽象層之前。我們不認爲它是DAL負責考慮所傳遞數據的背景,而僅僅是有效性。至於例外情況,我同意你的看法,但隨着我的發展,團隊中的其他人正在學習使用它。沒有其他方面使用例外,所以我試圖讓它保持在舒適區域以增加採用率。 – Chris