মাইএসকিউএল এ পিএইচপি অ্যারে সংরক্ষণ করবেন?


88

একক মাইএসকিএল ক্ষেত্রে ডেটার অ্যারের সংরক্ষণ করার ভাল উপায় কী?

এছাড়াও আমি একবার মাইএসকিএল টেবিলে সেই অ্যারের জন্য জিজ্ঞাসা করি, অ্যারে ফর্মটিতে ফিরে আসার একটি ভাল উপায় কী?

সিরিয়ালাইজ এবং উত্তর unserialize হয়?

উত্তর:


88

কোন ভাল নেইএকক ক্ষেত্রে একটি অ্যারে সঞ্চয় করার উপায় ।

আপনাকে আপনার সম্পর্কিত তথ্য পরীক্ষা করতে হবে এবং আপনার স্কিমাতে যথাযথ পরিবর্তন করতে হবে। এই পদ্ধতির রেফারেন্সের জন্য নীচে উদাহরণ দেখুন।

যদি আপনাকে অবশ্যই একটি একক ক্ষেত্রে অ্যারে সংরক্ষণ করতে হয় তবে 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;
}

26

সাধারণত, হ্যাঁ, সিরিয়ালাইজ করা এবং আনসিরিয়ালাইজ করার উপায়।

আপনার ডেটা যদি কিছু সাধারণ হয় তবে কমা-বিস্মৃত স্ট্রিং হিসাবে সংরক্ষণ সম্ভবত সঞ্চয় স্থানের পক্ষে আরও ভাল। যদি আপনি জানেন যে আপনার অ্যারে কেবলমাত্র সংখ্যার একটি তালিকা হবে, উদাহরণস্বরূপ, তবে আপনার ইমপ্লোড / বিস্ফোরণ ব্যবহার করা উচিত। এটা তোলে পার্থক্য 1,2,3এবং a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}

যদি তা না হয় তবে সিরিয়ালাইজ করুন এবং সব ক্ষেত্রেই কাজটি অপ্রচলিত করুন।


24
আপনি যেহেতু এখানে আছেন, পাঠক, আমি ঘোষণা করার জন্য সময় নিতে যাচ্ছি যে আমি বহু বছরের অভিজ্ঞতার মধ্য দিয়ে আবিষ্কার করেছি যে এটি সত্যিই যাওয়ার উপায় নয়। গৃহীত উত্তরটি অনেক বেশি শক্তিশালী is
ম্যাচু

4
আপনি এখানে আছেন, পাঠক আমি আপনার সাথে ভাগ করতে যাচ্ছি যে এটি কেবল আপনার প্রয়োজনীয়তার উপর নির্ভর করে। যদি আপনার অ্যারে মানগুলির দ্বারা আপনার জিজ্ঞাসা করার প্রয়োজন না হয় এবং খুব দ্রুত কিছু দরকার হয় তবে আপনি নিরাপদে আপনার ডেটাটি একক ক্ষেত্রে সংরক্ষণ করতে পারেন (যা প্রশ্নটি স্পষ্টভাবে বলেছে), এটিতে একটি প্রাথমিক কী চাপুন এবং চলে যাবেন off । আপনি যদি আশ্চর্য হন তবে অ্যাপ্লিকেশনটি কী: প্রতি 5 মিনিটে ক্রোন হয়ে যাওয়া এমন একটি কাতারে ডেটা চাপানো। অন্য ক্রোন অ্যারে তৈরি করে যা আরও বেশি সময় নেয়। কুই গণিত ডেটা নিয়ে আসে এবং এটি একটি তৃতীয় পক্ষের API এ প্রেরণ করে। এটি করার আরও ভাল উপায়।
ইলকুলাস

4
@ রিডিক্লাসিয়াস আমি বিভ্রান্ত হয়ে পড়েছি, আপনি কি নিজের ব্যক্তিগত অ্যাপ্লিকেশন বা অ্যাপ্লিকেশন সম্পর্কে কথা বলছেন যার ফলে প্রশ্ন জিজ্ঞাসা করা হয়েছিল?
পিটার লিন্ডকভিস্ট

4
যদিও এটি আমার বিবৃতিটির উপরিভাগের সাথে অপ্রাসঙ্গিক, "যদি আপনি আশ্চর্য হন তবে অ্যাপ্লিকেশনটি কী" এই বিষয়টি পরিষ্কার হওয়া উচিত।
মুক্তি আইকুলাস

10

কেবল সিরিয়ালাইজ পিএইচপি ফাংশনটি ব্যবহার করুন:

<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>

তবে আপনি যদি সরল অ্যারে ব্যবহার করেন তবে আপনি এমপ্লোড এবং বিস্ফোরণও ব্যবহার করতে পারেন new নতুনের পরিবর্তে ফাঁকা অ্যারে ব্যবহার করুন।


9

একটি ডিবিতে সঞ্চয় করার জন্য অ্যারে সিরিয়ালাইজ / আনসরিয়ালাইজ করুন

পরিদর্শন http://php.net/manual/en/function.serialize.php

পিএইচপি ম্যানুয়াল থেকে:

পৃষ্ঠায় "রিটার্ন" এর নীচে দেখুন

যে কোনও জায়গায় সংরক্ষণ করা যায় এমন মানের বাইট-স্ট্রিম উপস্থাপনাযুক্ত একটি স্ট্রিং ফিরিয়ে দেয়।

নোট করুন যে এটি একটি বাইনারি স্ট্রিং যা নাল বাইট অন্তর্ভুক্ত করতে পারে এবং এটি সংরক্ষণ এবং পরিচালনা করতে হবে। উদাহরণস্বরূপ, সিরিয়ালাইজ () আউটপুটটি সাধারণত কোনও CHAR বা পাঠ্য ক্ষেত্রের পরিবর্তে কোনও ডাটাবেজে একটি BLOB ক্ষেত্রে সংরক্ষণ করা উচিত।

দ্রষ্টব্য: আপনি যদি এইচটিএমএলকে একটি ব্লাবিতে সঞ্চয় করতে চান তবে এটি এনকোডটি বেস 64 করতে ভুলবেন না এটি ক্রমিক ক্রিয়াকলাপটি ভেঙে দিতে পারে।

এনকোডিংয়ের উদাহরণ:

$YourSerializedData = base64_encode(serialize($theHTML));

$YourSerializedData এখন অঙ্কুর মধ্যে সংরক্ষণ করা প্রস্তুত।

ব্লব থেকে ডেটা পাওয়ার পরে আপনার বেস 64_ ডিকোড করা দরকার এবং তারপরে উদাহরণস্বরূপ ডিকোডিংয়ের unserialize করা দরকার:

$theHTML = unserialize(base64_decode($YourSerializedData));

8

সবচেয়ে ভাল উপায়, যা আমি নিজের কাছে খুঁজে পেয়েছি তা হল পৃথককারী অক্ষরের সাথে ডেটা স্ট্রিং হিসাবে অ্যারে সংরক্ষণ করা

$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']);

আমার ক্ষেত্রে, আমার ধারণা এটি আমার পক্ষে সেরা বিকল্প option
ইমতিয়াজ

6

সিরিয়ালাইজ এবং আনসিরিয়ালাইজ করা তার পক্ষে বেশ সাধারণ। আপনি কম পিএইচপি-নির্দিষ্ট ফর্ম্যাটের জন্য json_encode এবং json_decode এর মাধ্যমে JSON ব্যবহার করতে পারেন।


5

পূর্বে উল্লিখিত হিসাবে - যদি আপনাকে অ্যারের মধ্যে ডেটা অনুসন্ধানের প্রয়োজন না হয় তবে আপনি সিরিয়ালাইজ ব্যবহার করতে পারেন - তবে এটি "পিএইচপি কেবলমাত্র"। সুতরাং আমি json_decode / json_encode ব্যবহার করার পরামর্শ দেব - কেবল পারফরম্যান্সের জন্যই নয়, পাঠযোগ্যতা এবং বহনযোগ্যতার জন্যও (জাভাস্ক্রিপ্টের মতো অন্যান্য ভাষাও json_encoded ডেটা পরিচালনা করতে পারে)।


3

আহ, আমি জানি না কেন সবাই অ্যারে সিরিয়ালাইজ করার পরামর্শ দেয়।

আমি বলি, সর্বোত্তম উপায় হ'ল এটি আপনার ডেটাবেস স্কিমাতে আসলে ফিট করা 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 করুন)।

দ্বিতীয় পদ্ধতির জন্য, আপনার যে কোনও দৈর্ঘ্যের ক্রম থাকতে পারে তবে কেবলমাত্র এক প্রকারের। আপনি অবশ্যই এটি এক ধরণের বারচর বা কিছু তৈরি করতে পারেন এবং আপনার অ্যারের আইটেমগুলিকে সিরিয়ালাইজ করতে পারেন। না করা সবচেয়ে ভাল জিনিস, তবে অবশ্যই আরও ভাল, পুরো অ্যারে সিরিয়ালাইজ করার চেয়ে, তাই না?

যেভাবেই হোক না কেন, এই পদ্ধতিগুলির যে কোনও একটি অনুক্রমের একটি স্বেচ্ছাসেবী উপাদান অ্যাক্সেস করতে সক্ষম হওয়ার স্পষ্ট সুবিধা পায় এবং আপনাকে অ্যারে এবং এর মতো কুরুচিপূর্ণ জিনিসগুলি সিরিয়ালাইজ করার বিষয়ে চিন্তা করতে হবে না।

এটি ফিরে পেতে হিসাবে। ভাল, একটি ক্যোয়ারির সাথে সারিগুলির যথাযথ সারি / সিকোয়েন্স পান এবং, ভাল, একটি লুপ ব্যবহার করুন .. তাই না?


কখনও কখনও একটি অ্যারে সত্যিই উপযুক্ত। আপনি যদি কেবলমাত্র প্রথম অবজেক্টের একটি বৈশিষ্ট্য হিসাবে এটি অ্যাক্সেস করতে চলেছেন তবে তা বোঝা যায়।
ম্যাচু

4
আমাকে অত্যন্ত তীব্র শর্তের সাথে একমত হতে হবে - আমার কাছে এলোমেলো সংরক্ষণের জন্য অনুচিত বলে মনে হচ্ছে, রিস্ট্রাকশনাল (অস্ট্রাস্ট্রাক্টর) (পিএইচপি "অ্যারে" আসলে অ্যারে নয়, ডান?), রিলেশনাল ডেটাবেজে ডেটা-র টাইপ করা ব্লবগুলি । আপনি যেভাবেই বিভাজকের জন্য কী ব্যবহার করতে যাচ্ছেন, যদি আপনার অ্যারেতে কোনও স্ট্রিং থাকতে পারে? এটি কেবল বিভিন্ন উপায়ে সমস্যার জন্য জিজ্ঞাসা করছে। 99,9% ক্ষেত্রে, আরও একটি প্রাকৃতিক উপায় রয়েছে। আমি এখানে একটি বন্য অনুমান করব এবং পরামর্শ দেব, যে প্রশ্নকারীর কেস বাকি 0.1% এর মধ্যে না পড়ে।
শাইলেন্ট

4
আসলে, কখনও কখনও এটি একটি ডিবিতে একটি ক্ষেত্রের মধ্যে অ্যারে সংরক্ষণ করা খুব উপযুক্ত। উদাহরণ হ'ল কোনও বৈশ্বিক 'ভেরিয়েবল' টেবিলের মতো মেটাডেটা হবে যাতে কোনও সিস্টেম প্লাগইন এবং মডিউলগুলি তাদের সাজানো সেটিংস সঞ্চয় করতে পারে। একটি সারণী যা স্বেচ্ছাসেবী 'সেশন' ডেটা সঞ্চয় করে এমন ক্ষেত্রটি ব্যবহার করে সেরা কী প্রয়োগ করা যেতে পারে যা কী / মানগুলির একটি সহযোগী অ্যারে ধারণ করে। সিরিয়ালাইজ এবং আনসিরিয়ালাইজ (যা সঠিক উত্তর) পৃথককারীদের যত্ন নিন। ওয়ার্ডপ্রেস বা দ্রুপালের মতো কয়েকটি সফল ও জনপ্রিয় ওপেন সোর্স প্রকল্পগুলির কয়েকটি পরীক্ষা করুন - এবং আপনি দেখতে পাবেন যে অ্যারেগুলি কখনও কখনও এটির মতো ডিবিতে সঞ্চিত থাকে
স্কট এভারেন্ডেন

@ স্কট এভারেন্ডেন: আমি অনুমান করি আপনি ঠিক আছেন তো? পিএইচপি আমার "প্রধান" ভাষা নয়, তাই আমি ডাটাবেস ডিজাইনের দৃষ্টিকোণ থেকে সমাধানটি বিচার করছিলাম। আপনি যা বর্ণনা করেছেন তা যদি সত্যিই এই জাতীয় জিনিসগুলি করার (পিএইচপি তে) সাধারণ উপায় হয় তবে তা হয়ে উঠুন। যদিও আমাকে এটির মতো করে
তোলে

4
কোনও ডিবিতে একটি ক্ষেত্রের মধ্যে অ্যারে সংরক্ষণ করা কখনও উপযুক্ত নয়। এটি চতুর্থ স্বাভাবিক ফর্ম, তৃতীয় সাধারণ ফর্ম বা এমনকি দ্বিতীয় সাধারণ ফর্মের লঙ্ঘন নয়: এটি প্রথম সাধারণ ফর্মের একটি বিভক্তি। আপনি যদি প্রথম সাধারণ ফর্মটি মেনে চলতে না পারেন তবে আপনার আবেদনের সাথে মারাত্মক কিছু ভুল রয়েছে। এটি ড্রুপাল এবং ওয়ার্ডপ্রেসের জন্য যায়; যদি তারা এটি করে তবে এটি অবশ্যই তা নয় কারণ তাদের অ্যাপগুলির দিকটি ভালভাবে ডিজাইন করা হয়েছে .. আমার শেষ কাজটিতে আমার এই যুক্তি ছিল এবং এক্সকার্ট এই বকাবকি করছিল কারণ এটি এমন কিছু তৈরি করেছিল যা সম্ভব হওয়া উচিত ছিল, পরিবর্তে অত্যন্ত কঠিন।
অক্সিজেন

2

আপনি একটি জসন হিসাবে আপনার অ্যারে সংরক্ষণ করতে পারেন।
জসন ডেটা টাইপের জন্য ডকুমেন্টেশন রয়েছে: https://dev.mysql.com/doc/refman/5.7/en/json.html
আমার মনে হয় এটিই সেরা সমাধান, এবং পাগল ফাংশন এড়িয়ে আপনার কোডটি আরও পঠনযোগ্য আপনাকে বজায় রাখতে সহায়তা করবে ।
আমি আশা করি এটি আপনার জন্য সহায়ক।


0

হ্যাঁ, সিরিয়ালাইজ / আনসিরিয়ালাইজ করা হ'ল আমি অনেকগুলি মুক্ত উত্স প্রকল্পে সর্বাধিক দেখেছি।


0

আমি ইমপ্লোড / বিস্ফোরণটি এমন একটি চরিত্রের সাথে ব্যবহার করার পরামর্শ দেব যা আপনি জানেন যে কোনও স্বতন্ত্র অ্যারে আইটেমের মধ্যে নেই। তারপরে এটি স্ট্রিং হিসাবে এসকিউএল এ সঞ্চয় করুন।


4
এই প্রশ্নটি 3 বছর আগে জিজ্ঞাসা করা হয়েছিল এবং এর একটি স্বীকৃত উত্তর রয়েছে। নতুন প্রশ্ন বা উত্তর ছাড়াই উত্তর দেওয়া আপনার পক্ষে আরও সহায়ক বলে মনে হতে পারে।
এমড্রোললেট

0

ইমপ্লোড ফাংশনটি পরীক্ষা করে দেখুন যেহেতু মানগুলি একটি অ্যারেতে থাকে তাই আপনি অ্যারের মানগুলি একটি মাইএসকিএল ক্যোয়ারিতে রাখতে চান যা মানগুলি একটি সারণীতে সন্নিবেশ করায়।

$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";

অ্যারের মানগুলি যদি পাঠ্য মান হয় তবে আপনাকে উদ্ধৃতি যুক্ত করতে হবে

$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";

mysql_query($query);

এছাড়াও, আপনি যদি সদৃশ মান চান না, "আইএনটিও" "আইজিনোর" এ স্যুইচ করুন এবং কেবল অনন্য মানগুলি সারণিতে সন্নিবেশ করা হবে।


আপনার যদি প্রাথমিক কী থাকে তবে আপনি যেভাবেই INSERT INTO এর সাথে কোনও নকল পাবেন না। আপনার কাছে যদি প্রাথমিক কী বা সূচক না থাকে তবে আইজিএনওর কোনও তাত্পর্য রাখে না।
পিটার লিন্ডকভিস্ট

0

উদাহরণস্বরূপ, আপনি mysql তে সিরিয়ালযুক্ত বস্তু (অ্যারে) সন্নিবেশ করতে পারেন serialize($object)এবং আপনি বস্তুর উদাহরণটি আনসরিজ করতে পারেনunserialize($object)


-5

এটি ডাটাবেসে সংরক্ষণ করার পরিবর্তে এটি কোনও ফাইলে সংরক্ষণ করুন এবং পরে এটি কল করুন।

অনেকগুলি পিএইচপি অ্যাপ্লিকেশনগুলি (চিনির ক্রমের মতো) কী করে কেবল একটি ফাইলটিতে অ্যারের সমস্ত ডেটা প্রতিধ্বনিত করতে var_export ব্যবহার করা। আমি আমার কনফিগারেশন ডেটা সংরক্ষণ করতে এটি ব্যবহার করি:

private function saveConfig() {
    file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');        
}

আমি মনে করি এটি আপনার ডেটা সংরক্ষণের আরও ভাল উপায়!


এটি অন্য উপায়, অগত্যা আরও ভাল নয়।
পিটার লিন্ডকভিস্ট

প্রকৃতপক্ষে. আমি কেবল মনে করি অ্যারে ডেটা পুনরুদ্ধার করতে এবং তারপরে অ্যারে শুরু করার জন্য ডাটাবেসটি অনুসন্ধান করার চেয়ে ফাইল অ্যাক্সেস করা অনেক সহজ much এইভাবে আপনি কেবল ফাইলটি অন্তর্ভুক্ত করুন এবং এটি সম্পন্ন হয়েছে।
আন্তোনিওসিএস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.