2012-11-02 41 views
11

Tôi có một PDO đơn giản chuẩn bị truy vấn:có được số hàng với PDO

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->fetch(PDO::FETCH_NUM); 
echo $rows[0]; 

tiếng vang dường như được trở về giá trị ID của bản ghi, không phải là số lượng hồ sơ được trả về bởi các truy vấn?

bất kỳ ý tưởng hay giải thích nào về điều này?

Trả lời

7

PDO::FETCH_NUM: trả về một mảng lập chỉ mục theo số cột như trở lại trong tập kết quả của bạn, bắt đầu từ cột 0

Bạn chưa lấy các đếm hàng.

SELECT COUNT(*) FROM coursescompleted where person=:p 

Truy vấn này sẽ quay trở lại hàng tổng trong $rows[0];

EDIT: hãy xem câu trả lời @ ray. sử dụng count(id) là tốt hơn count(*) cho InnoDB.


Bạn có thể nhận được số lượng hàng theo cách sau, từ truy vấn trước đó của bạn.

$row_count = $result->rowCount(); 

Nhưng được cảnh báo:

Nếu câu lệnh SQL cuối cùng thực hiện bởi các PDOStatement liên quan là một câu lệnh SELECT, một số cơ sở dữ liệu có thể trả lại số hàng trả về bởi câu nói đó. Tuy nhiên, hành vi này không được bảo đảm cho tất cả các cơ sở dữ liệu và không nên dựa vào các ứng dụng di động .

+0

Cảm ơn, hoạt động hoàn hảo. vấn đề của tôi là trong cơ thể của tôi, tôi lấy kết quả returmed bằng cách sử dụng 'while ($ row = $ result-> fetch (PDO :: FETCH_ASSOC))' làm thế nào tôi có thể đạt được cả hai với một truy vấn mysql đơn hoặc tôi cần hai cho mỗi chức năng? Cảm ơn một lần nữa. – Smudger

+0

Tôi không chắc chắn. Bạn có thể thử '$ row_count = $ result-> rowCount();' với truy vấn cũ của bạn không? Một số báo cáo rằng trình điều khiển PDO_MySQL cho phép làm việc, mặc dù tài liệu nói khác đi. –

+0

Nếu điều đó không hiệu quả, tôi nghĩ bạn vẫn có thể đếm các hàng trong PHP khi bạn lặp qua các hàng, trong 'fetch'. Không chắc chắn như thế nào xấu đó là mặc dù. –

2

Hãy thử echo count($rows); làm $rows là một mảng.

Edit:

Để sử dụng kết quả

$rows = $result->fetchAll(/* nothing here */); 
if(count($rows) > 0) { 
    // Show results, perhaps using a foreach($rows as $row) 
} else { 
echo "Sorry, no results found"; 
} 
+1

Điều này sẽ cung cấp cho anh số cột được tìm nạp, tức là 2, mỗi lần. PDOStatement :: fetch() trả về một hàng. PDOStatement :: fetchAll() trả về toàn bộ tập kết quả dưới dạng mảng – Stephen

+1

Đó là câu hỏi đặt ra là "echo có vẻ trả về giá trị ID của bản ghi", không phải số lượng bản ghi được trả về bởi truy vấn? " –

+0

Mặc dù tôi cho rằng nó không giống như anh ta thực sự cần các nội dung truy vấn, do đó, một SQL 'count()' là thích hợp hơn. –

16

Bạn đã thực hiện một truy vấn mà trả về các hàng từ cơ sở dữ liệu, lấy hàng đầu tiên từ kết quả vào một biến và sau đó echo'd cột đầu tiên của hàng đó.

Nếu bạn muốn đếm, làm một số SQL()

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rowCount = $result->fetchColumn(0); 
echo $rowCount; 
3

Giả sử id là việc sử dụng khóa chính:

SELECT COUNT(id) FROM coursescompleted WHERE person=:p; 

Tránh count (*). Nếu công cụ lưu trữ của bạn là InnoDB (có thể là những người khác ngoại trừ MyIsam), bạn sẽ có một hit hiệu suất.

+0

Bạn có chắc chắn có một hit hiệu suất? [Câu trả lời này] (http://stackoverflow.com/a/1697144/759019) nói cách khác, cho mysql. –

+1

@Cthulhu Tôi chắc chắn. MyISAM có thể đếm (*) và đếm (id) nếu id là một PK trong cùng một khoảng thời gian (bảng bộ nhớ quá tốt với số (*)), nhưng nếu bảng của bạn là công cụ lưu trữ Innodb bạn sẽ để bắn chân của bạn: http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ – Ray

-2

Bạn có thể sử dụng này

<?php 
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->rowCount(); 
echo $rows; 
?> 

Điều này đôi khi không hoạt động trên SELECT truy vấn. Nhưng dựa trên kinh nghiệm cá nhân, và kể từ khi bạn không đề cập đến việc chuyển nó sang các hệ thống cơ sở dữ liệu khác, nó sẽ hoạt động trên MySQL.

Thông tin khác nằm trong hướng dẫn sử dụng PHP here

Các vấn đề liên quan