PDO를 사용한 행 수
하다PHP에서 PDO를 사용하여 행 수를 얻는 가장 좋은 방법은 무엇입니까?PDO를 PDO를 입니다.mysql_num_rows
.
fetchAll
대규모 데이터셋을 취급하는 경우가 있기 때문에 사용하기에는 적합하지 않습니다.
제안할 것이 있습니까?
$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
가장 우아한 방법은 아니고, 추가 질문도 필요하죠.
에는 PDO가 있습니다.PDOStatement::rowCount()
MySql에서는 동작하지 않는 것 같습니다.정말 골치 아프네요.
PDO 문서:
대부분의 데이터베이스에서 PDOStatement::rowCount()는 SELECT 문의 영향을 받는 행 수를 반환하지 않습니다.대신 PDO::query()를 사용하여 SELECT COUNT(*) 문을 원하는 SELECT 문과 동일한 술어로 발행한 후 PDOStatement::fetchColumn()을 사용하여 반환되는 행 수를 가져옵니다.그러면 응용 프로그램이 올바른 작업을 수행할 수 있습니다.
편집: 위의 코드 예에서는 준비된 스테이트먼트를 사용하고 있습니다.대부분의 경우 행을 셀 목적으로는 필요하지 않습니다.따라서 다음과 같습니다.
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
아까 비슷한 질문의 답변에서 썼던 것처럼 유일한 이유는mysql_num_rows()
그 정보를 제공하기 위해 내부적으로 모든 행을 가져오고 있었기 때문입니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
PDO 에서는, 다음의 옵션을 사용할 수 있습니다.
- PDO 함수를 사용하여 모든 행을 배열로 가져온 다음
count()
위에. - " " 에 쿼리를 합니다.
SELECT COUNT(*)
79번 - 쿼리가 다음을 수행하지 않는 한 MySQL의 함수를 사용합니다.
SQL_CALC_FOUND_ROWS
★★★LIMIT
와 구에 의해 수)FOUND_ROWS()
을 이용하다그러나 이 기능은 더 이상 사용되지 않으며 나중에 제거됩니다.
흔히 있는 일이지만 이 질문은 매우 혼란스럽다.사람들은 두 가지 다른 작업을 염두에 두고 이곳에 옵니다.
- 테이블에서 몇 개의 행이 있는지 알아야 합니다.
- 쿼리가 행을 반환했는지 여부를 알아야 합니다.
이 두 가지 작업은 공통점이 없고 같은 기능으로 해결할 수 없는 전혀 다른 작업입니다.아이러니하게도, 둘 다 실제는PDOStatement::rowCount()
기능을 사용해야 합니다.
이유를 알아보자
테이블의 행 개수
PDO를 PDO를 사용했을 입니다.
mysql_num_rows()
.
이미 잘못했다는 뜻이지사용.mysql_num_rows()
★★★★★★★★★★★★★★★★★」rowCount()
표의 행 수를 세는 것은 서버 리소스를 소비하는 데 있어 정말 큰 문제가 됩니다.데이터베이스는 디스크에서 모든 행을 읽고 데이터베이스 서버의 메모리를 소비한 다음 이 모든 데이터 더미를 PHP로 전송해야 하며, PHP 프로세스의 메모리도 소비해야 합니다.따라서 서버에 아무런 이유도 없습니다.
또한 행을 선택하여 수를 세는 것은 의미가 없습니다. a.count(*)
대신 쿼리를 실행해야 합니다.데이터베이스는 실제 행을 읽지 않고 인덱스에서 레코드를 카운트하고 한 행만 반환합니다.
이를 위해 승인된 답변에서 제시된 코드가 공평합니다. 단, "추가" 쿼리가 아닌 유일한 쿼리가 실행된다는 사실은 제외합니다.
반환된 행의 수를 세는 중입니다.
두 번째 사용 사례는 다소 의미 없는 것만큼 심각한 것은 아닙니다. 쿼리에서 데이터가 반환되었는지 여부를 확인해야 할 경우 데이터 자체는 항상 보유됩니다.
예를 들어 행을 하나만 선택하는 경우.좋아, 가져온 행을 플래그로 사용할 수 있습니다.
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
많이 에는 행이 많다, 행이 많다, 이 많다, 행이 많다, 행이 필요하다, 라고 하면 됩니다.fetchAll()
.
fetchAll()
세트를 않는 입니다.
네, 물론 첫 번째 사용 사례의 경우 두 배로 나쁠 것입니다.그러나 이미 학습한 바와 같이 행을 카운트하기 위해서만 선택해서는 안 됩니다.rowCount()
않다fetchAll()
.
에는 ,, 택, 택, 택, 선, 선, ,, ,, ,, ,, ,, ,, ,, but, but, but, but, but, but, but, but, but, but, but selected, selected, but, but, but, but, but, but, but, , but,fetchAll()
웹 행을 . 웹 어플리케이션에서는 절대 대량의 행을 선택하지 마십시오.해야 하기 에 이 행을 사용해야 따라서 다음을 사용해야 합니다.LIMIT
,WHERE
"SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL"" 중간 써도 fetchAll()
그리고 이 함수의 결과를 다음과 같은 조건에서 사용합니다.
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
물론 다른 쿼리에서 행이 반환되지 않았는지 여부를 알리기 위해 추가 쿼리를 실행하는 것은 두 가지 상위 답변에서 제시된 바와 같이 완전히 미친 짓입니다.
큰 결과 집합의 행 수 카운트
이와 같이 드문 경우지만 실제로 대량의 행을 선택해야 하는 경우(예를 들어 콘솔응용 프로그램에서), 사용되는 메모리 양을 줄이기 위해 버퍼링되지 않은 쿼리를 사용해야 합니다.하지만 이것은 실제의 경우이다.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>";
}
너무 늦은 감이 있지만 이 문제에 부딪혀서 이렇게 하고 있습니다.
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();
정말 간단하고 쉬워요.:)
이 게시물은 오래되었지만 PDO를 사용하여 php에서 행 수를 얻는 것은 간단합니다.
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
이 게시물은 오래되었지만 대안을 찾는 데 어려움을 겪고 있습니다.특히 PHP와 MySQL이 함께 하는 경향이 있기 때문에 PDO에 이 기능이 없는 것은 매우 유감스러운 일입니다.
fetchColumn()을 사용하면 fetchColumn()이 니들을 다음 행으로 이동하기 때문에 해당 결과 세트를 더 이상 사용할 수 없기 때문에 fetchColumn()을 사용하는 데 불행한 결함이 있습니다.예를 들어 다음과 같은 결과가 나왔을 경우
- 과일->바나나
- 과일->애플
- 과일 -> 오렌지
fetch Column()을 사용하면 3개의 과일이 반환된 것을 알 수 있지만 결과를 루프하면 2개의 열밖에 없습니다.fetch Column()의 가격은 반환된 행의 수를 확인하기 위한 첫 번째 열의 손실입니다.따라서 코딩이 엉성해지고 구현될 경우 완전히 오류가 발생합니다.
따라서 fetchColumn()을 사용하여 완전히 새로운 콜과 MySQL 쿼리를 구현해야 새로운 작업 결과 세트를 얻을 수 있습니다.(마지막 질문 이후로 바뀌지 않았으면 좋겠지만) 그럴 것 같지는 않지만, 그럴 수도 있어요.또한 모든 행 수 검증에 대한 이중 쿼리의 오버헤드.이 예에서는 적은 양이지만 조인된 쿼리로 200만 행을 해석하는 것이 바람직하지 않습니다.
저는 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 SELECT 문에 rowCount()를 사용하는 것은 권장되지 않습니다.
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'];
크레딧은 Mike@codeofaninja.com로 보내집니다.
내의 하려면 , 를 사용해야 .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
첫 번째 엔트리를 돌려받을 수 있는 빠른 라이너 한 대.이것은 매우 기본적인 질의에 적합합니다.
<?php
$count = current($db->query("select count(*) from table")->fetch());
?>
는 는 i i는노노 i i i i i.$count = $stmt->rowCount();
Oracle 11.2 oracle oracle oracle oracle 。루프를 나타나다
$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):" ")."</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;
}
가장 간단한 방법은 두 줄이면 됩니다.
$sql = $db->query("SELECT COUNT(*) FROM tablename WHERE statement='condition'");
echo $sql->fetchColumn();
다른 은 '하다, , 하다, 하다, 하다.rowCount()
안 요.SELECT
에는 심지어다음과 같이 있습니다.
PDOStatement::rowCount()는 대응하는 PDOStatement 개체에 의해 실행된 마지막 DELETE, INSERT 또는 UPDATE 문의 영향을 받는 행 수를 반환합니다.
따라서 다른 질문에는 문제가 없지만SELECT
대부분의 답변에서는 행을 카운트하기 위한 쿼리와 필요한 레코드의 서브셋을 얻기 위한 쿼리를 2개 작성할 것을 제안하고 있습니다.그러나 한 번의 요청으로 행 수와 데이터 하위 집합을 쿼리할 수 있습니다.이것은 코드 골프의 연습이지만, 요구 시간이 다소 비싸고 이러한 요구가 빈번하게 이루어지면 실제로는 2개의 요구보다 효율이 향상될 수 있습니다.
Postgre에 있는 경우SQL은 다음과 같이 깨끗한 JSON 출력을 제공할 수 있습니다.
WITH mytable as (VALUES(1,2,3),(4,5,6),(7,8,9),(10,11,12))
SELECT
jsonb_build_object(
'rowcount', (SELECT count(1) FROM mytable)
,'data', (
SELECT jsonb_agg(data.*)
FROM (
SELECT *
FROM mytable
WHERE column1 > 1 -- pagination offset
ORDER BY column1
LIMIT 2 -- page size
) as data
)
) jsondata
출력:
{"data": [
{
"column1": 4,
"column2": 5,
"column3": 6
},
{
"column1": 7,
"column2": 8,
"column3": 9
}
],
"rowcount": 4
}
postgres가 아닌 경우 이러한 기능은 사용할 수 없지만 다음과 같은 작업을 수행할 수 있습니다.
WITH mytable as (VALUES(1,2,3),(4,5,6),(7,8,9),(10,11,12))
SELECT
(SELECT count(1) FROM mytable) as rowcount
,data.*
FROM (
SELECT *
FROM mytable as mytable(column1, column2, column3)
WHERE column1 > 1 -- pagination offset
ORDER BY column1
LIMIT 2 -- page size
) as data
그러나 행마다 행 카운트가 반환되므로 다소 낭비가 될 수 있습니다.
행수 | 열 1 | 열 2 | 열 3 |
---|---|---|---|
4 | 4 | 5 | 6 |
4 | 7 | 8 | 9 |
다음과 같이 mysql 문에서 카운트(*)를 했을 때
$q = $db->query("SELECT COUNT(*) FROM ...");
당신의 mysql 쿼리는 이미 결과의 수를 세고 있습니다.왜 당신의 mysql 결과를 얻기 위해 다시 php로 계산합니까?
$q = $db->query("SELECT COUNT(*) as counted FROM ...");
$nb = $q->fetch(PDO::FETCH_OBJ);
$nb = $nb->counted;
★★★★★★★★★★★★★★★★★」$nb
로 빠르게 합니다.
편집: 잘못된 투고에 대해 죄송합니다.몇 가지 예에서는 카운트 인을 사용한 쿼리를 나타내고 있습니다.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;
}
마지막 쿼리의 "WHERE" 기준에 포함된 행 수를 검색하는 도우미 기능이 있는 PDO 클래스의 사용자 지정 확장입니다.
다만, 사용하는 커맨드에 따라서는, 「핸들러」를 추가할 필요가 있는 경우가 있습니다.현재 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();
}
}
최적의 메서드를 한 줄 또는 함수로 결합하여 새로운 쿼리를 자동으로 생성할 수 있습니다.
function getRowCount($q){
global $db;
return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn();
}
$numRows = getRowCount($query);
fetch Column()
기록의 수를 얻고 싶을 때 사용하다[기록하다]
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
$res = $conn->query($sql);
$count = $res->fetchColumn(); // ex = 2
쿼리()
데이터 및 레코드 수 [count of record]를 취득하는 경우에 사용합니다.
$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.";
}
간단한 해결책이 있습니다.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();
}
테이블에 몇 개의 행이 있는지 알고 싶을 때 예를 들어 'id' 열이 기본 키로 있는 경우 DB에 대한 쿼리는 다음과 같습니다.
$query = $handler->query("SELECT id FROM your_table_name");
마지막으로 쿼리에 일치하는 행의 양을 얻으려면 다음과 같이 적습니다.
$amountOfRows = $query->rowCount();
또는 다음과 같이 쓸 수 있습니다.
$query = $handler ->query("SELECT COUNT(id) FROM your_table_name");
$amountOfRows = $query->rowCount();
또한 '제품' 표에 가격이 10에서 20 사이인 제품이 몇 개 있는지 알고 싶다면 다음 질문을 작성하십시오.
$query = $handler ->query("SELECT id FROM products WHERE price BETWEEN 10 AND
20");
$amountOfRows = $query->rowCount();
언급URL : https://stackoverflow.com/questions/883365/row-count-with-pdo
'programing' 카테고리의 다른 글
JSON 데이터와 함께 POST를 통해 파일을 다운로드하는 JavaScript/jQuery (0) | 2023.02.03 |
---|---|
안드로이드 개발을 위해 구글 구아바 라이브러리를 사용하는 것이 좋은 생각인가요? (0) | 2023.02.03 |
Amazon S3 업로드 및 URL 가져오기 (0) | 2023.02.03 |
사용자가 입력을 중지할 때까지 .keyup() 핸들러를 지연하려면 어떻게 해야 합니까? (0) | 2023.02.03 |
테이블이 있는 경우 드롭 테이블을 만들고, 없는 경우 테이블만 만듭니다. (0) | 2023.02.03 |