সর্বশেষ সম্পাদনা করেছেন জেলাল (০৩-১২-২০১০ ০৩:১২)

টপিকঃ Testing03 auto_increment topic ID upon both submission and discarding

জাস্ট টেস্টিং ............ ০৩

মডারেটর, প্লীজ ডিলিট ইট এ্যাট ইওর আরলিয়েস্ট কনভেনিয়েন্স (ইফ ইট শুড বি ডিলিটেড)।

"খেলাঘর" ব্যবহার সংক্রান্ত নিয়ম ভেঙ্গে থাকলে আন্তরিকভাবে দুঃখিত।

Re: Testing03 auto_increment topic ID upon both submission and discarding

অটো ইনক্রিমেন্ট আবার টেস্ট করা লাগে নাকি?
আমি তো এটা দেখেই প্রজন্মের স্ট্যাটিস্টিক্স বলি।

Feed থেকে ফোরাম সিগনেচার, imgsign.com
ব্লগ: shiplu.mokadd.im
মুখে তুলে কেউ খাইয়ে দেবে না। নিজের হাতেই সেটা করতে হবে।

শিপলু'এর ওয়েবসাইট

লেখাটি GPL v3 এর অধীনে প্রকাশিত

সর্বশেষ সম্পাদনা করেছেন জেলাল (০৩-১২-২০১০ ১১:৩৪)

Re: Testing03 auto_increment topic ID upon both submission and discarding

না, আসলে সে জন্য না।

আমি নতুন পিএইচপি শিখছিতো। তো, নিজে নিজে শিখতে গিয়ে প্র্যাকটিস হিসেবে পিএইচপি দিয়ে একটা খুব সাধারণ গেস্টবুক কাম ফোরাম বানানোর চিন্তা মাথায় আসলো। বানালামও। মাত্র ৩ টা ইনিশিয়াল পিএইচপি ফাইল দিয়ে কাজ করছে এই জিনিস। একটা ইনডেক্স পিএচপি ফাইল, একটা হেডার পিএইচপি আর একটা প্রোটেক্টেড মাইসিকুয়েল (নাকি মাইএসকিউএল?) ডাটাবেইস কনফিগারেশন ফাইল। সব কাজ করছে ইনডেক্স পিএইচপি ফাইলটাই। এটি দিয়েই আবার প্রত্যেক টপিকের জন্য ইউনিক আইডিওয়ালা একটি করে পিএইচপি ফাইল তৈরি হচ্ছে যখন একজন একটি টপিক পোস্ট করেন।

একজন শিক্ষাণবীসের স্ক্রিপ্ট হিসেবে খারাপ না এটি। smile কিন্তু স্ক্রিপ্টে দু'টো জায়গায় একটু গোঁজামিল দিয়েছিলাম (১. ইনডিভিজুয়াল টপিক পিএইচপি ফাইল জেনারেটিং টাইম, ২. অটো-ইনক্রিমেন্টাল আইডি)। প্র্যাকটিক্যালি অবশ্য এটা অসুবিধা করছেনা। কিন্তু কনসেপচুয়ালী কিছুটা ভুল আছে। গোঁজামিল দু'টোর একটা ইতোমধ্যে ঠিক করেছি, তবে আমার অটো-ইনক্রিমেন্টাল আইডির ব্যাপারে একটা রেফারেন্স দেখা দরকার ছিল যে আসলে অর্গানাইজ্‌ড সিএমএস সাইটগুলোতে এটা কিভাবে কাজ করে যদিও ফ্রন্ট এন্ড থেকে পুরোপুরি বোঝা সম্ভব না সব সময়।

আমি বুঝতে চাচ্ছিলাম, যখন একজন কোন নতুন থ্রেড খুলতে যাবেন তখন কি ডিবি থেকে লেটেস্ট আইডিটি নিয়ে সেটির সাথে ১ যোগ করে কোন টেম্পোরারী টেবিলে রাখবে, নাকি "সাবমিট" বাটনে ক্লিক করার সাথে জাস্ট "নাল" ভেলু ইনসার্ট করবে স্ক্রিপ্ট ("নাল" হলেও মাইএসকিউএল অটোমেটিক্যালি ভ্যালু দিয়ে দেবে, যেহেতু টেবিল তৈরি করার সময় এর স্পেসিফিকেশনে "ইনট আনসাইন্‌ড নট নাল অটো-ইনক্রিমেন্ট প্রাইমারী কী" দেয়া হয়েছে)। এই ব্যাপারটি আমার ১ নং গোজামিলকেও প্রভাবিত করতো, কারণ ইনডিভিজুয়াল টপিকের জন্য জেনারেট হওয়া পিএইচপি ফাইলের নেইমিং-এ এই ইউনিক আইডিটিই মূল।

Re: Testing03 auto_increment topic ID upon both submission and discarding

জেলাল লিখেছেন:

আমি বুঝতে চাচ্ছিলাম, যখন একজন কোন নতুন থ্রেড খুলতে যাবেন তখন কি ডিবি থেকে লেটেস্ট আইডিটি নিয়ে সেটির সাথে ১ যোগ করে কোন টেম্পোরারী টেবিলে রাখবে, নাকি "সাবমিট" বাটনে ক্লিক করার সাথে জাস্ট "নাল" ভেলু ইনসার্ট করবে স্ক্রিপ্ট ("নাল" হলেও মাইএসকিউএল অটোমেটিক্যালি ভ্যালু দিয়ে দেবে, যেহেতু টেবিল তৈরি করার সময় এর স্পেসিফিকেশনে "ইনট আনসাইন্‌ড নট নাল অটো-ইনক্রিমেন্ট প্রাইমারী কী" দেয়া হয়েছে)। এই ব্যাপারটি আমার ১ নং গোজামিলকেও প্রভাবিত করতো, কারণ ইনডিভিজুয়াল টপিকের জন্য জেনারেট হওয়া পিএইচপি ফাইলের নেইমিং-এ এই ইউনিক আইডিটিই মূল।

অবশ্যই NULL ভ্যালু দিতে হবে - তবে এটা explicitly mention করার দরকার নাই। যেমন আপনার গেস্টবুক টেবিলে যদি guest_id (AUTOINCR), name, comment ইত্যাদি ফিল্ড থাকে তাহলে ইনসার্ট করার সময় guest_id আলাদা করে দেবার দরকার নাই - এরকম কুয়েরী লিখলেই চলবে:

INSERT INTO guest_table(name, comment) 
VALUES('zelal', 'helloworld')

মাইসিক্লে mysql_insert_id() ফাংশন আছে যেটির মাধ্যমে উপরের কুয়েরী রান করার পর guest_id-র ভ্যালু পেয়ে যাবেন।

এছাড়া অন্যান্য ডেটাবেযে (যেমন pgsql, oracle, firebird) RETURNING নামে একটি কুয়েরী ক্লজ আছে যার মাধ্যমে ইনসার্ট কুয়েরীর মধ্যেই লাস্ট অটোইন্ক্রিমেন্টেড আইডি-টি পাওয়া যায়। যেমন, ফায়ারবার্ডে উপরের ২টা স্টেপ ১ লাইনেই করা যায়:

INSERT INTO guest_table(name, comment) 
VALUES('zelal', 'helloworld') 
RETURNING guest_id
Calm... like a bomb.

সর্বশেষ সম্পাদনা করেছেন জেলাল (০৩-১২-২০১০ ২১:৩১)

Re: Testing03 auto_increment topic ID upon both submission and discarding

ধন্যবাদ ইনভার ভাই। mysql_insert_id() ফাংশানটিই আসলেই কাজে লাগানো উচিত। আমি যদিও নিচের কোডটি লিখেছিলাম:
....................................
....................................
$query = "select auto_ID from gbook order by auto_ID desc";
$result = mysql_query($query, $connection);
$latest_ID = mysql_result($result, 0, 'auto_ID');
//echo $latest_ID . "<br>";

$id_to_be_inserted = $latest_ID + 1;

//echo $id_to_be_inserted;

   
$query = "INSERT INTO gbook (auto_ID, Name, Email, Comment, date_auto) VALUES ('$id_to_be_inserted', '$guest_name', '$guest_email', '$guest_comment', '$comment_date')";
mysql_query($query, $connection);

$ind_topic_file = "topics/topic" . $id_to_be_inserted . ".php";

$ind_topic_file_opening = fopen($ind_topic_file, 'a+');
fwrite($ind_topic_file_opening, "<html> .............................. . "\n" .

..................................... . "\n" .

..................................";

fclose($ind_topic_file_opening);

..........................................
..........................................

তবে এখন দেখছি mysql_insert_id() ফাংশনটিই বেটার। এছাড়া ঠিক একই মূহুর্তে একাধিক গেস্ট যদি টপিক পোস্ট করে অর্থাৎ মাইসিকুয়েলে একই সাথে ডাটা ইনসারশানের ব্যাপারটি আসে (যদিও প্র্যাকটিক্যালি এটা আদৌ হয় কিনা জানিনা, খুব জনপ্রিয় ও বিজি সাইটগুলোতে হয়তো এই ব্যাপারটি ঘটে) তাহলে আমার উপরের

$latest_ID = mysql_result($result, 0, 'auto_ID');
//echo $latest_ID . "<br>";

$id_to_be_inserted = $latest_ID + 1;

কোডিংটি হয়তো কাজে আসবেনা। সুতরাং আপনার দেখানো mysql_insert_id() ফাংশনটিই বেটার অপশন। আবারো ধন্যবাদ।