2012-03-01 32 views
6

Tôi đang gặp sự cố với tuyên bố đã chuẩn bị PDO và rowCount trả lại số hàng bị ảnh hưởng không chính xác.Hàng PDOCount không trả lại số hàng bị ảnh hưởng chính xác

Tôi có một cơ sở dữ liệu thử nghiệm đơn giản của:

create table test (
    boolean var1; 
); 

Sau đó, tôi đã mã kiểm tra sau:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 
$sth->execute(array(':val' => true)); 
echo $sth->rowCount(); 

nào trả về như mong đợi: 1 rows affected

Và khi tôi chèn loại không hợp lệ và Chèn không thành công:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 
$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

nào trả về như mong đợi: 0 rows affected

Tuy nhiên, Khi tôi có nhiều chèn -

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 

$sth->execute(array(':val' => true)); 
echo $sth->rowCount() . ", "; 

$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

Kết quả trong: 1, 1

Và nếu tôi lật trật tự thực hiện tôi nhận được : 0, 1

Tại sao rowCount() - hàng bị ảnh hưởng không được thiết lập để không trên một tuyên bố thất bại sau một succe ss tuyên bố?

Tôi đang chạy php 5.3.6-13 và PostgreSQL 9.1

+1

Chỉ cần bật ngoại lệ đối với PDO và nhận được một cách tốt hơn xử lý các trường hợp như vậy – zerkms

+1

Điều này có ý nghĩa với tôi vì bạn đã sử dụng lại cùng một PDOStatement. Nếu bạn cần một rowCount riêng cho mỗi câu lệnh, thì hãy chuẩn bị câu lệnh thứ hai. – Ozzy

Trả lời

2

Dường như với tôi rằng $sth->execute(array(':val' => true)) hoàn tất thành công do đó tăng rowCount, nhưng $sth->execute(array(':val' => 20)) không. Đây là trạng thái của rowCount cho $sth ở từng giai đoạn:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 

# No successful DML queries have been done with the $sth yet. 
# rowCount == 0 

$sth->execute(array(':val' => true)); 
echo $sth->rowCount() . ", "; 

# rowCount increases because of a successful INSERT statement 
# rowCount == 1 

$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

# rowCount does not increase due to failed INSERT statement 
# rowCount == 1 

Bây giờ, cho phép nhìn vào đó theo thứ tự ngược lại:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 

# No successful DML queries have been done with the $sth yet. 
# rowCount == 0 

$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

# rowCount does not increase due to failed INSERT statement 
# rowCount == 0 

$sth->execute(array(':val' => true)); 
echo $sth->rowCount() . ", "; 

# rowCount increases because of a successful INSERT statement 
# rowCount == 1 
Các vấn đề liên quan