2012-03-06 64 views
5

我有像下面一個perl對象(參照引用的數組):存儲在DB對象和檢索它

my $a = [ [$a, $ab, $c ], [$a, $b, $c] ] ; 

並需要將其存儲在DB然後檢索它。

有人可能會建議一個好的機制來序列化甚至壓縮它,然後將其存儲在數據庫上?然後反序列化並在代碼中使用它?

回答

7

您可以使用任何已知的序列化器,例如, JSON::XSStorableStorable更好,如果你想檢索引用作爲參考,而不是作爲值的副本。然後將序列化對象保存在滿足存儲要求的任何類型(VARCHAR,BLOB,...)的字段中。

use Storable qw(nfreeze thaw); 
use DBI; 

# ... connect to database 
# Store 
my $data = [ [$a, $b, $c ], [ $a, $b, $c ] ]; 
my $bytestream = nfreeze $data; 
$dbh->do('insert into table (field) values(?)', undef, $bytestream); 

# Retrieve 
$bytestream = $dbh->selectrow_array('select field from table where ...'); 
$data = thaw $bytestream; 

此外,還可以壓縮$bytestream,例如,通過IO::Compress::Gzip

my $bytestream = gzip nfreeze $data; 
+0

我試過了,但我得到了下面的錯誤:不能調用方法「nfreeze」在未參考的參考 – smith 2012-03-06 10:51:49

+0

你是否導入方法'nfreeze'? 請'使用可存儲的qw(nfreeze)'或寫一個完整的方法名稱:'Storable :: nfreeze($ data)'。 – Ali 2012-03-06 11:13:10

+0

你是對的,謝謝,還有什麼解壓gzip的模塊? – smith 2012-03-06 11:38:21

-1

我從來沒有嘗試過它,但是perldoc表示Data :: Dumper的返回值可以被「取消以獲取原始參考結構的相同副本」。然後,您可以將Dumper輸出放入數據庫中足夠大的文本字段中。

+1

-1,這將允許SQL注入攻擊升級爲遠程代碼執行攻擊。 'eval STRING'應該非常小心地使用任何不是由調用'eval STRING'的程序完全生成的數據。 – 2012-03-06 19:12:11

-1

Data :: Dumper怎麼樣? 您可以將對象轉儲到數據庫的TEXT字段中,然後評估內容以將其取回。

+0

-1,這將允許SQL注入攻擊升級到遠程代碼執行攻擊。 'eval STRING'應該非常小心地使用任何不是由調用'eval STRING'的程序完全生成的數據。 – 2012-03-06 19:11:24

+0

雖然我同意你應該記住這一點,但OP並沒有說他的數據是從哪裏生成的。所以我看不出有任何理由不考慮Data :: Dumper。 – fenton 2012-03-09 10:16:09

+0

我的評論不是數據來自哪裏,而是來自哪裏。 [深度防禦](http://en.wikipedia.org/wiki/Defense_in_depth_%28computing%29)的想法是積極應對應用程序每一層的安全問題,以防止一層漏洞影響下一層的安全層。如果你曾經從你的數據庫返回的任何數據上調用'eval STRING',那麼你已經賦予你的數據庫完全訪問權限來執行你的應用程序中的代碼。現在任何違反數據庫的行爲都可以完全控制整個應用程序。 **不要執行數據!** – 2012-03-09 16:46:36