Cách trả về số lượng hàng tìm thấy từ truy vấn SELECT


13

Tôi đã viết một hàm được cho là trả về số lượng hàng được tìm thấy trong truy vấn CHỌN nhưng nó dường như luôn trả về 0 hoặc một mảng. Tôi đã loay hoay với điều này khoảng một giờ và tôi vẫn không thể hiểu được! Tôi chắc chắn rằng tôi đang làm điều gì đó sai lầm ngu ngốc.

Bảng MySQL

+--------+-------------+---------------------+
| postid |     ip      |        time         |
+--------+-------------+---------------------+
|   1234 | 192.168.0.1 | 2014-01-29 14:27:02 |
|   5678 | 192.168.0.2 | 2014-01-29 14:27:02 |
+--------+-------------+---------------------+

PHP

### Search for IP in database
function postviews_get_ip($id, $ip) {
    global $post, $wpdb;

    $wpdb->get_results("SELECT * FROM $wpdb->wp_postviews_ips WHERE postid = $id AND ip = $ip");

    $rowcount = $wpdb->num_rows;

    return $rowcount;
}

postviews_get_ip($id, $_SERVER['REMOTE_ADDR']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

Tên của bảng và tiền tố bảng là gì?
Chittaranjan

@Chittaranjan Tên bảng là wp_postview_ips, tôi không chắc ý của bạn về tiền tố bảng là gì.
Swen

Xóa "$ wpdb->" khỏi $ wpdb-> wp_postview_ips dường như thực hiện thủ thuật!
Swen

Đó là lý do tôi đã hỏi tên bảng và tiền tố. Tất cả các bảng wordpress có một tiền tố mà bạn thiết lập trong khi thiết lập trang web wordpress. Dưới đây là chi tiết hơn về codex Vui lòng kiểm tra câu trả lời cập nhật của tôi với việc sử dụng đúng tên bảng.
Chittaranjan

Câu trả lời:


25

Nếu bạn chỉ đang cố gắng để có được một số đếm, $wpdb->get_var();cùng với việc sử dụng COUNT()trong sql của bạn sẽ tốt hơn:

### Search for IP in database
function postviews_get_ip($id, $ip) {
    global $post, $wpdb;

    $rowcount = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->wp_postviews_ips WHERE postid = $id AND ip = '$ip'");

    return $rowcount;
}

postviews_get_ip($id, $_SERVER['REMOTE_ADDR']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

Như đã xảy ra lỗi trong ví dụ trước của bạn, bạn không gán $wpdb->get_results()cá thể của mình cho một biến và nếu không nó $wpdb->num_rows;sẽ trả về 0 vì nó không thực sự lấy từ thể hiện của truy vấn, mà là toàn cầu $ wbdb vật.

Nếu bạn muốn sử dụng get_results():

### Search for IP in database
function postviews_get_ip($id, $ip) {
    global $post, $wpdb;

    $ipquery= $wpdb->get_results("SELECT * FROM $wpdb->wp_postviews_ips WHERE postid = $id AND ip = '$ip'");
    $rowcount = $ipquery->num_rows;
    return $rowcount;
}

postviews_get_ip($id, $_SERVER['REMOTE_ADDR']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

Nhưng tôi sẽ không thấy sự cần thiết đó trừ khi bạn cần kết quả, trong trường hợp đó tôi sẽ trả lại $ipqueryđối tượng và sử dụng num_rowsnó khi tôi cần:

### Search for IP in database
function postviews_get_ip($id, $ip) {
    global $post, $wpdb;

    $ipquery = $wpdb->get_results("SELECT * FROM $wpdb->wp_postviews_ips WHERE postid = $id AND ip = '$ip'");
    return $ipquery;
}

$someVariable = postviews_get_ip($id, $_SERVER['REMOTE_ADDR']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

echo $someVariable->num_rows;

1
Bổ sung nhỏ. Bạn nên luôn luôn sử dụng chuẩn bị ( developer.wordpress.org/reference/groupes/wpdb/prepare ) khi thực hiện bất kỳ truy vấn nào để ngăn chặn việc tiêm sql.
Maciej Paprocki

Trên thực tế, đó không phải là một bổ sung nhỏ, điều đó rất quan trọng để không làm cho mã của bạn có thể khai thác thông qua việc tiêm sql.
Max Carroll

2

Có vẻ như truy vấn là sai. $iplà chuỗi vì vậy bạn nên đặt một trích dẫn xung quanh đó như dưới đây

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");

Đã thử điều này và nó vẫn trả về 0.
Swen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.