Jak zwrócić liczbę znalezionych wierszy z zapytania SELECT


15

Napisałem funkcję, która ma zwrócić liczbę wierszy znalezionych w zapytaniu SELECT, ale zawsze albo zwraca 0, albo tablicę. Grzebię w tym od około godziny i wciąż nie mogę tego rozgryźć! Jestem pewien, że robię coś głupio złego.

Tabela 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

Jaka jest nazwa tabeli i jej prefiks?
Chittaranjan

@Chittaranjan Nazwa tabeli to wp_postviews_ips, ale nie jestem pewien, co rozumiesz przez prefiks tabeli.
Swen

Usunięcie „$ wpdb->” z $ wpdb-> wp_postviews_ips wydawało się załatwić sprawę!
Swen

Dlatego poprosiłem o nazwę i prefiks tabeli. Wszystkie tabele wordpress mają prefiks, który ustawiasz podczas konfigurowania strony wordpress. Oto więcej szczegółów na temat kodeksu Proszę sprawdzić moją zaktualizowaną odpowiedź z poprawnym użyciem nazwy tabeli.
Chittaranjan

Odpowiedzi:


27

Jeśli tylko próbujesz uzyskać liczbę, $wpdb->get_var();wraz z użyciem COUNT()w sql będzie lepiej:

### 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

Jeśli chodzi o to, co poszło źle w poprzednim przykładzie, nie przypisałeś swojej $wpdb->get_results()instancji do zmiennej, a bez niej $wpdb->num_rows;po prostu zwróci zero, ponieważ tak naprawdę nie pobiera ona z instancji zapytania, a raczej globalny $ wbdb obiekt.

Jeśli chcesz użyć 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

Ale nie widziałbym takiej potrzeby, chyba że potrzebowałbyś wyników, w którym to przypadku po prostu zwróciłbym $ipqueryobiekt i używałbym num_rowsgo, gdy go potrzebowałem:

### 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
Mały dodatek. Zawsze powinieneś używać przygotuj ( developer.wordpress.org/reference/classes/wpdb/prepare ) podczas wykonywania jakichkolwiek zapytań, aby zapobiec wstrzykiwaniu kodu SQL.
Maciej Paprocki

W rzeczywistości nie powinno to być małym dodatkiem, to bardzo ważne, aby nie uczynić twojego kodu możliwym do wykorzystania przez iniekcję sql.
Max Carroll

2

Wygląda na to, że zapytanie jest nieprawidłowe. $ipjest ciągiem, więc powinieneś umieścić pojedynczy cudzysłów, jak poniżej

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

Próbowałem tego i nadal zwraca 0.
Swen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.