একক মাইএসকিএল ক্ষেত্রে ডেটার অ্যারের সংরক্ষণ করার ভাল উপায় কী?
এছাড়াও আমি একবার মাইএসকিএল টেবিলে সেই অ্যারের জন্য জিজ্ঞাসা করি, অ্যারে ফর্মটিতে ফিরে আসার একটি ভাল উপায় কী?
সিরিয়ালাইজ এবং উত্তর unserialize হয়?
উত্তর:
কোন ভাল নেইএকক ক্ষেত্রে একটি অ্যারে সঞ্চয় করার উপায় ।
আপনাকে আপনার সম্পর্কিত তথ্য পরীক্ষা করতে হবে এবং আপনার স্কিমাতে যথাযথ পরিবর্তন করতে হবে। এই পদ্ধতির রেফারেন্সের জন্য নীচে উদাহরণ দেখুন।
যদি আপনাকে অবশ্যই একটি একক ক্ষেত্রে অ্যারে সংরক্ষণ করতে হয় তবে serialize()এবং unserialize()ফাংশনগুলি কৌশলটি করবে। তবে আপনি প্রকৃত সামগ্রীতে কোয়েরি করতে পারবেন না।
ধারাবাহিকতাতে ফাংশন বিকল্প হিসেবে রয়েছে json_encode()এবং json_decode()।
নিম্নলিখিত অ্যারে বিবেচনা করুন
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
এটি ডাটাবেসে সংরক্ষণ করতে আপনার এই জাতীয় একটি টেবিল তৈরি করতে হবে
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
'DROP TABLE IF EXISTS test');
$r = mysql_query(
'CREATE TABLE test (
id INTEGER UNSIGNED NOT NULL,
a INTEGER UNSIGNED NOT NULL,
b INTEGER UNSIGNED NOT NULL,
c INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
)');
রেকর্ডগুলির সাথে কাজ করার জন্য আপনি এগুলির মতো প্রশ্নগুলি সম্পাদন করতে পারেন (এবং হ্যাঁ এটি একটি উদাহরণ, সাবধান!)
function getTest() {
$ret = array();
$c = connect();
$query = 'SELECT * FROM test';
$r = mysql_query($query,$c);
while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
$ret[array_shift($o)] = $o;
}
mysql_close($c);
return $ret;
}
function putTest($t) {
$c = connect();
foreach ($t as $k => $v) {
$query = "INSERT INTO test (id,".
implode(',',array_keys($v)).
") VALUES ($k,".
implode(',',$v).
")";
$r = mysql_query($query,$c);
}
mysql_close($c);
}
putTest($a);
$b = getTest();
connect()ফাংশন একটি MySQL সংযোগ রিসোর্স ফেরৎ
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
সাধারণত, হ্যাঁ, সিরিয়ালাইজ করা এবং আনসিরিয়ালাইজ করার উপায়।
আপনার ডেটা যদি কিছু সাধারণ হয় তবে কমা-বিস্মৃত স্ট্রিং হিসাবে সংরক্ষণ সম্ভবত সঞ্চয় স্থানের পক্ষে আরও ভাল। যদি আপনি জানেন যে আপনার অ্যারে কেবলমাত্র সংখ্যার একটি তালিকা হবে, উদাহরণস্বরূপ, তবে আপনার ইমপ্লোড / বিস্ফোরণ ব্যবহার করা উচিত। এটা তোলে পার্থক্য 1,2,3এবং a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}।
যদি তা না হয় তবে সিরিয়ালাইজ করুন এবং সব ক্ষেত্রেই কাজটি অপ্রচলিত করুন।
একটি ডিবিতে সঞ্চয় করার জন্য অ্যারে সিরিয়ালাইজ / আনসরিয়ালাইজ করুন
পরিদর্শন http://php.net/manual/en/function.serialize.php
পিএইচপি ম্যানুয়াল থেকে:
পৃষ্ঠায় "রিটার্ন" এর নীচে দেখুন
যে কোনও জায়গায় সংরক্ষণ করা যায় এমন মানের বাইট-স্ট্রিম উপস্থাপনাযুক্ত একটি স্ট্রিং ফিরিয়ে দেয়।
নোট করুন যে এটি একটি বাইনারি স্ট্রিং যা নাল বাইট অন্তর্ভুক্ত করতে পারে এবং এটি সংরক্ষণ এবং পরিচালনা করতে হবে। উদাহরণস্বরূপ, সিরিয়ালাইজ () আউটপুটটি সাধারণত কোনও CHAR বা পাঠ্য ক্ষেত্রের পরিবর্তে কোনও ডাটাবেজে একটি BLOB ক্ষেত্রে সংরক্ষণ করা উচিত।
দ্রষ্টব্য: আপনি যদি এইচটিএমএলকে একটি ব্লাবিতে সঞ্চয় করতে চান তবে এটি এনকোডটি বেস 64 করতে ভুলবেন না এটি ক্রমিক ক্রিয়াকলাপটি ভেঙে দিতে পারে।
এনকোডিংয়ের উদাহরণ:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData এখন অঙ্কুর মধ্যে সংরক্ষণ করা প্রস্তুত।
ব্লব থেকে ডেটা পাওয়ার পরে আপনার বেস 64_ ডিকোড করা দরকার এবং তারপরে উদাহরণস্বরূপ ডিকোডিংয়ের unserialize করা দরকার:
$theHTML = unserialize(base64_decode($YourSerializedData));
সবচেয়ে ভাল উপায়, যা আমি নিজের কাছে খুঁজে পেয়েছি তা হল পৃথককারী অক্ষরের সাথে ডেটা স্ট্রিং হিসাবে অ্যারে সংরক্ষণ করা
$array = array("value1", "value2", "value3", "...", "valuen");
$array_data = implode("array_separator", $array);
$query = "INSERT INTO my_tbl_name (id, array_data) VALUES(NULL,'" . $array_data . "');";
তারপরে আপনি সাধারণ ক্যোয়ারী সহ আপনার অ্যারেতে সঞ্চিত ডেটা অনুসন্ধান করতে পারেন
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
"অ্যারে_ডেটা" স্ট্রিংকে অ্যারেতে রূপান্তর করতে এক্সপ্লোড () ফাংশনটি ব্যবহার করুন
$array = explode("array_separator", $array_data);
নোট করুন যে এটি বহুমাত্রিক অ্যারেগুলির সাথে কাজ করছে না এবং নিশ্চিত হয়ে নিন যে আপনার "অ্যারে_স্যাপারেটর" অনন্য এবং অ্যারের মানগুলিতে উপস্থিত ছিল না।
সাবধান হও !!! যদি আপনি কেবল একটি ফর্ম ডেটা নেন এবং ডাটাবেসে রাখেন তবে আপনি ফাঁদে থাকবেন, তবে ফর্ম ডেটা এসকিউএল-নিরাপদ নয়! আপনাকে অবশ্যই আপনার ফর্মের মানটি mysql_real_escape_string এর সাথে পরিচালনা করতে হবে বা আপনি যদি MySQLi mysqli :: রিয়েল_সেস্কেপ_ স্ট্রিং ব্যবহার করেন বা যদি মানটি পূর্ণসংখ্যা বা বুলিয়ান কাস্ট (ইনট) (বুলিয়ান) হয় তবে
$number = (int)$_POST['number'];
$checked = (boolean) $_POST['checked'];
$name = mysql_real_escape_string($db_pt, $_POST['name']);
$email = mysqli_obj->real_escape_string($_POST['email']);
পূর্বে উল্লিখিত হিসাবে - যদি আপনাকে অ্যারের মধ্যে ডেটা অনুসন্ধানের প্রয়োজন না হয় তবে আপনি সিরিয়ালাইজ ব্যবহার করতে পারেন - তবে এটি "পিএইচপি কেবলমাত্র"। সুতরাং আমি json_decode / json_encode ব্যবহার করার পরামর্শ দেব - কেবল পারফরম্যান্সের জন্যই নয়, পাঠযোগ্যতা এবং বহনযোগ্যতার জন্যও (জাভাস্ক্রিপ্টের মতো অন্যান্য ভাষাও json_encoded ডেটা পরিচালনা করতে পারে)।
আহ, আমি জানি না কেন সবাই অ্যারে সিরিয়ালাইজ করার পরামর্শ দেয়।
আমি বলি, সর্বোত্তম উপায় হ'ল এটি আপনার ডেটাবেস স্কিমাতে আসলে ফিট করা fit আপনার অ্যারেতে ডেটাটির প্রকৃত অর্থ সম্পর্কে আমার কোনও ধারণা নেই (এবং আপনি কোনও ধারণা দেননি) তবে সাধারণত সিকোয়েন্সগুলি সংরক্ষণ করার দুটি উপায় রয়েছে
create table mydata (
id int not null auto_increment primary key,
field1 int not null,
field2 int not null,
...
fieldN int not null
)
এইভাবে আপনি একক সারিতে আপনার অ্যারে সঞ্চয় করছেন।
create table mydata (
id int not null auto_increment primary key,
...
)
create table myotherdata (
id int not null auto_increment primary key,
mydata_id int not null,
sequence int not null,
data int not null
)
প্রথম পদ্ধতির অসুবিধাটি হ'ল স্পষ্টতই, আপনার অ্যারেতে যদি অনেকগুলি আইটেম থাকে তবে সেই টেবিলের সাথে কাজ করা সবচেয়ে মার্জিত জিনিস হবে না। পরিবর্তনশীল দৈর্ঘ্যের ক্রমগুলির সাথে কাজ করার জন্য এটি অবৈজ্ঞানিক (সম্ভাব্য, তবে বেশ অকার্যকর - কেবল কলামগুলিও naclable করুন)।
দ্বিতীয় পদ্ধতির জন্য, আপনার যে কোনও দৈর্ঘ্যের ক্রম থাকতে পারে তবে কেবলমাত্র এক প্রকারের। আপনি অবশ্যই এটি এক ধরণের বারচর বা কিছু তৈরি করতে পারেন এবং আপনার অ্যারের আইটেমগুলিকে সিরিয়ালাইজ করতে পারেন। না করা সবচেয়ে ভাল জিনিস, তবে অবশ্যই আরও ভাল, পুরো অ্যারে সিরিয়ালাইজ করার চেয়ে, তাই না?
যেভাবেই হোক না কেন, এই পদ্ধতিগুলির যে কোনও একটি অনুক্রমের একটি স্বেচ্ছাসেবী উপাদান অ্যাক্সেস করতে সক্ষম হওয়ার স্পষ্ট সুবিধা পায় এবং আপনাকে অ্যারে এবং এর মতো কুরুচিপূর্ণ জিনিসগুলি সিরিয়ালাইজ করার বিষয়ে চিন্তা করতে হবে না।
এটি ফিরে পেতে হিসাবে। ভাল, একটি ক্যোয়ারির সাথে সারিগুলির যথাযথ সারি / সিকোয়েন্স পান এবং, ভাল, একটি লুপ ব্যবহার করুন .. তাই না?
আপনি একটি জসন হিসাবে আপনার অ্যারে সংরক্ষণ করতে পারেন।
জসন ডেটা টাইপের জন্য ডকুমেন্টেশন রয়েছে: https://dev.mysql.com/doc/refman/5.7/en/json.html
আমার মনে হয় এটিই সেরা সমাধান, এবং পাগল ফাংশন এড়িয়ে আপনার কোডটি আরও পঠনযোগ্য আপনাকে বজায় রাখতে সহায়তা করবে ।
আমি আশা করি এটি আপনার জন্য সহায়ক।
হ্যাঁ, সিরিয়ালাইজ / আনসিরিয়ালাইজ করা হ'ল আমি অনেকগুলি মুক্ত উত্স প্রকল্পে সর্বাধিক দেখেছি।
আমি ইমপ্লোড / বিস্ফোরণটি এমন একটি চরিত্রের সাথে ব্যবহার করার পরামর্শ দেব যা আপনি জানেন যে কোনও স্বতন্ত্র অ্যারে আইটেমের মধ্যে নেই। তারপরে এটি স্ট্রিং হিসাবে এসকিউএল এ সঞ্চয় করুন।
ইমপ্লোড ফাংশনটি পরীক্ষা করে দেখুন যেহেতু মানগুলি একটি অ্যারেতে থাকে তাই আপনি অ্যারের মানগুলি একটি মাইএসকিএল ক্যোয়ারিতে রাখতে চান যা মানগুলি একটি সারণীতে সন্নিবেশ করায়।
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
অ্যারের মানগুলি যদি পাঠ্য মান হয় তবে আপনাকে উদ্ধৃতি যুক্ত করতে হবে
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";
mysql_query($query);
এছাড়াও, আপনি যদি সদৃশ মান চান না, "আইএনটিও" "আইজিনোর" এ স্যুইচ করুন এবং কেবল অনন্য মানগুলি সারণিতে সন্নিবেশ করা হবে।
উদাহরণস্বরূপ, আপনি mysql তে সিরিয়ালযুক্ত বস্তু (অ্যারে) সন্নিবেশ করতে পারেন serialize($object)এবং আপনি বস্তুর উদাহরণটি আনসরিজ করতে পারেনunserialize($object)
এটি ডাটাবেসে সংরক্ষণ করার পরিবর্তে এটি কোনও ফাইলে সংরক্ষণ করুন এবং পরে এটি কল করুন।
অনেকগুলি পিএইচপি অ্যাপ্লিকেশনগুলি (চিনির ক্রমের মতো) কী করে কেবল একটি ফাইলটিতে অ্যারের সমস্ত ডেটা প্রতিধ্বনিত করতে var_export ব্যবহার করা। আমি আমার কনফিগারেশন ডেটা সংরক্ষণ করতে এটি ব্যবহার করি:
private function saveConfig() {
file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');
}
আমি মনে করি এটি আপনার ডেটা সংরক্ষণের আরও ভাল উপায়!