在製作OpenCart的插件中,我經常會遇到修改數據庫表結構的事情,起初爲了方便,是寫了一個sql語句,在安裝插件前讓用戶手動操作一下。
但這樣的弊端是,文件不能丟失,還得有足夠的說明,還得保證操作人能有操作數據庫的權限。
如果可以把對數據庫的操作寫在插件中,那就好了。執行到需要的地方,自動就執行對數據庫的操作,安全、高效、保證正確率、不需要額外登陸網絡數據庫管理系統。
那麼下面就來思考一下,設計的插件,這部分的思路吧:
1、首先必須明確的是,這個字段,在這個表中,只能有一個唯一的字段。所以只能是,字段沒有而插入,字段有了就不插入了。
2、要插入兩個字段,那麼必須分開判斷,雖然說它們是同一批次創建的,但爲了確保程序的正確率,不宜混在一起操作。
3、爲了確保操作的獨立,必須在創建完字段後執行提交,否則因爲後續數據保存問題,造成的回滾,會令本操作再執行一次,效率不高。
那麼,就先看看,如何從一張表中查找指定字段?
查看錶字段信息的sql語句是:SHOW COLUMNS FROM tablename;
在數據庫操作後,我們看到了,它的第一個字段名爲“Field”,就是所有字段的名字。那麼我們只要在這個字段名的數組中做一次遍歷,比對需要的字段名,如果不存在,就可以開始執行創建了。
$sql = "SHOW COLUMNS FROM " . DB_PREFIX ."category_description;";
$columns_data = $database->query($sql);
foreach ($columns_data->rows as $row) {
$col_field[]=$row['Field'];
}
in_array('menu_str', $col_field)
$sql = "Alter table `" . DB_PREFIX . "category_description` add `menu_str` varchar(255) default '';";
$database->query($sql);
以下是全文代碼:
function queryAndAlertField($database){
$sql = "SHOW COLUMNS FROM " . DB_PREFIX ."category_description;";
$columns_data = $database->query($sql);
foreach ($columns_data->rows as $row) {
$col_field[]=$row['Field'];
}
if(!in_array('menu_str', $col_field)){
$sql = "Alter table `" . DB_PREFIX . "category_description` add `menu_str` varchar(255) default '';";
$database->query($sql);
}
if(!in_array('category_str', $col_field)){
$sql = "Alter table `" . DB_PREFIX . "category_description` add `category_str` varchar(255) default '';";
$database->query($sql);
}
$database->query( "COMMIT;" );
}