2012-03-06 13 views
5

पुन: प्राप्त करने मैं एक पर्ल वस्तु (संदर्भ की सरणी के संदर्भ में) नीचे की तरह है:डीबी पर वस्तु भंडारण और यह

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

और डीबी पर संग्रहीत करना होगा तो इसे पुनः प्राप्त।

क्या कोई इसे संपीड़ित करने के लिए क्रमबद्ध करने के लिए एक अच्छा तंत्र सुझा सकता है और फिर इसे डीबी पर संग्रहीत कर सकता है? फिर इसे deserialize और कोड में इसका इस्तेमाल करें?

उत्तर

7

आप किसी भी ज्ञात धारावाहिकों का उपयोग कर सकते हैं, उदा। JSON::XS या StorableStorable बेहतर है यदि आप संदर्भों के रूप में संदर्भों को पुनर्प्राप्त करना चाहते हैं, न कि मूल्यों की प्रतियों के रूप में। फिर किसी भी प्रकार के क्षेत्र में एक धारावाहिक वस्तु को सहेजें (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

+0

क्या आप विधि 'nfreeze' आयात करते हैं? 'स्टेरियल क्यूड (एनफ्रीज़)' का उपयोग करें या विधि का एक पूर्ण निर्दिष्ट नाम लिखें: 'स्टेलेबल :: एनफ्रीज़ ($ डेटा) '। – Ali

+0

आप सही हैं धन्यवाद, मॉड्यूल क्या है जो gzip को डिकंप्रेस करता है? – smith

-1

मैंने कभी इसे स्वयं नहीं किया है, लेकिन परल्डोक का कहना है कि डेटा :: डम्पर का वापसी मूल्य मूल संदर्भ संरचना की एक समान प्रतिलिपि वापस पाने के लिए "निकाला जा सकता है"। फिर आप डम्पर आउटपुट को डेटाबेस में एक बड़े पर्याप्त टेक्स्ट फ़ील्ड में डाल सकते हैं।

+1

-1, यह एक एसक्यूएल इंजेक्शन हमले एक दूरस्थ कोड निष्पादन हमला करने के लिए आगे बढ़ाने के लिए अनुमति होगी। 'eval STRING' का उपयोग किसी भी डेटा के साथ बहुत सावधानी से किया जाना चाहिए जो' eval STRING' को कॉल करने वाले कार्यक्रम द्वारा पूरी तरह से जेनरेट नहीं किया गया है। –

-1

डेटा :: डूपर के बारे में क्या? आप ऑब्जेक्ट को डीबी के टेक्स्ट फ़ील्ड में डंप कर सकते हैं और फिर उसे वापस पाने के लिए सामग्री को eval कर सकते हैं।

+0

-1, यह एक एसक्यूएल इंजेक्शन हमले को दूरस्थ कोड निष्पादन हमले में बढ़ने की अनुमति देगा। 'eval STRING' का उपयोग किसी भी डेटा के साथ बहुत सावधानी से किया जाना चाहिए जो' eval STRING' को कॉल करने वाले कार्यक्रम द्वारा पूरी तरह से जेनरेट नहीं किया गया है। –

+0

हालांकि मैं इस बात से सहमत हूं कि आपको इसे ध्यान में रखना चाहिए, ओपी ने _where_ के बारे में कुछ भी नहीं कहा है, उसका डेटा उत्पन्न हुआ है। इसलिए मुझे डेटा :: डूपर को खाते में नहीं ले जाने का कोई कारण नहीं दिख रहा है। – fenton

+0

मेरी टिप्पणी यह ​​नहीं है कि डेटा कहां से * इच्छित * है, लेकिन यह कहां से * आ सकता है। [गहराई में रक्षा] का विचार (http://en.wikipedia.org/wiki/Defense_in_depth_%28computing%29) एक परत में छेद को अगले से समझौता करने से रोकने के लिए किसी एप्लिकेशन की प्रत्येक परत पर सुरक्षा के बारे में सक्रिय होना है परत। यदि आपने कभी भी अपने डेटाबेस से लौटाए गए किसी भी डेटा पर 'eval STRING' को कॉल किया है तो आपने अपने एप्लिकेशन में कोड निष्पादित करने के लिए अपना डेटाबेस पूर्ण पहुंच दिया है। आपके डेटाबेस का कोई भी उल्लंघन अब आपके पूरे एप्लिकेशन पर पूर्ण नियंत्रण रखता है। ** डेटा निष्पादित न करें! ** –

संबंधित मुद्दे