2009-03-23 47 views
16

Tôi sử dụng SQL_CALC_FOUND_ROWS trong câu lệnh SELECT Mysql, để lấy số dòng mà SELECT của tôi sẽ trả về mà không có mệnh đề LIMIT.SQL_CALC_FOUND_ROWS/FOUND_ROWS() không hoạt động trong PHP

$sql = new mysqli('localhost', 'root', ''); 
$sql->select_db('mysql'); 
$s1 = $sql->query('select SQL_CALC_FOUND_ROWS * from db limit 0, 3'); 
$s2 = $sql->query('select FOUND_ROWS()'); 
if($row = $s2->fetch_row()) printf('%d/%d', $s1->num_rows, $row[0]); 

Trên trạm phát WinXP của tôi, nó trả về 3/0 mỗi lần trong vài tuần. Khi tôi sử dụng một máy chủ MySQL khác từ trạm của tôi, nó cũng trả về 3/0. Trên máy tính của anothers, cùng một mã chạy tốt, và trả về đúng số (ví dụ 3/17, nếu tôi có 17 bản ghi trong bảng mysql.db). Mỗi máy tính XP có cùng phiên bản PHP/Mysql, và nó chạy tốt trong quá khứ trên máy tính của tôi Sử dụng Trình duyệt truy vấn Mysql với cùng các truy vấn SQL tôi nhận được đúng số.

Có ai có thể cho tôi ý tưởng về giải pháp, không cài đặt lại tất cả không?

Rất tiếc, yêu cầu trước của tôi không rõ ràng lắm.

+1

Bạn có thể bao gồm mã PHP của bạn? Bạn có chắc chắn yêu cầu đếm bằng cách sử dụng tài nguyên kết nối cơ sở dữ liệu giống như tài nguyên được sử dụng cho truy vấn không? –

+0

Câu hỏi của bạn thiếu lỗi được tạo ra và mã bạn đang sử dụng, không thích. – TravisO

+0

@PaulDixon Cảm ơn Paul! Trong mã .net của chúng tôi, chúng tôi luôn tạo kết nối mới để ngay sau khi tôi đọc nhận xét của bạn, tôi biết đó phải là vấn đề của tôi. –

Trả lời

14

Cảm ơn bạn.

Khi tôi chạy một cái gì đó tương tự như ví dụ của bạn trên dòng lệnh mysql, nó sẽ hoạt động; nhưng chạy nó từ php, nó không thành công. Truy vấn thứ hai phải "biết về" cái đầu tiên, vì vậy tôi hình dung bằng cách nào đó rằng sự bền bỉ/bộ nhớ liên kết hai truy vấn đã bị sai lầm bởi php.

(Hóa ra Wordpress sử dụng kiểu truy vấn này để phân trang - vì vậy vấn đề lớn hơn của chúng tôi là việc phân trang trong cài đặt wordpress đột ngột ngừng hoạt động khi chúng tôi chuyển sang php 5.2.6 ... tới hàm FOUND_ROWS()).

Chỉ vì lợi ích của việc đăng bài cho những người có thể gặp phải vấn đề này trong tương lai ... với tôi đó là cài đặt php "mysql.trace_mode" - cài đặt mặc định "bật" này trong 5.2.6 thay vì "tắt" như trước đây và vì một số lý do ngăn FOUND_ROWS() hoạt động.

Là một "sửa chữa", chúng ta có thể hoặc là đặt điều này trong mỗi trang php (trên thực tế, trong một chung "bao gồm"):

ini_set("mysql.trace_mode", "0"); 

hoặc thêm này đến.htaccess:

php_value mysql.trace_mode "0" 

Cảm ơn một lần nữa, Jerry

+0

Tốt !! Cảm ơn, đó là giải pháp đúng –

8

Bạn có đang sử dụng phương pháp truy vấn MySQL cho phép nhiều truy vấn không.

Từ tài liệu MySQL.

Để có được số hàng này, bao gồm một tùy chọn SQL_CALC_FOUND_ROWS trong câu lệnh SELECT, và sau đó gọi FOUND_ROWS() sau

Ví dụ:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name 
    -> WHERE id > 100 LIMIT 10; 
mysql> SELECT FOUND_ROWS(); 

Cũng chỉ để cho vui, có một cuộc thảo luận lớn về điều kiện chủng tộc của việc sử dụng FOUND_ROWS()here.

+0

Điều kiện cuộc đua được mong đợi, nhưng tôi nghi ngờ không thực sự quan trọng đối với một hoạt động như thế này. Mặc dù vậy, tốt để được nhận thức. – Oddman

0

W ell, đó là một vấn đề với phần mở rộng mysql php đi kèm với php 5.2.6. Mysqli chạy tốt, và một phiên bản php nữa. Xin lỗi vì tiếng ồn và câu hỏi không rõ ràng.

Nếu bạn gặp vấn đề tương tự, lời khuyên của tôi là cài đặt lại PHP hoặc thay đổi phiên bản.

2

Một cách khác là sử dụng mysqli_multi_query như đã nêu trong cuốn hướng dẫn PHP bằng cách thông qua cả các truy vấn chứa SQL_CALC_FOUND_ROWS và FOUND_ROWS tách bằng dấu chấm phẩy

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM db limit 0, 3;"; 
$query .= "SELECT FOUND_ROWS()"; 

/* execute multi query */ 
if ($mysqli->multi_query($query)) { 
    do { 
     /* store first result set */ 
     if ($result = $mysqli->store_result()) { 
      while ($row = $result->fetch_row()) { 
       printf("%s\n", $row[0]); 
      } 
      $result->free(); 
     } 
     /* print divider */ 
     if ($mysqli->more_results()) { 
      printf("-----------------\n"); 
     } 
    } while ($mysqli->next_result()); 
} 

/* close connection */ 
$mysqli->close(); 
?> 
+1

Tôi nghĩ rằng nó phải được SELECT FOUND_ROWS() –

+0

Cảm ơn James F, tôi đã thực hiện một sự điều chỉnh. –

0

Giải pháp nhanh nhất là truy vấn truy vấn thực tế của bạn như thế này:

SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT whatever FROM whatever WHERE whatever LIMIT whatever) ax; 
select FOUND_ROWS(); 

Bây giờ bạn sẽ nhận được kết quả chính xác. Tôi cho rằng lý do chính là SQL_CALC_FOUND_ROWS chủ yếu theo dõi các hàng được tìm thấy (nghĩa là không có LIMITS) không trả lại hàng.

0

Tôi gặp vấn đề tương tự. Giải pháp là ngu ngốc, tôi đã sử dụng $wpdb->query thay vì $wpdb->get_var. Vì vậy, bạn muốn làm

$wpdb->get_var('select FOUND_ROWS()'); 

nếu bạn đang ở trên WordPress

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