سؤال

هناك العديد من التصريحات المتضاربة حولها.ما هي أفضل طريقة لحساب عدد الصفوف باستخدام PDO في PHP؟قبل استخدام PDO، استخدمته ببساطة mysql_num_rows.

fetchAll هو شيء لا أريده لأنني قد أتعامل أحيانًا مع مجموعات بيانات كبيرة، لذا فهو ليس جيدًا لاستخدامي.

هل لديك اي اقتراحات؟

هل كانت مفيدة؟

المحلول

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

ليست الطريقة الأكثر أناقة للقيام بذلك، بالإضافة إلى أنها تتضمن استعلامًا إضافيًا.

شركة تنمية نفط عمان لديها PDOStatement::rowCount(), ، وهو ما يفعله على ما يبدو لا العمل في MySqlياله من ألم.

من مستند PDO:

بالنسبة لمعظم قواعد البيانات ، لا يعيد PDostatement :: RowCount () عدد الصفوف المتأثرة ببيان محدد.بدلاً من ذلك ، استخدم PDO :: QUERY () لإصدار عبارة تحديد (*) مع نفس ما يتوقع بيان SELECT المقصود ، ثم استخدم pdostatement :: fetchColumn () لاسترداد عدد الصفوف التي سيتم إرجاعها.يمكن لتطبيقك بعد ذلك تنفيذ الإجراء الصحيح.

يحرر:يستخدم مثال الكود أعلاه عبارة معدة، والتي قد تكون في كثير من الحالات غير ضرورية لغرض حساب الصفوف، لذلك:

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

نصائح أخرى

كما كتبت سابقا في إجابة على سؤال مماثل, ، السبب الوحيد mysql_num_rows() السبب في نجاحه هو أنه كان يجلب جميع الصفوف داخليًا لتزويدك بهذه المعلومات، حتى لو لم يبدو الأمر كذلك بالنسبة لك.

لذا، في شركة تنمية نفط عمان، الخيارات المتاحة أمامك هي:

  1. استخدم MySQL FOUND_ROWS() وظيفة.
  2. استخدم شركة تنمية نفط عمان fetchAll() دالة لجلب كافة الصفوف إلى مصفوفة، ثم استخدامها count() عليه.
  3. قم بإجراء استعلام إضافي ل SELECT COUNT(*), كما اقترح karim79.

قبل استخدام PDO، استخدمته ببساطة mysql_num_rows().

أنت لا ينبغي أن يكون استخدامه في المقام الأول.

mysql_num_rows(), ، إلى جانب PDOStatement::rowCount() يعني أنك تم تحديدها بالفعل معلوماتك.في هذه الحالة هناك حالتان فقط من حالات الاستخدام الممكنة لهذه الوظيفة:

  1. لقد كنت تختار بياناتك فقط للحصول على العدد.
  2. تريد معرفة ما إذا كان استعلامك قد أعاد أي صفوف.

ولا ينبغي أبدًا استخدام الأول على الإطلاق. لا ينبغي لأحد أبدًا تحديد صفوف لحسابها، لأن الخادم الخاص بك قد يختنق بالفعل بسبب مجموعة البيانات الكبيرة التي تم إرجاعها.

علاوة على ذلك، فإن اختيار الصفوف فقط لحسابها ليس له أي معنى.أ count(*) يجب تشغيل الاستعلام بدلاً من ذلك، مع إرجاع صف واحد فقط.

حالة الاستخدام الثانية أقل كارثية ولكنها لا طائل من ورائها:وفي حالة رغبتك في معرفة ما إذا كان استعلامك قد أدى إلى ظهور أية بيانات، فستكون لديك دائمًا البيانات نفسها!

لنفترض أنه إذا كنت تحدد صفًا واحدًا فقط، فما عليك سوى إحضاره والتحقق من النتيجة:

$stmt->execute();
$row = $stmt->fetch();
if ($row) { // here! as simple as that
}

إذا كنت بحاجة للحصول على العديد من الصفوف، فيمكنك استخدامها fetchAll().

fetchAll() هو شيء لا أريده لأنني قد أتعامل أحيانًا مع مجموعات بيانات كبيرة

لاحظ أنه في تطبيق الويب، لا يجب عليك أبدًا تحديد عدد كبير من الصفوف.يجب تحديد الصفوف التي سيتم استخدامها فعليًا على صفحة الويب فقط.لأي غرض أ LIMIT أو يجب استخدام جملة مشابهة في SQL.وبالنسبة لمثل هذه الكمية المعتدلة من البيانات، فلا بأس باستخدامها fetchAll()

في مثل هذه الحالة النادرة عندما تحتاج إلى تحديد عدد كبير جدًا من الصفوف (في تطبيق وحدة التحكم على سبيل المثال)، لتقليل مقدار الذاكرة المستخدمة، يتعين عليك استخدام استعلام غير مخزن, ولكن في هذه الحالة rowCount() لن تكون متاحة على أي حال, وبالتالي لا فائدة من هذه الوظيفة أيضًا.

إذن كما ترى، لا توجد حالة استخدام أيضًا لـ rowCount() ولا لاستعلام إضافي لاستبداله، كما هو مقترح في الإجابة المقبولة.

وهذا هو أواخر السوبر، لكنني واجهت مشكلة، وأنا أفعل هذا:

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();

وانها حقا بسيطة، وسهلة. :)

وانتهى بي الأمر باستخدام هذا:

$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>";
}

وهذه الوظيفة هي قديمة ولكن للوصول إلى عدد الصفوف في بي مع شركة تنمية نفط عمان بسيطة

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

هذا منشور قديم، لكن أشعر بالإحباط عند البحث عن بدائل.من المؤسف جدًا أن شركة PDO تفتقر إلى هذه الميزة، خاصة وأن PHP وMySQL تميلان إلى العمل جنبًا إلى جنب.

يوجد خلل مؤسف في استخدام fetchColumn() حيث لم يعد بإمكانك استخدام مجموعة النتائج هذه (بشكل فعال) حيث يقوم fetchColumn() بنقل الإبرة إلى الصف التالي.على سبيل المثال، إذا كانت لديك نتيجة مشابهة لـ

  1. الفاكهة->الموز
  2. الفاكهة->التفاح
  3. الفاكهة->البرتقال

إذا كنت تستخدم fetchColumn()، فيمكنك معرفة أن هناك 3 ثمار تم إرجاعها، ولكن إذا قمت الآن بتكرار النتيجة، فلديك عمودين فقط، وسعر fetchColumn() هو فقدان العمود الأول من النتائج فقط للعثور عليها من عدد الصفوف التي تم إرجاعها.يؤدي ذلك إلى ترميز غير دقيق، ونتائج مليئة بالأخطاء تمامًا إذا تم تنفيذها.

والآن، باستخدام fetchColumn()، يتعين عليك تنفيذ مكالمة جديدة تمامًا واستعلام MySQL فقط للحصول على مجموعة نتائج عمل جديدة.(والذي نأمل ألا يتغير منذ استعلامك الأخير)، أعلم أن هذا غير مرجح، لكنه يمكن أن يحدث.بالإضافة إلى ذلك، الحمل الزائد للاستعلامات المزدوجة عند التحقق من صحة عدد الصفوف.وهو في هذا المثال صغير، ولكن تحليل 2 مليون صف في استعلام مشترك، ليس سعرًا لطيفًا يجب دفعه.

أنا أحب PHP وأدعم جميع المشاركين في تطويرها وكذلك المجتمع ككل باستخدام PHP على أساس يومي، ولكن آمل حقًا أن تتم معالجة هذا الأمر في الإصدارات المستقبلية.هذه هي شكواي الوحيدة "حقًا" مع PHP PDO، والتي بخلاف ذلك تعتبر فئة رائعة.

وردا على ذلك لأنني المحاصرين نفسي معها من خلال معرفة هذا الآن، وربما يكون مفيدا.

ونضع في اعتبارنا أن كنت غير قادر على جلب نتائج مرتين. لديك لانقاذ جلب يؤدي إلى مجموعة، والحصول على عدد الصفوف التي 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
    }                       
}

إذا كنت ترغب فقط في الحصول على عدد من الصفوف (وليس البيانات) أي. استخدام 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)

واسترجاع الواقع كافة الصفوف (بيانات) لتنفيذ عدد بسيط هو مضيعة للموارد. إذا كانت النتيجة مجموعة كبيرة الخادم الخاص بك قد خنق على ذلك.

وإلقاء نظرة على هذا الرابط: http://php.net/manual/en/pdostatement.rowcount.php فمن غير المستحسن استخدام ROWCOUNT () في عبارات SELECT!

عندما يتعلق الأمر الخلية كيفية العد أو احصل على عدد الصفوف في الجدول باستخدام PHP PDO انا استعمل هذا

// 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'];

الاعتمادات تذهب إلى مايك @ codeofaninja.com

لاستخدام المتغيرات داخل الاستعلام، يمكنك ذلك bindValue() أو bindParam()لاستخدام المتغيرات داخل الاستعلام عليك استخدامها 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();

جي إل

وهناك حل بسيط. إذا كنت تستخدم PDO اتصال DB الخاصة بك مثل هذا:

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();
}

وبعد ذلك، الاستعلام إلى DB سيكون:

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

وأخيرا، لحساب الصفوف مطابقة الخاص الكتابة الاستعلام مثل هذا

$amountOfRows = $query->rowcount();

وفيما يلي تمديد حسب الطلب من الطبقة شركة تنمية نفط عمان، مع وظيفة المساعد لاسترداد عدد الصفوف التي أدرجتها معايير الاستعلام الماضي "حيث".

وقد تحتاج إلى إضافة المزيد من "معالجات"، على الرغم من، اعتمادا على ما الأوامر التي تستخدمها. والآن يعمل فقط من أجل الاستعلامات التي تستخدم "FROM" أو "UPDATE".

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();
    }
}

وA سريعة سفينة واحدة للحصول على الإدخال الأول التي تم إرجاعها. هذا هو لطيف للاستعلامات أساسية جدا.

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

المرجعي

وحاولت $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;

لاستفسارات التوالي حيث أريد صف معين، وتريد أن تعرف إذا وجد، وأنا استخدم شيئا مثل:

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;
}

وعند إجراء COUNT (*) في بيان الخلية الخاصة بك كما في

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

والاستعلام الخلية الخاصة بك تعول بالفعل عدد من نتيجة لماذا عد مرة أخرى في بي؟ للحصول على النتيجة من الخلية الخاصة بك

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

وو$nb سوف تحتوي على عدد صحيح لديك حساب مع بيان الخلية الخاصة بك قليلا طويلة لكتابة ولكن بسرعة لتنفيذ

وتحرير: آسف لهذا المنصب خاطئة، ولكن بما أن بعض الاستعلام سبيل المثال تظهر مع الاعتماد في، كنت تشير إلى استخدام نتيجة الخلية، ولكن إذا كنت لا تستخدم العد في fetchAll SQL () غير فعالة، إذا قمت بحفظ النتيجة في المتغير الذي فاز 'ر تفقد الخط.

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

وcount($table) سيعود عدد الصفوف ويمكنك الاستمرار في استخدام النتيجة بعد $row = $table[0] مثل أو باستخدام foreach

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

You can combine the best method into one line or function, and have the new query auto-generated for you:

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

$numRows = getRowCount($query);
<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>
function count_x($connect) {  
 $query = "  SELECT * FROM tbl WHERE id = '0' ";  
 $statement = $connect->prepare($query);  $statement->execute();  
 $total_rows = $statement->rowCount();  
 return $total_rows; 
}

Use parameter array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), else show -1:

Usen parametro array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), sin ello sale -1

example:

$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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top