Количество строк с PDO - PullRequest
176 голосов
/ 19 мая 2009

Вокруг много противоречивых утверждений. Каков наилучший способ подсчета строк с использованием PDO в PHP? Перед использованием PDO я просто использовал mysql_num_rows.

fetchAll - это то, чего я не хочу, потому что иногда я имею дело с большими наборами данных, поэтому это не подходит для моего использования.

Есть ли у вас какие-либо предложения?

Ответы [ 22 ]

0 голосов
/ 21 февраля 2019

Есть простое решение. Если вы используете PDO, подключитесь к вашей БД следующим образом:

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();
0 голосов
/ 08 декабря 2018

Чтобы использовать переменные в запросе, вы можете 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();

GL

0 голосов
/ 11 апреля 2018
function count_x($connect) {  
 $query = "  SELECT * FROM tbl WHERE id = '0' ";  
 $statement = $connect->prepare($query);  $statement->execute();  
 $total_rows = $statement->rowCount();  
 return $total_rows; 
}
0 голосов
/ 12 августа 2017

Когда дело касается mysql, как подсчитать или получить количество строк в таблице с 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

0 голосов
/ 25 июня 2016
<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>
0 голосов
/ 23 марта 2016

Используйте параметр array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), иначе покажите -1:

Параметры Usen array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), Sin Ello Sale -1

пример:

$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;
0 голосов
/ 27 мая 2016

Вы можете объединить лучший метод в одну строку или функцию и автоматически сгенерировать для вас новый запрос:

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

$numRows = getRowCount($query);
0 голосов
/ 31 января 2016

Для прямых запросов, где я хочу конкретную строку и хочу знать, была ли она найдена, я использую что-то вроде:

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;
}
0 голосов
/ 27 мая 2013

когда вы делаете COUNT (*) в своем выражении mysql, как в

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

Ваш запрос MySQL уже подсчитывает количество результатов, зачем снова считать в php? чтобы получить результат вашего mysql

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

и $nb будут содержать целое число, которое вы посчитали с помощью вашего оператора mysql немного долго писать, но быстро выполнить

Edit: извините за неправильный пост, но в качестве примера показан запрос с счетчиком в, я предлагал использовать результат mysql, но если вы не используете счетчик в sql, fetchAll () эффективен, если вы сохраните результат в переменной, которую вы выиграли не потерять линию.

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

count($table) вернет номер строки, и вы все равно сможете использовать результат после $row = $table[0] или с помощью foreach

foreach($table as $row){
  print $row->id;
}
0 голосов
/ 15 июля 2013

Вот специальное расширение класса PDO с вспомогательной функцией для получения количества строк, включенных в критерии WHERE последнего запроса.

Возможно, вам потребуется добавить больше «обработчиков», в зависимости от того, какие команды вы используете. Прямо сейчас это работает только для запросов, которые используют «ОТ» или «ОБНОВЛЕНИЕ».

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...