2012-08-23 60 views
3

尋找一種方法來檢查數據庫中的表是否已與所需的列組合在一起。PHP PDO檢查mySQL表中的多個列並創建不存在的列

我建立這個功能:

function verifydbtable($table,$fields){ 
    global $fsdbh; 
    foreach($fields as $field => $type){ 
     $verify = $fsdbh->prepare("ALTER TABLE `$table` ADD `$field` $type;"); 
     $verify->execute(); 
    } 
    return 1; 
} 

哪裏$table是表更新和$fields包含了所有的領域,以檢查的數組。 $type包含字段的類型,例如。 VACHAR(20)

該函數適用於每個字段,直到遇到已存在的字段。然後它返回false。

問題是,它不會檢查數組中的剩餘列。我們如何讓它繼續檢查剩餘的字段。

引起的事實是,如果列已經存在,它將返回錯誤#1060 - Duplicate column name 'subtitle'這是它應該做的事情。然後,如果返回此錯誤,則需要跳至數組中的下一個項目。

通俗地說,我們需要這個,但當然這不是一個mySQL語句。

prepare("ALTER TABLE `$table` ADD IF NOT EXIST `$field` $type"); 
+0

你收到任何錯誤訊息? – kapa

+0

沒有錯誤信息。該功能是完美的。問題是,如果其中一個字段已經存在,則會返回錯誤:#1060 - 重複列名'url'。然後,而不是繼續與數組中的下一個項目,整個函數返回false。我們需要解決這個問題。是否有某種方法告訴它繼續IF ERROR。 –

+0

您可以在INFORMATION_SCHEMA數據庫中檢查表中已有的列名,並在嘗試更改語句之前將它們從數組中刪除。 – piotrm

回答

1

使用嘗試捕捉:

function verifydbtable($table,$fields){ 
    global $fsdbh; 
    $errors = array(); 
    foreach($fields as $field => $type){ 
     $verify = $fsdbh->prepare("ALTER TABLE `$table` ADD `$field` $type;"); 
     try { 
      $verify->execute(); 
     } catch (PDOException $e) { 
      // you might want to check and make sure its actually the right error 
      // but you can figure that out if when you need to do so 
      // we'll also store the field name in an array jsut in case we want to use it 
      $errors[] = $field; 
     } 
    } 

    return 1; 
} 
2

你可以嘗試爲查詢指定IGNORE

$fsdbh->prepare("ALTER IGNORE TABLE `$table` ADD `$field` $type;"); 
+0

不解決問題。如果列已經存在,則SQL返回錯誤,然後退出該函數而不是檢查數組中的下一項。我們需要解決這個問題,以便即使它們是錯誤,它也會繼續運行。有任何想法嗎? –

+0

@RobinKnight你可以檢查'PDO :: ATTR_ERRMODE'設置爲什麼嗎?也許它會拋出一個你必須捕捉的異常。見prodigitalson的答案。 – kapa