2009-12-17 64 views
3

我想在php中創建一個插入函數,我將用它來插入數據到數據庫中。php插入sql函數

當然,所有的插入是不一樣的,有些使用一個表別人使用其他,表有不同的列數等等。什麼是最好的辦法做到這一點?

我目前在會員註冊的網頁上,現在我不想讓所有人都註冊,我想讓管理員批准哪些會員會獲得批准,哪些會不會,所以我設置了一個隱藏字段爲0,並在批准後成爲一個。

CASE:有人來到網站,並改變輸入字段值1螢火併提交註冊,自動獲得批准,我沒有嘗試這個,我只是考慮的可能性。現在,如果我將member_active放入插入函數中,那麼對於其他數據庫列行數少的插入查詢,它將不起作用。

這樣做的方法是什麼,全局/通用插入功能是一個好主意,我非常瞭解如何對所有這些進行編程,但最近我對數據/效率以及此類事情變得更加小心這可以讓你的網站變得更好/更糟糕,所以我想要一個好的開始。謝謝

回答

3

CodeIgniter also does this,但在這裏它是:

function Insert($table, $data, $ignore = false) 
{ 
    $sql = array(); 

    if (is_array($sql) === true) 
    { 
     $sql['query'] = 'INSERT '; 

     if ($ignore === true) 
     { 
      $sql['query'] .= 'IGNORE '; 
     } 

     foreach ($data as $key => $value) 
     { 
      $data[$key] = Tick($key) . ' = ' . Quote($value); 
     } 

     $sql['query'] .= 'INTO ' . Tick($table) . ' SET ' . implode(', ', $data); 
    } 

    return implode('', $sql); 
} 

顯然,你需要定義自己的Tick()Quote()功能反勾數據庫實體分別逃離值。

+0

謝謝小夥子。 Spot on answer – ant 2009-12-17 21:04:09

0

只要不使用表單域直接插入它們,如果你這樣做的話(這就是我讀到這個問題時得到的結果)。在CI中,將隱藏的字段值作爲0傳遞給插入函數,並且該可能性消失。

2

那麼,如果你打算在抽象中走得那麼遠,那麼你也應該抽象寫一個查詢到一個類的整個過程(參見Zend_Db_Select,Doctrine_Query,Propel Criteria等)。

但是更重要的是,正如吉米建議,如果有人正在註冊,你知道他們總是會等待批准...所以甚至不使用表單中的值,將它添加到表單值的數組後提交但在傳遞到您的插入功能之前。

1

取代在代碼中抽象SQL,最好使用數據庫的構建功能:存儲過程(SP)或某些數據庫僅使用DB功能。

把數據庫工作抽象到代碼中是不對的,因爲你假設表結構永遠不會改變(應用程序的一個主要錯誤是不斷變化和改進)。

通過創建的SP您撥打一個SQL調用,比如:

$query = "EmployeeAdd('joe','smith','1970-12-22')"; 

現在你的代碼已經被抽象出來(甚至特定有些非數據庫),再加上你可以改變一時興起,而不是你的表結構的好處必須更改一行代碼。當然要記住要遵循這種設計思維,您需要創建一個EmployeeGet()和一個EmployeeUpdate()函數,並且這些函數有多個版本是正常的,例如:EmployeeGetByID()EmployeesGetByJobID()

語法,因爲它很重要,你去Data + Action +如果你爲你的整個數據庫編寫這些函數,如果你打電話給他們GetEmployeeByID(),那麼你將有幾十個SP列出來,所有的GET都在一起,這使得組織很差。

+0

但是這種邏輯不包含在Model/ActiveRecord/Mapper類/包中(取決於你是如何構圖你的應用程序的),所以你只會對這個單一的類/包進行更改 - 你將不得不無論如何改變,以實際上使用任何數據存儲在db(accessors/mutators/etc)這個列中? – prodigitalson 2009-12-17 20:33:26

+0

@prodigitalson:我沒有使用codeigniter,我沒有意識到他正在使用任何類型的MVC思維模式,我的錯誤。儘管如此,我還是將代碼從數據庫結構中分離出來的粉絲,因爲我曾在許多不斷髮展的應用程序中工作,但這是一個錯誤。 – TravisO 2009-12-17 20:56:04