ذخیره آرایه با php در پایگاه داده
پایگاهدادههای رابطهای به صورت عمومی امکان ذخیرهسازی دادههای چند بعدی را ندارند و برای ذخیرهسازی این اطلاعات میبایست از ردیفهای متعدد یک یا چند جدول استفاده شود. ولی همیشه این روش برای ما مناسب نیست و ممکن است بخواهیم اطلاعات یک آرایهی دو یا یا چندبعدی را در یک سلول ذخیره کنیم.
انجام این کار به صورت سنتی با استفاده از Serialization امکانپذیر است.
Serialization چیست ؟
تبدیل دادههای ساختیافته مثل آرایهها یا اشیاء به یک رشته را Serialization مینامیم. برای انجام این کار روشها و ابزارهای متعددی وجود دارد. زبان php برای انجام این کار سه ابزار عمده در اختیار ما قرار میدهد:
- تابع serialize که مخصوص به زبان php است.
- تابع json_encode که خروجی JSON و قابل پردازش توسط عمدهی زبانهای برنامهنویسی ایجاد میکند.
- تبدیل دادهها به XML که بسته به دستورات و افزونههای استفاده شده میتواند ساده یا پیچیده باشد.
در این نوشته به دو روش اول که کاربرد بیشتری دارد و سادهتر است میپردازیم.
استفاده از تابع serialize
این تابع مخصوص به زبان php است و اطلاعات چندبعدی شامل آرایهها و اشیاء مختلف را به رشتههای قابل ذخیره در پایگاه داده تبدیل میکند. استفاده از این روش البته معایبی نیز به همراه دارد. مهمترین اشکال استفاده از این تابع، عدم پشتیبانی زبانهای برنامهنویسی دیگر و سیستمهای پایگاه داده از پردازش این اطلاعات است. برای مثال اگر نیاز باشد تا به طور مستقیم، دادهها را جستجو یا تغییر دهیم، با مشکلات زیادی روبرو خواهیم شد.
سادهترین مثال استفاده از این روش به صورت زیر است:
1 2 3 4 5 6 7 8 |
<?php $my_array = [ 'apple', 'banana', 'orange', ]; $serialized_data = serialize( $my_array ); echo $serialized_data; |
نمونه کد بالا یک آرایهی تک بعدی را به یک رشتهی قابل ذخیرهسازی در پایگاه داده تبدیل میکند. لازم به ذکر است که ذخیرهسازی اطلاعات با حجم زیاد به صورت رشته در پایگاه داده خود میتواند باعث مشکلاتی شود.
خروجی مثال بالا به صورت زیر است:
1 |
a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:2;s:6:"orange";} |
برای تبدیل مجدد این رشته به آرایه به شکل زیر عمل میکنیم:
1 2 3 4 |
<?php $serialized_data = 'a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:2;s:6:"orange";}'; $my_array = unserialize( $serialized_data ); |
تبدیل آرایهها به این صورت، مشکلی به دنبال ندارد ولی برخی از اشیاء که دادههای خارجی را نگهداری میکنند یا پر کردن اعضای آنها به دستورالعملهای خاصی نیازمند است، میتواند با چالشهایی همراه باشد.
همچنین فراخوانی این تابع روی اطلاعاتی که از بیرون به اسکریپت ارسال شدهاند میتواند خطرات امنیتی به دنبال داشته باشد، چون امکان اجرای کدهای php در هنگام ساخت مجدد کلاس بر اساس اطلاعات ناایمن وجود دارد.
استفاده از توابع JSON
توابع JSON در اغلب زبانهای برنامهنویسی قابل استفاده هستند. همچنین سیستمهای پایگاه داده مثل MySQL دستوراتی برای کنترل بیشتر روی سلولهای رشتههای حاوی JSON در اختیار شما قرار میدهند. به طور کلی استفاده از JSON به روشهای دیگر برتری دارد مگر زمانی که موانع فنی یا دلیل خاصی برای استفاده از روشهای دیگر داشته باشیم.
یک مثال ساده برای استفاده از JSON:
1 2 3 4 5 6 7 8 |
<?php $my_array = [ 'apple', 'banana', 'orange', ]; $json_data = json_encode( $my_array, JSON_UNESCAPED_UNICODE ); $array_from_json = json_decode( $json_data ); |
استفادهی بهینه از توابع JSON و تنظیمات قابل ارسال به هر یک از توابع ورودی و خروجی نیز میتواند به بررسیهای بیشتر وابسته باشد. برای مثال چون در این مثال قصد دارید، اطلاعات را در پایگاه داده ذخیره کنیم که از حروف یونیکد پشتیبانی میکند، برای کاهش حجم کدهای JSON از پارامتر «JSON_UNESCAPED_UNICODE» استفاده کردیم. این پارامتر باعث میشود تا حروف یونیکد به کدهای عددی تبدیل نشوند که هر یک چند برابر حروف عادی فضا اشغال میکنند. اگر هدف ذخیرهسازی یا ارسال این اطلاعات در محلی باشد که از حروف یونیکد پشتیبانی نمیکند، تنظیمات دیگری مورد نیاز خواهد بود.