Como retornar o número de linhas encontradas da consulta SELECT

8

Eu escrevi uma função que deveria retornar o número de linhas encontradas em uma consulta SELECT, mas ela sempre parece retornar 0 ou uma matriz. Eu tenho brincado com isso por cerca de uma hora agora e eu ainda não consigo descobrir! Tenho certeza de que estou fazendo algo estupidamente errado.

A 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
    
por Swen 29.01.2014 / 16:32

2 respostas

19

Se você está apenas tentando obter uma contagem, $wpdb->get_var(); , além de usar COUNT() no seu sql, será melhor:

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

Quanto ao que deu errado no seu exemplo anterior, você não estava atribuindo sua $wpdb->get_results() instance a uma variável, e sem ela $wpdb->num_rows; iria retornar zero, já que ela não está realmente sendo extraída da instância de a consulta, mas sim o objeto global $ wbdb.

Se você quiser usar 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

Mas eu não veria a necessidade disso, a menos que você precisasse dos resultados. Nesse caso, retornaria o objeto $ipquery e usaria num_rows quando precisasse:

### 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;
    
por eteich 29.01.2014 / 20:12
1

Parece que a consulta está errada. $ip é string, então você deve colocar aspas simples ao redor como abaixo

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
    
por Chittaranjan 29.01.2014 / 17:07