2010-05-13 52 views
11

是否可以在數據庫中插入Object? (在PHP訪談中提問)是否可以在數據庫中插入對象?

+16

這是面試官問的完整問題嗎?我已經把這個問題解決爲「不是真正的問題 - 太模糊」:) – 2010-05-13 12:55:33

+2

是的,他問我什麼:(我問他給細節,(記住我說我必須問這個在stackoverflow,並且 – 2010-05-13 12:57:57

回答

17

是的,有可能,使用serialize()

但是答案巨大取決於上下文。

+0

是的,他問我關於序列化的下一個問題,我不知道多少... – 2010-05-13 12:58:57

+0

感謝Pekka糾正我。 – 2010-05-13 13:03:10

6

如果您在談論PHP對象,則無法將對象插入到數據庫中。要將其存儲到數據庫中,首先需要序列化並在使用時將其序列化。

+0

感謝夥伴的詳細信息 – 2010-05-13 13:00:44

5

這個問題是非常模糊和未定義的。我的意思是,一方面,您可以序列化一個對象並將其插入到數據庫中。但是,「插入對象」取決於上下文。例如,他指的事實,你可以調用像一個SQL語句:

$a = new object(); 

// This makes no sense. 
$sql = "Insert into table_name values($a);"; 

如果這是他的要求,那麼答案是不,你不能這樣做,除非你重寫了__toString()方法它返回要插入數據庫的值。即使那樣,這個類也沒有很好的定義,因爲你在說__toString()將是一個數據庫值,但是如果沒有引用類對象本身,它就沒有明確的定義或暗示。

在任何情況下,如果Object代表數據庫表等等,那麼您希望根據職責分離每個項目。例如,您可以擁有定義數據庫表的對象A,然後擁有一個「管理員」對象B,用於插入,更新,刪除和從數據庫中選擇項目。例如:

// NOT REAL PHP CODE.... 
class Table_Name 
{ 
    // Define primary keys, foreign keys, and attributes of the table. 
    private $column1; 
    public function setColumn1($value); 
    public function getCOlumn1(); 
} 

class Table_Name_Manager 
{ 
    public function insert(Table_Name $obj); 
    public function delete(Table_Name $obj); 
    public function select(Table_Name $obj); 
} 

上面對我最有意義,因爲它清楚地定義了您所期望的行爲。您可以簡單地使用管理器從數據庫獲取項目,然後修改對象,然後再次調用管理器並插入,更新或刪除。

+0

佳能與飛 – 2010-05-13 18:21:23

1

簡短的回答:不,這是不可能的

龍答:使用您不能直接插入的對象,你必須保存之前對其進行序列化,例如內置serialize()功能或一些自定義XML序列化。那麼你可以把它放在一些TEXTBLOB列。

正確答案:要將對象放入數據庫,使用一些ORM(對象關係映射)工具。大多數MVC框架都內置了ORM,最常用的是Active Record模式。

1

也可以是一個明智的屁股:

你:「你可以從內存中,並移植到Java或.NET採取PHP對象,然後使用Versant對象數據庫來存儲對象「。

+0

只有一個明智的 - 如果你認爲自己可以負擔得起;)。哦,只有向下投票,如果你關心評論.. – Ropstah 2010-05-13 23:20:19

+0

aw,不要意味着,upvoted的樂趣;) – dmp 2010-05-15 15:36:12

3

是的,你可以,你只需要序列化成適當的格式。 這樣一個開放式問題的整個意義在於找到一種被問及的方式。

+2

+1,我認爲這是一個相當不錯的面試問題實際上。 – 2010-05-13 14:57:03

+0

這絕對正確@mhughes,因爲他們正在採訪不清除他們的懷疑 – 2010-05-14 05:11:13

11

沒有人建議OR映射器?有趣......

如果你創建數據庫表,讓他們代表的對象,你可以使用一個對象關係映射到你的對象成員的值保存到數據庫

爲PHP存在propel和許多其他

+4

+1的ORM。我通常會爲此使用Doctrine。 – selfawaresoup 2010-05-15 15:28:36

+0

+1看起來很有趣 – dmp 2010-05-15 15:35:46

3

應當注意的是,存儲序列化對象到關係數據庫的矛盾幾乎所有的數據庫規範化規則,可以被認爲是非常不好的做法。

要將對象存儲在數據庫中,您應該使用對象關係映射器(如Doctrine或Propel)。

序列化對象可以存儲在文件系統中。沒關係。

相關問題