পিডিওর সাথে সারি গণনা


192

চারপাশে অনেকগুলি বিরোধী বক্তব্য রয়েছে। পিএইচপি-তে PDO ব্যবহার করে সারি গণনার সর্বোত্তম উপায় কী? পিডিও ব্যবহার করার আগে, আমি কেবল ব্যবহার করেছিmysql_num_rows

fetchAll এমন কিছু যা আমি চাই না কারণ আমি মাঝে মাঝে বড় ডেটাসেটগুলির সাথে ডিল করতে পারি, তাই আমার ব্যবহারের পক্ষে ভাল নয়।

আপনার কি কোন পরামর্শ আছে?

উত্তর:


265
$sql = "SELECT count(*) FROM `table` WHERE foo = ?"; 
$result = $con->prepare($sql); 
$result->execute([$bar]); 
$number_of_rows = $result->fetchColumn(); 

এটি করার সর্বাধিক মার্জিত উপায় নয়, এর সাথে এতে একটি অতিরিক্ত ক্যোয়ারী জড়িত।

PDO আছে PDOStatement::rowCount(), যা স্পষ্টতই না MySQL এ কাজ । কি যে ব্যথা.

পিডিও ডক থেকে:

বেশিরভাগ ডাটাবেসের জন্য PDOStatement :: rowCount () একটি নির্বাচনী বিবৃতি দ্বারা প্রভাবিত সারিগুলির সংখ্যা প্রদান করে না। পরিবর্তে, আপনার পছন্দসই নির্বাচনী বিবৃতি হিসাবে একই পূর্বাভাস সহ একটি নির্বাচন করুন (*) বিবৃতি জারি করতে PDO :: ক্যোয়ারী () ব্যবহার করুন, তারপরে ফিরে আসবে এমন সারিগুলির সংখ্যা পুনরুদ্ধার করতে PDOStatement :: ফেচক্লামম () ব্যবহার করুন। আপনার অ্যাপ্লিকেশন তখন সঠিক ক্রিয়া সম্পাদন করতে পারে।

সম্পাদনা: উপরের কোড উদাহরণটি একটি প্রস্তুত বিবৃতি ব্যবহার করে, যা অনেক ক্ষেত্রে সারিগুলি গণনা করার উদ্দেশ্যে সম্ভবত অপ্রয়োজনীয়, তাই:

$nRows = $pdo->query('select count(*) from blah')->fetchColumn(); 
echo $nRows;

এর অর্থ অতিরিক্ত ডাটাবেস ক্যোয়ারী করা। আমি ধরে নিয়েছি তিনি ইতিমধ্যে একটি নির্বাচিত ক্যোয়ারী করেছেন এবং এখন জানতে চান যে কতগুলি সারি ফিরে এসেছিল।
নিক 17

1
নিকফ সঠিক mysql_num_rows () PDO ব্যবহার করার সময় কাজ করবে না যদিও তা হবে?
জেমস

সত্য, আপাতদৃষ্টিতে PDOStatement :: rowCount () আছে তবে এটি
মাইএসকিএলে

11
এই পদ্ধতির ব্যবহার করে, fetchColumn()একটি স্ট্রিং "1234" ... আপনার সম্পাদনার হয়েছে ফেরৎ echo count($nRows);- count()পি: একটি অ্যারের ফাংশন। আমি ফলাফলটি fetchColumn()পূর্ণসংখ্যার কাছে টাইপ করার পরামর্শ দিই । $count = (int) $stmt->fetchColumn()
কবি

1
@ করিম The79 অ-প্রস্তুত বিবৃতি পদ্ধতির আসল সংখ্যার পরিবর্তে কেবল ১ টি প্রত্যাবর্তন হচ্ছে। প্রস্তুত বিবৃতি ভাল কাজ করে। বিষয়টি কী হতে পারে?
সাইলেন্টআসেসিন

86

আমি আগে যেমন একটি অনুরূপ প্রশ্নের উত্তরে লিখেছি , এর একমাত্র কারণmysql_num_rows() কাজ করার কারণ হ'ল এটি তথ্য দেওয়ার জন্য এটি অভ্যন্তরীণভাবে সমস্ত সারি আনছিল, যদিও এটি আপনার কাছে এটির মতো মনে হয় না।

পিডিওতে আপনার বিকল্পগুলি হ'ল:

  1. মাইএসকিউএল এর FOUND_ROWS()ফাংশন ব্যবহার করুন ।
  2. fetchAll()সমস্ত সারি একটি অ্যারেতে আনার জন্য PDO এর ক্রিয়াটি ব্যবহার count()করুন , তারপরে এটি ব্যবহার করুন।
  3. SELECT COUNT(*)করিম suggested৯ এর পরামর্শ অনুসারে একটি অতিরিক্ত প্রশ্ন করুন query

8
Mysql_num_rows () সম্পর্কে আমাকে আরও শিক্ষিত করার জন্য আপনাকে ধন্যবাদ মনে হচ্ছে এটি আমার নিজের দেওয়া একটি গুরুত্বপূর্ণ বাধা হতে পারে। আবার ধন্যবাদ.
জেমস

2
fetch_all আসলে ফিচারআল () :)
গতিশীল

2
ফলাফল বড় হলে বিকল্প 2 টি পরামর্শ দেওয়া যায় না।
এডসন হোরাসিও জুনিয়র

FOUND_ROWS () মাইএসকিউএল থেকে সরানো হবে সুতরাং দয়া করে এটি ব্যবহারের আগে FOUND_ROWS এর লিঙ্কটি পরীক্ষা করুন যদি আপনি এর সাথে ইতিমধ্যে পরিচিত হন।
আনাতক

28

যেমনটি প্রায়শই ঘটে থাকে, এই প্রশ্নটি নরক হিসাবে বিভ্রান্তিকর। লোকেরা এখানে দুটি ভিন্ন কাজ মনে রেখে আসছে :

  1. তাদের টেবিলের মধ্যে কত সারি রয়েছে তা জানতে হবে
  2. তাদের জানতে হবে যে কোনও ক্যোয়ারী কোনও সারি ফিরিয়ে দিয়েছে কিনা

এটি দুটি একেবারে পৃথক কার্য যা সাধারণ কিছুই নেই এবং একই ফাংশন দ্বারা সমাধান করা যায় না। হাস্যকরভাবে, তাদের উভয়ের জন্যই আসল 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() উপলব্ধ হবে না , এইভাবে এই ফাংশনটির জন্য কোনও ব্যবহার নেই।

সুতরাং, এটি কেবলমাত্র একমাত্র ব্যবহারের ক্ষেত্রে যখন আপনাকে সম্ভবত অতিরিক্ত কোয়েরি চালানোর প্রয়োজন হতে পারে, সেক্ষেত্রে আপনাকে নির্বাচিত সারিগুলির সংখ্যার জন্য একটি ঘনিষ্ঠ হিসাব জানতে হবে।


এটি কার্যকর হয় যদি API কে কোনও অনুসন্ধান ক্যোয়ারীর মোট ফলাফল মুদ্রণের প্রয়োজন হয়। এটি আপনাকে কেবল 10 বা 15 টি সারি ফিরিয়ে দেবে, তবে এটিরও আপনাকে বলতে হবে যে এখানে মোট 284 ফলাফল রয়েছে।
আন্দ্রে এসকে

4
@ Andufo এটা না। অনুগ্রহ করে মনে রাখবেন: কোনও বিকাশকারীকে এভাবে কখনই করা উচিত নয় । অনুসন্ধানের অনুসন্ধানে সমস্ত 284 টি সারি কখনই ফিরে পাওয়া উচিত নয়। দেখানোর জন্য 15 এবং পৃথক ক্যোয়ারী থেকে একটি সারি 284 টি পাওয়া গেছে তা ফেরত দিতে হবে ।
আপনার প্রচলিত সংবেদন

2
এটি একটি খুব ভাল পয়েন্ট - প্রথমে অপ্রয়োজনীয় তবে বৈধ। অধিকাংশ মানুষ ভুলে যাবেন না যে দুটি সরল এসকিউএল কোয়েরি হয় উপায় দ্রুত একটি সামান্য বড় এক তুলনায়। যেকোন গণনা ন্যায়সঙ্গত করার জন্য আপনার কাছে খুব ধীর গতির জিজ্ঞাসা থাকতে হবে যা অনুকূলিত হতে পারে না এবং সম্ভবত কয়েকটি ফলাফল দিতে পারে। যে ইশারা জন্য ধন্যবাদ!
পিয়ারবার

@ আপনার সাধারণ অনুভূতি: কেবলমাত্র নিশ্চিত হন: ফলাফলটি খুব বড় হলে সমস্ত () এনে দেওয়া খারাপ ধারণা হবে না? ক্রমাগত ডেটা পেতে ফ্যাচ () ব্যবহার করা ভাল না।
টিমবার্নে

@ টিমমর্নইয়ে আমার উত্তরের শেষ অনুচ্ছেদে ঠিক তেমনটাই বলেছে
আপনার প্রচলিত

21

এটি অতি দেরি হয়ে গেছে তবে আমি সমস্যার মধ্যে পড়েছিলাম এবং আমি এটি করি:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

এটি সত্যই সহজ এবং সহজ। :)


19
কেবলমাত্র এটি গণনা করার জন্য সমস্ত ডেটা নির্বাচন করা ডাটাবেস ইন্টারঅ্যাকশনের সর্বাধিক বুনিয়াদী বিধিগুলির বিরুদ্ধে।
আপনার কমন সেন্স

সম্ভবত আপনি ফিরে আসা সমস্ত মানগুলির জন্য একটি অগ্রগতি বার পেতে চান, সুতরাং আপনাকে সামনে সারিগুলির সংখ্যা জানতে হবে।
জনি

18

আমি এটি ব্যবহার করে শেষ করেছি:

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}

12

এই পোস্টটি পুরানো তবে পিডিওর সাথে পিএইচপিতে সারি গণনা পাওয়া সহজ

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();

3
করিম answer৯ এর উত্তরে উদ্ধৃত ডকুমেন্টেশন দেখুন। এটি কখনও কখনও কাজ করে তবে বিশ্বাসযোগ্য নয়।
অক্টোবর 7'15

5

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

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

  1. Fruit-> কলা
  2. Fruit-> আপেল
  3. Fruit-> অরেঞ্জ

যদি আপনি ফেচক্লামম () ব্যবহার করেন তবে আপনি দেখতে পাচ্ছেন যে এখানে 3 টি ফল ফিরে এসেছে, তবে আপনি যদি এখন ফলাফলটি লুপ করেন তবে আপনার কাছে কেবল দুটি কলাম রয়েছে, ফেচক্লামমের দাম () ফলাফল খুঁজে পাওয়ার জন্য প্রথম কলামের ক্ষতি হ'ল কত সারি ফিরে এসেছিল। এটি স্লোপি কোডিংয়ের দিকে পরিচালিত করে এবং যদি প্রয়োগ করা হয় তবে সম্পূর্ণ ত্রুটি-বিচ্যুত ফলাফল।

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

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


2

এর জবাব দেওয়া হচ্ছে কারণ আমি এখন এটি জেনে নিজের সাথে আটকা পড়েছি এবং সম্ভবত এটি কার্যকর হবে।

মনে রাখবেন যে আপনি দুবার ফলাফল আনতে পারবেন না। আপনাকে আনার ফলাফলকে অ্যারেতে সংরক্ষণ করতে হবে, সারি দিয়ে গণনা করতে হবে count($array)এবং এর সাথে আউটপুট ফলাফল পেতে হবে foreach। উদাহরণ স্বরূপ:

$query = "your_query_here";
$STH = $DBH->prepare($query);
$STH->execute();
$rows = $STH->fetchAll();
//all your results is in $rows array
$STH->setFetchMode(PDO::FETCH_ASSOC);           
if (count($rows) > 0) {             
    foreach ($rows as $row) {
        //output your rows
    }                       
}

1

আপনি যদি কেবল সারিগুলির একটি গণনা (ডেটা নয়) পেতে চান তবে। একটি প্রস্তুত বিবৃতিতে COUNT (*) ব্যবহার করে তারপরে আপনাকে যা করতে হবে তা হ'ল ফলাফলটি পুনরুদ্ধার করুন এবং মানটি পড়ুন:

$sql = "SELECT count(*) FROM `table` WHERE foo = bar";
$statement = $con->prepare($sql); 
$statement->execute(); 
$count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
return reset($count); // Resets array cursor and returns first value (the count)

সাধারণ গণনা সম্পাদনের জন্য সমস্ত সারি (ডেটা) পুনরুদ্ধার করা সম্পদের অপচয়। যদি ফলাফল সেটটি বড় হয় তবে আপনার সার্ভারটি এতে চাপ ফেলতে পারে।



1

কোনও প্রশ্নের মধ্যে ভেরিয়েবলগুলি ব্যবহার করতে আপনাকে bindValue()বা ব্যবহার করতে হবে bindParam()। এবং এর সাথে ভেরিয়েবলগুলি একত্রিত করবেন না" . $variable . "

$statement = "SELECT count(account_id) FROM account
                  WHERE email = ? AND is_email_confirmed;";
$preparedStatement = $this->postgreSqlHandler->prepare($statement);
$preparedStatement->bindValue(1, $account->getEmail());
$preparedStatement->execute();
$numberRows= $preparedStatement->fetchColumn();

জি এল


0

যখন পিএইচপি পিডিও সহ টেবিলের মধ্যে কতগুলি সারি গণনা করা যায় বা কীভাবে পাওয়া যায় এটি মাইএসকিএলের বিষয় I

// count total number of rows
$query = "SELECT COUNT(*) as total_rows FROM sometable";
$stmt = $con->prepare($query);

// execute query
$stmt->execute();

// get total rows
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['total_rows'];

ক্রেডিটগুলি মাইক @ কোডofaninja.com- এ যায়


-1

প্রথম এন্ট্রি ফিরিয়ে আনতে একটি দ্রুত একটি লাইনার। এটি খুব বেসিক প্রশ্নের জন্য দুর্দান্ত।

<?php
$count = current($db->query("select count(*) from table")->fetch());
?>

উল্লেখ


-1

আমি $count = $stmt->rowCount();ওরাকল 11.2 দিয়ে চেষ্টা করেছি এবং এটি কার্যকর হয়নি। নীচের শো হিসাবে লুপের জন্য একটি ব্যবহার করার সিদ্ধান্ত নিয়েছি।

   $count =  "";
    $stmt =  $conn->prepare($sql);
    $stmt->execute();
   echo "<table border='1'>\n";
   while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
        $count++;
        echo "<tr>\n";
    foreach ($row as $item) {
    echo "<td class='td2'>".($item !== null ? htmlentities($item, ENT_QUOTES):"&nbsp;")."</td>\n";
        } //foreach ends
        }// while ends
        echo "</table>\n";
       //echo " no of rows : ". oci_num_rows($stmt);
       //equivalent in pdo::prepare statement
       echo "no.of rows :".$count;

-1

সোজা প্রশ্নের জন্য যেখানে আমি একটি নির্দিষ্ট সারি চাই এবং এটি পাওয়া গেছে কিনা তা জানতে চাই, আমি এরকম কিছু ব্যবহার করি:

function fetchSpecificRow(&$myRecord) {
    $myRecord = array();
    $myQuery = "some sql...";
    $stmt = $this->prepare($myQuery);
    $stmt->execute(array($parm1, $parm2, ...));
    if ($myRecord = $stmt->fetch(PDO::FETCH_ASSOC)) return 0;
    return $myErrNum;
}

-1

একটি সহজ সমাধান আছে। আপনি যদি পিডিও ব্যবহার করেন তবে এটির মতো আপনার ডিবিতে সংযোগ দিন:

try {
    $handler = new PDO('mysql:host=localhost;dbname=name_of_your_db', 'your_login', 'your_password'); 
    $handler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
    catch (PDOException $e) {   
    echo $e->getMessage();
}

তারপরে, ডিবি-তে ক্যোয়ারীটি হ'ল:

$query = $handler->query("SELECT id FROM your_table WHERE ...");

এবং অবশেষে, আপনার প্রশ্নের সাথে মেলে এমন সারিগুলি গণনা করতে লিখুন

$amountOfRows = $query->rowcount();

কেন এটি বেশিরভাগ সময় আমাকে -1 ফেরায়? এমনকি যদি তথ্য আছে। ।
ইঙ্গুস

-1

fetchColumn ()

রেকর্ডের গণনা পেতে চাইলে ব্যবহার করা হয় [ফলক]

$sql   = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
$res   = $conn->query($sql);
$count = $res->fetchColumn(); // ex = 2

প্রশ্ন()

ডেটা এবং রেকর্ডের গণনা [বিকল্পগুলি] পুনরুদ্ধার করতে চাইলে ব্যবহৃত হয়

$sql = "SELECT * FROM fruit WHERE calories > 100";
$res = $conn->query($sql);

if ( $res->rowCount() > 0) {

    foreach ( $res as $row ) {
        print "Name: {$row['NAME']} <br />";
    }

}
else {
    print "No rows matched the query.";
}

PDOStatement :: rowCount


আপনার কখনই এটি করা উচিত নয় । কম বেশি বড় টেবিলে এটি সমস্ত সার্ভারের মেমরি খেয়ে ফেলবে এবং সার্ভারটি ক্র্যাশ করবে
আপনার সাধারণ সংবেদন

এখন আপনার উত্তরটি মাত্র এক ডজন বিদ্যমান উত্তরের নকল করে।
আপনার সাধারণ জ্ঞান

-2

যখন আপনি আপনার মাইএসকিএল বিবৃতিতে একটি মত (*) করেন

$q = $db->query("SELECT COUNT(*) FROM ...");

আপনার মাইএসকিএল ক্যোয়ারী ইতিমধ্যে ফলাফলের সংখ্যা গণনা করছে কেন পিএইচপি তে আবার গণনা করছে? আপনার mysql এর ফলাফল পেতে

$q = $db->query("SELECT COUNT(*) as counted FROM ...");
$nb = $q->fetch(PDO::FETCH_OBJ);
$nb = $nb->counted;

এবং $nbআপনার মাইএসকিএল স্টেটমেন্টটি দিয়ে লেখার জন্য বেশ দীর্ঘ কিন্তু কার্যকর করার জন্য দ্রুত গণনা করেছে inte

সম্পাদনা করুন: ভুল পোস্টের জন্য দুঃখিত তবে কিছু উদাহরণ হিসাবে গণনা সহ ক্যোয়ারী দেখানোর জন্য, আমি মাইএসকিএল ফলাফলটি ব্যবহার করার পরামর্শ দিচ্ছিলাম, তবে আপনি যদি স্কেরাল ফেচএলে গণনাটি ব্যবহার না করেন তবে কার্যকর (যদি আপনি কোনও পরিবর্তনশীলে ফলাফলটি সংরক্ষণ করেন) আপনি একটি লাইন আলগা করবেন না।

$data = $dbh->query("SELECT * FROM ...");
$table = $data->fetchAll(PDO::FETCH_OBJ);

count($table)সারিটির সংখ্যা ফিরিয়ে দেবে এবং আপনি ফলাফলটি পছন্দ $row = $table[0] বা ব্যবহারের পরেও ব্যবহার করতে পারেনforeach

foreach($table as $row){
  print $row->id;
}

1
প্রশ্নটি কীভাবে হয় যখন আপনি আপনার মাইএসকিএল বিবৃতিতে একটি COUNT (*) করবেন না
আপনার সাধারণ সংবেদন

-2

শেষ ক্যোয়ারীর "WHERE" মানদণ্ডের অন্তর্ভুক্ত সারিগুলির সংখ্যা পুনরুদ্ধার করতে সহায়ক সহায়তার সাথে PDO বর্গের একটি কাস্টম মেড এক্সটেনশান এখানে দেওয়া হয়েছে।

আপনি কী আদেশ ব্যবহার করেন তার উপর নির্ভর করে আপনাকে আরও 'হ্যান্ডলার' যুক্ত করতে হতে পারে। এখনই এটি কেবলমাত্র "FROM" বা "আপডেট" ব্যবহার করা প্রশ্নের জন্য কাজ করে।

class PDO_V extends PDO
{
    private $lastQuery = null;

    public function query($query)
    {
        $this->lastQuery = $query;    
        return parent::query($query);
    }
    public function getLastQueryRowCount()
    {
        $lastQuery = $this->lastQuery;
        $commandBeforeTableName = null;
        if (strpos($lastQuery, 'FROM') !== false)
            $commandBeforeTableName = 'FROM';
        if (strpos($lastQuery, 'UPDATE') !== false)
            $commandBeforeTableName = 'UPDATE';

        $after = substr($lastQuery, strpos($lastQuery, $commandBeforeTableName) + (strlen($commandBeforeTableName) + 1));
        $table = substr($after, 0, strpos($after, ' '));

        $wherePart = substr($lastQuery, strpos($lastQuery, 'WHERE'));

        $result = parent::query("SELECT COUNT(*) FROM $table " . $wherePart);
        if ($result == null)
            return 0;
        return $result->fetchColumn();
    }
}

সমস্যাটি চেষ্টা করার মতো নয়। এই জাতীয় সংখ্যার এত কম প্রয়োজন যে কারও জন্য ডেডিকেটেড এক্সটেনশান প্রয়োজন না। এটি প্রস্তুত বিবৃতিগুলি সমর্থন করে না - এটি পিডিও ব্যবহারের একমাত্র কারণ mention
আপনার সাধারণ অনুভূতি

-2

আপনি সেরা পদ্ধতিটি এক লাইনে বা ফাংশনে একত্রিত করতে পারেন এবং আপনার জন্য নতুন ক্যোয়ারী স্বয়ংক্রিয়ভাবে তৈরি করতে পারেন:

function getRowCount($q){ 
    global $db;
    return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn();
}

$numRows = getRowCount($query);

এই পদ্ধতিতে সেরা কিছুই। কতগুলি সারি ফিরিয়ে দেওয়া হয়েছে তা জানতে কেবল একটি অতিরিক্ত ক্যোয়ারী চালানো কোনও অর্থহীন নয়।
আপনার কমন সেন্স

-2
<table>
      <thead>
           <tr>
                <th>Sn.</th>
                <th>Name</th>
           </tr>
      </thead>
      <tbody>
<?php
     $i=0;
     $statement = $db->prepare("SELECT * FROM tbl_user ORDER BY name ASC");
     $statement->execute();
     $result = $statement->fetchColumn();
     foreach($result as $row) {
        $i++;
    ?>  
      <tr>
         <td><?php echo $i; ?></td>
         <td><?php echo $row['name']; ?></td>
      </tr>
     <?php
          }
     ?>
     </tbody>
</table>

1
এটি একটি বাস্তব খারাপ ধারণা। সমস্ত সারি নির্বাচন করা, এটি ব্যান্ডউইথের একটি বিশাল অপচয়।
নাফীস

-2
function count_x($connect) {  
 $query = "  SELECT * FROM tbl WHERE id = '0' ";  
 $statement = $connect->prepare($query);  $statement->execute();  
 $total_rows = $statement->rowCount();  
 return $total_rows; 
}

-4

প্যারামিটার ব্যবহার করুন array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), অন্যথায় -1 দেখান:

উসেন প্যারামেট্রো array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), সিন ইলো বিক্রয় -১

উদাহরণ:

$res1 = $mdb2->prepare("SELECT clave FROM $tb WHERE id_usuario='$username' AND activo=1 and id_tipo_usuario='4'", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$res1->execute();

$count=$res1->rowCount();
echo $count;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.