2010-05-27 29 views
9

Tôi đang cố gắng viết một bộ xử lý cơ sở dữ liệu PHP-MySQL có phần thông minh. Khi bộ xử lý này quyết định nó cần phải thực hiện một bản cập nhật, tôi muốn báo cáo nếu nó thực sự thành công hay không. Tôi nghĩ tôi có thể sử dụng mysql_affected_rows ...PHP, MySQL - bạn có thể phân biệt giữa các hàng phù hợp và hàng bị ảnh hưởng không?

// Example: 
// After running query "UPDATE mytable SET name='Test' WHERE ID=1" 
$result = mysql_affected_rows(); 
if ($result >= 1) { /* Success */ } 

Nếu, ví dụ, không có hàng với ID = 1, sau đó $result sẽ .

Tuy nhiên, nó chỉ ra rằng PHP mysql_affected_rows là hàng bị ảnh hưởng thực tế, và có thể vẫn còn được nếu hàng tồn tại nhưng name đã là "Test". (Các PHP docs thậm chí nói đây là trường hợp).

Nếu tôi chạy này trong dòng lệnh, tôi nhận được thông tin meta sau về truy vấn:

Query OK, 0 rows affected (0.01 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 

Có cách nào cho tôi để nhận được rằng "Hàng xuất hiện" giá trị trong PHP thay vì bị ảnh hưởng hàng?

[Chỉnh sửa]: Tôi cần lưu ý rằng tôi biết tôi có thể chạy truy vấn riêng, nhưng tôi không muốn làm điều đó, vì lợi ích của hiệu suất.

Trả lời

12

Từ MySQL documentation cho mysql_affected_rows:

Đối với câu lệnh UPDATE, nếu bạn chỉ định cờ CLIENT_FOUND_ROWS khi kết nối với mysqld, mysql_affected_rows() trả về số hàng kết hợp bởi mệnh đề WHERE . Nếu không, hành vi mặc định là trả về số lượng hàng thực sự đã thay đổi.

Với mysqli, bạn có thể chỉ định CLIENT_FOUND_ROWS sử dụng mysqli::real_connect.

$db = mysqli_init(); 
$db->real_connect('host', 'username', 'password', 'dbname', '3306', null, MYSQLI_CLIENT_FOUND_ROWS); 

Trong PDO, hằng số được đặt tên PDO :: MYSQL_ATTR_FOUND_ROWS

$db = new PDO('mysql:dbname=mydatabase;host=myhost', 'username', 'password', array(
    PDO::MYSQL_ATTR_FOUND_ROWS => true 
)); 

Với cái cũ và bị phản đối mở rộng MySQL, bạn có thể chỉ định CLIENT_FOUND_ROWS đi qua các giá trị 2 như tham số thứ 5 cho mysql_connect (source).

+0

Điều này thật tuyệt. Trong khi nó không cung cấp cho tôi một cách để phân biệt giữa hai (vì vậy tôi sẽ kiểm tra nó trước khi chấp nhận câu trả lời) có vẻ như tôi là điều kiện thích hợp hơn trong trường hợp của tôi. Cảm ơn! – Nicole

+0

Tôi thích câu trả lời của anh ấy tốt hơn tôi! :) – Sev

+0

PHP lib là một trình bao bọc trong suốt trên MySQL C api lib, bạn thực sự có thể đọc các tài liệu MySQL để hiểu rõ hơn về PHP/MySQL api – bobobobo

6

Bạn cũng có thể sử dụng chức năng

$variable = mysql_info(); 

Đó là chức năng lấy một chuỗi như thế này:

Hàng xuất hiện: 1 Changed: 0 Cảnh báo: 0

Bạn có thể làm việc với chuỗi chức năng trên biến của bạn để trích xuất chuỗi con với số hàng phù hợp và bạn nên có nó!

+1

Cảm ơn, điều đó đã giúp tôi rất nhiều. Bạn cũng có thể so khớp với em như thế: 'preg_match ('/^\ D + (\ d +) \ D + (\ d +) \ D + (\ d +) $ /', $ biến, $ khớp); ' – Anonymous

+0

Sử dụng' $ mysqliObject- > thông tin' khi sử dụng phần mở rộng 'mysqli' mới hơn. –

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