นับแถวด้วย PDO


192

มีข้อความที่ขัดแย้งมากมายอยู่รอบตัว วิธีที่ดีที่สุดในการนับแถวโดยใช้ PDO ใน PHP คืออะไร? ก่อนที่จะใช้ 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 ช่างเจ็บปวดเหลือเกิน

จาก PDO Doc:

สำหรับฐานข้อมูลส่วนใหญ่ PDOStatement :: rowCount () จะไม่ส่งคืนจำนวนแถวที่ได้รับผลกระทบจากคำสั่ง SELECT ให้ใช้ PDO :: query () เพื่อออกคำสั่ง SELECT COUNT (*) ที่มีภาคแสดงเหมือนคำสั่ง SELECT ที่คุณต้องการจากนั้นใช้ PDOStatement :: fetchColumn () เพื่อดึงจำนวนแถวที่จะถูกส่งกลับ แอปพลิเคชันของคุณสามารถทำการกระทำที่ถูกต้อง

แก้ไข: ตัวอย่างโค้ดข้างต้นใช้คำสั่งที่เตรียมไว้ซึ่งในหลายกรณีอาจไม่จำเป็นสำหรับการนับแถวดังนั้น:

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

นี่จะหมายถึงการทำแบบสอบถามฐานข้อมูลเพิ่มเติม ฉันคิดว่าเขาได้ทำแบบสอบถามเลือกแล้วและตอนนี้ต้องการที่จะรู้ว่ากี่คืนแถว
nickf

1
nickf ถูกต้อง mysql_num_rows () จะไม่ทำงานเมื่อใช้ PDO
James

ทรูมันนี่เห็นได้ชัดว่ามี PDOStatement :: rowCount () แต่ที่ไม่ได้ทำงานใน MySQL
karim79

11
ใช้วิธีการนี้fetchColumn()คืนค่าสตริง "1234" ... EDIT ของคุณมีecho count($nRows);- count()คือฟังก์ชันอาร์เรย์: P ฉันยังแนะนำให้พิมพ์การหล่อผลลัพธ์จากfetchColumn()เป็นจำนวนเต็ม $count = (int) $stmt->fetchColumn()
Cobby

1
@ karim79 วิธีคำสั่งที่ไม่ได้เตรียมไว้จะส่งคืน 1 เท่านั้นแทนที่จะเป็นจำนวนแถวที่แท้จริง คำสั่งที่เตรียมไว้ใช้งานได้ดี มีปัญหาอะไรบ้าง?
SilentAssassin

86

อย่างที่ฉันได้เขียนไว้ก่อนหน้านี้ในคำตอบของคำถามที่คล้ายกันเหตุผลเดียวที่mysql_num_rows()ทำงานได้ก็เพราะมันดึงข้อมูลภายในแถวทั้งหมดมาให้ข้อมูลนั้นถึงคุณแม้ว่ามันจะดูไม่เหมือนคุณก็ตาม

ดังนั้นใน PDO ตัวเลือกของคุณคือ:

  1. ใช้FOUND_ROWS()ฟังก์ชั่นของ MySQL
  2. ใช้fetchAll()ฟังก์ชั่นของ PDO เพื่อดึงแถวทั้งหมดลงในอาร์เรย์จากนั้นใช้count()บน
  3. ทำแบบสอบถามเพิ่มเติมเพื่อSELECT COUNT(*)ตามที่แนะนำ karim79

8
ขอบคุณที่ให้การศึกษาเพิ่มเติมเกี่ยวกับ mysql_num_rows () ดูเหมือนว่าอาจเป็นปัญหาคอขวดที่สำคัญที่ฉันให้กับตัวเอง ขอบคุณอีกครั้ง.
James

2
fetch_all จริง ๆ แล้วคือ fetchAll () :)
ไดนามิก

2
ตัวเลือก 2 ไม่แนะนำให้เลือกหากผลลัพธ์มีขนาดใหญ่
Edson Horacio Junior

FOUND_ROWS () จะถูกลบออกจาก MySQL ดังนั้นโปรดตรวจสอบลิงก์ไปที่ FOUND_ROWS ก่อนที่จะใช้สิ่งนี้หากคุณคุ้นเคยกับสิ่งนี้แล้ว
Anatak

29

บ่อยครั้งที่มันเกิดขึ้นคำถามนี้ทำให้สับสนเหมือนเป็นนรก ผู้คนมาที่นี่โดยมีงานสองอย่างที่ต่างกันในใจ:

  1. พวกเขาจำเป็นต้องรู้จำนวนแถวในตาราง
  2. พวกเขาจำเป็นต้องรู้ว่าแบบสอบถามส่งคืนแถวใด ๆ หรือไม่

นั่นเป็นงานที่แตกต่างกันสองอย่างที่ไม่มีอะไรเหมือนกันและไม่สามารถแก้ไขได้ด้วยฟังก์ชั่นเดียวกัน กระแทกแดกดันสำหรับพวกเขาทั้งPDOStatement::rowCount()ฟังก์ชั่นที่แท้จริงจะต้องมีการใช้

มาดูกันว่าทำไม

การนับแถวในตาราง

ก่อนที่จะใช้ PDO mysql_num_rows()ฉันเพียงแค่ใช้เพียง

หมายความว่าคุณอยู่แล้วทำมันผิด การใช้mysql_num_rows()หรือrowCount()นับจำนวนแถวในตารางเป็นภัยพิบัติจริงในแง่ของการใช้ทรัพยากรเซิร์ฟเวอร์ ฐานข้อมูลต้องอ่านแถวทั้งหมดจากดิสก์ใช้หน่วยความจำบนเซิร์ฟเวอร์ฐานข้อมูลจากนั้นส่งข้อมูลทั้งหมดไปที่ PHP ใช้หน่วยความจำของกระบวนการ PHP เช่นกันทำให้เซิร์ฟเวอร์ของคุณไม่มีภาระแน่นอน
นอกจากนี้การเลือกแถวเพื่อนับพวกเขาก็ไม่สมเหตุสมผล 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 รายการ
Andres SK

4
@andufo มันไม่ได้เป็น โปรดจำไว้ว่า: นักพัฒนาไม่ควรทำเช่นนี้ คำค้นหาไม่ควรส่งคืนแถวที่ 284 ทั้งหมด 15 จะต้องถูกส่งคืนเพื่อแสดงและหนึ่งแถวจากแบบสอบถามแยกต่างหากเพื่อบอกว่าพบ 284
สามัญสำนึกของคุณ

2
นี่เป็นจุดที่ดีมาก - ใช้งานง่ายในตอนแรก แต่ใช้ได้จริง คนส่วนใหญ่ลืมว่าการสืบค้น SQL แบบง่าย ๆ สองวิธีนั้นเร็วกว่าการสืบค้นที่ใหญ่กว่าเล็กน้อย หากต้องการพิสูจน์ความถูกต้องของการนับคุณจะต้องมีคิวรีช้ามากซึ่งไม่สามารถปรับให้เหมาะสมและจะให้ผลลัพธ์ที่น้อย ขอบคุณสำหรับการชี้ให้เห็น!
PeerBr

@ สามัญสำนึกของคุณ: คุณต้องแน่ใจว่า: จะไม่เรียกทั้งหมด () เป็นความคิดที่ไม่ดีถ้าชุดผลลัพธ์มีขนาดใหญ่มาก? จะดีกว่าหรือไม่ถ้าใช้ fetch () เพื่อรับข้อมูลอย่างต่อเนื่อง
timmornYE

@ timmornYE นั่นคือสิ่งที่ถูกพูดในย่อหน้าสุดท้ายของคำตอบของฉัน
สามัญสำนึกของคุณ

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

โพสต์นี้เก่า แต่การรับจำนวนแถวเป็น php ด้วย PDO นั้นง่ายมาก

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

3
ดูเอกสารที่ยกมาในคำตอบของ karim79 บางครั้งใช้งานได้ แต่ไม่น่าเชื่อถือ
ตุลาคม

5

นี่คือโพสต์เก่า แต่ได้รับความผิดหวังมองหาทางเลือก โชคไม่ดีที่ PDO ขาดคุณสมบัตินี้โดยเฉพาะอย่างยิ่ง PHP และ MySQL มักจะจับมือกัน

มีข้อบกพร่องที่โชคร้ายในการใช้ fetchColumn () เนื่องจากคุณไม่สามารถใช้ชุดผลลัพธ์นั้นได้อย่างมีประสิทธิภาพอีกต่อไปในขณะที่ fetchColumn () ย้ายเข็มไปยังแถวถัดไป ตัวอย่างเช่นถ้าคุณมีผลลัพธ์ที่คล้ายกับ

  1. ผลไม้> กล้วย
  2. ผลไม้> แอปเปิ้ล
  3. ผลไม้> ออเรนจ์

หากคุณใช้ fetchColumn () คุณจะพบว่ามีผลไม้ 3 รายการที่ส่งคืน แต่ถ้าคุณวนซ้ำผลการค้นหาคุณมีสองคอลัมน์เท่านั้นราคาของ fetchColumn () คือการสูญเสียคอลัมน์แรกของผลลัพธ์เพื่อค้นหา แสดงจำนวนแถวที่คืน สิ่งนี้นำไปสู่การเขียนโค้ดที่เลอะเทอะและผลการค้นหาที่ผิดพลาดหากนำไปใช้

ดังนั้นตอนนี้การใช้ fetchColumn () คุณจะต้องนำไปใช้และการโทรใหม่และการสืบค้น MySQL ทั้งหมดเพื่อให้ได้ผลลัพธ์การทำงานที่สดใหม่ (ซึ่งหวังว่าจะไม่เปลี่ยนแปลงตั้งแต่การค้นหาครั้งล่าสุดของคุณ) ฉันรู้ว่าไม่น่าจะเกิดขึ้น แต่สามารถเกิดขึ้นได้ นอกจากนี้ค่าใช้จ่ายของแบบสอบถามแบบคู่ในการตรวจสอบความถูกต้องนับแถวทั้งหมด ซึ่งสำหรับตัวอย่างนี้มีขนาดเล็ก แต่แยกวิเคราะห์ 2 ล้านแถวในคิวรีที่เข้าร่วมไม่ใช่ราคาที่น่าพอใจ

ฉันรัก PHP และสนับสนุนทุกคนที่เกี่ยวข้องในการพัฒนาเช่นเดียวกับชุมชนขนาดใหญ่ที่ใช้ PHP เป็นประจำทุกวัน แต่หวังว่าจะได้รับการแก้ไขในรุ่นอนาคต นี่คือ 'จริง ๆ ' ของฉันร้องเรียนเฉพาะกับ PHP PDO ซึ่งเป็นชั้นดี


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

GL


0

เมื่อเป็นเรื่องของ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


-1

ซับด่วนหนึ่งอันเพื่อรับคืนแรก นี่เป็นสิ่งที่ดีสำหรับข้อความค้นหาทั่วไป

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

การอ้างอิง


-1

ฉันลอง$count = $stmt->rowCount();กับ Oracle 11.2 และมันไม่ทำงาน ฉันตัดสินใจใช้ลูป for ดังแสดงด้านล่าง

   $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

มีวิธีง่ายๆคือ ถ้าคุณใช้ 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();
}

จากนั้นแบบสอบถามไปยัง DB จะเป็น:

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

และในที่สุดการนับแถวที่ตรงกับคำค้นหาของคุณเขียนแบบนี้

$amountOfRows = $query->rowcount();

เหตุใดจึงคืนฉัน -1 ส่วนใหญ่ แม้ว่าจะมีข้อมูล .
Ingus

-1

fetchColumn ()

ใช้ถ้าต้องการรับจำนวนเร็กคอร์ด[effisien]

$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

เมื่อคุณสร้าง 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 ของคุณนานสักหน่อยในการเขียน แต่ดำเนินการอย่างรวดเร็ว

แก้ไข: ขออภัยสำหรับการโพสต์ผิด แต่เป็นตัวอย่างที่แสดงแบบสอบถามด้วยการนับผมแนะนำให้ใช้ผลลัพธ์ 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;
}

1
คำถามคือวิธีการที่จะได้รับการนับเมื่อคุณไม่ได้ทำให้ COUNT (*) ในงบ MySQL ของคุณ
สามัญสำนึกของคุณ

-2

ต่อไปนี้เป็นส่วนขยายที่กำหนดเองของคลาส PDO โดยมีฟังก์ชันตัวช่วยเพื่อดึงข้อมูลจำนวนแถวที่รวมอยู่ในเกณฑ์ "WHERE" ของแบบสอบถามล่าสุด

คุณอาจต้องเพิ่ม 'ตัวจัดการ' เพิ่มเติมขึ้นอยู่กับคำสั่งที่คุณใช้ ตอนนี้ใช้งานได้กับคำค้นหาที่ใช้ "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();
    }
}

ปัญหาไม่คุ้มค่ากับความพยายาม จำนวนดังกล่าวเป็นสิ่งจำเป็นดังนั้นไม่ค่อยว่าใครไม่จำเป็นต้องมีการขยายเฉพาะ ไม่พูดถึงมันไม่รองรับข้อความที่เตรียมไว้ - เหตุผลเดียวที่ใช้ PDO
สามัญสำนึกของคุณ

-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
นี่เป็นความคิดที่แย่จริงๆ การเลือกทุกแถวมันทำให้เสียแบนด์วิดท์ใหญ่
Nafees

-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:

Usen parametro array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL), บาป 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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.