যেমনটি প্রায়শই ঘটে থাকে, এই প্রশ্নটি নরক হিসাবে বিভ্রান্তিকর। লোকেরা এখানে দুটি ভিন্ন কাজ মনে রেখে আসছে :
- তাদের টেবিলের মধ্যে কত সারি রয়েছে তা জানতে হবে
- তাদের জানতে হবে যে কোনও ক্যোয়ারী কোনও সারি ফিরিয়ে দিয়েছে কিনা
এটি দুটি একেবারে পৃথক কার্য যা সাধারণ কিছুই নেই এবং একই ফাংশন দ্বারা সমাধান করা যায় না। হাস্যকরভাবে, তাদের উভয়ের জন্যই আসল PDOStatement::rowCount()
ফাংশনটি ব্যবহার করতে হবে।
দেখা যাক কেন
সারণীতে সারি গণনা করা হচ্ছে
পিডিও ব্যবহার করার আগে আমি কেবল সহজভাবে ব্যবহার করেছি mysql_num_rows()
।
এর অর্থ আপনি ইতিমধ্যে এটি ভুল করেছেন। টেবিলের সারিগুলির সংখ্যা ব্যবহার করা mysql_num_rows()
বা rowCount()
গণনা করা সার্ভার সংস্থানগুলি গ্রাস করার ক্ষেত্রে প্রকৃত বিপর্যয় । একটি ডাটাবেসকে ডিস্ক থেকে সমস্ত সারি পড়তে হবে, ডাটাবেস সার্ভারে মেমরিটি গ্রহন করতে হবে, তারপরে পিএইচপি-তে এই সমস্ত ডেটা হিপ প্রেরণ করতে হবে, পিএইচপি প্রক্রিয়াটির স্মৃতিও গ্রাস করবে, আপনার সার্ভারকে কোনও কারণ ছাড়াই বোঝা উচিত।
তদতিরিক্ত, কেবল তাদের গণনা করার জন্য সারিগুলি নির্বাচন করা কোনও অর্থহীন নয়। count(*)
পরিবর্তে একটি ক্যোয়ারী চালাতে হবে। ডাটাবেসটি প্রকৃত সারিগুলি না পড়ে সূচকের বাইরে রেকর্ডগুলি গণনা করবে এবং তারপরে কেবল একটি সারিই ফিরে আসবে।
এই উদ্দেশ্যে গ্রহণযোগ্য উত্তরে প্রস্তাবিত কোডটি ন্যায্য।
সংখ্যাটি সারি গণনা করে ফেরত দেওয়া হয়েছে।
দ্বিতীয় ব্যবহারের ক্ষেত্রে অর্থহীন হিসাবে বিপর্যয়কর নয়: যদি আপনার কোয়েরিতে কোনও ডেটা ফেরত আসে কিনা তা আপনার জানা দরকার, আপনার কাছে সর্বদা ডেটা থাকে!
বলুন, আপনি যদি কেবল একটি সারি নির্বাচন করেন। ঠিক আছে, আপনি আনীত সারিটি পতাকা হিসাবে ব্যবহার করতে পারেন:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
আপনার যদি অনেকগুলি সারি পাওয়ার প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন fetchAll()
।
fetchAll()
এমন কিছু যা আমি চাই না কারণ আমি মাঝে মাঝে বড় ডেটাসেটগুলির সাথে ডিল করতে পারি
হ্যাঁ অবশ্যই, প্রথম ব্যবহারের ক্ষেত্রে এটি দ্বিগুণ খারাপ হবে। তবে যেমনটি আমরা ইতিমধ্যে শিখেছি, কেবল সারিগুলি কেবল তাদের গণনা করার জন্য নির্বাচন করবেন না , নাও rowCount()
নয় fetchAll()
।
তবে আপনি যদি নির্বাচিত সারিগুলি ব্যবহার করতে চান তবে ব্যবহার করার ক্ষেত্রে কোনও ভুল নেই fetchAll()
। মনে রাখবেন যে ওয়েব অ্যাপ্লিকেশনটিতে আপনার কখনই বিপুল পরিমাণে সারি নির্বাচন করা উচিত নয়। শুধু সারি যে আসলে ওয়েব পৃষ্ঠাতে ব্যবহার করা হবে নির্বাচিত করা উচিত, তাই আপনার ব্যবহারের জন্য পেয়েছেন LIMIT
, WHERE
অথবা আপনার SQL এর যে একটি অনুরূপ দফা। এবং এমন একটি পরিমিত পরিমাণের ডেটার জন্য এটি ব্যবহার করা ঠিক fetchAll()
। এবং আবারও, শর্তে এই ফাংশনটির ফলাফলটি ব্যবহার করুন:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
এবং অবশ্যই আপনার অন্যান্য ক্যোয়ারিতে কোনও সারি ফেরত এসেছে কিনা তা জানাতে কেবল অতিরিক্ত কোয়েরি চালানো চূড়ান্ত উন্মাদনা হবে , যেমন এটি শীর্ষ দুটি উত্তরের পরামর্শ অনুসারে।
একটি বৃহত রেজসেটে সারিগুলির সংখ্যা গণনা করা হচ্ছে
এমন বিরল ক্ষেত্রে যখন আপনাকে সত্যিকারের বিশাল পরিমাণ সারি নির্বাচন করতে হয় (উদাহরণস্বরূপ একটি কনসোল অ্যাপ্লিকেশনটিতে), আপনাকে ব্যবহৃত মেমরির পরিমাণ হ্রাস করার জন্য আপনাকে একটি অসমাপ্ত ক্যোয়ারী ব্যবহার করতে হবে। তবে এটি আসল ক্ষেত্রে যখন rowCount()
উপলব্ধ হবে না , এইভাবে এই ফাংশনটির জন্য কোনও ব্যবহার নেই।
সুতরাং, এটি কেবলমাত্র একমাত্র ব্যবহারের ক্ষেত্রে যখন আপনাকে সম্ভবত অতিরিক্ত কোয়েরি চালানোর প্রয়োজন হতে পারে, সেক্ষেত্রে আপনাকে নির্বাচিত সারিগুলির সংখ্যার জন্য একটি ঘনিষ্ঠ হিসাব জানতে হবে।