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

15

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. Estou brincando com isso há cerca de uma hora e 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
Swen
fonte
Qual é o nome da tabela e o prefixo da tabela?
Chittaranjan 29/01
@Chittaranjan O nome da tabela é wp_postviews_ips, mas não sei o que você quer dizer com prefixo da tabela.
Swen
Remover "$ wpdb->" de $ wpdb-> wp_postviews_ips parecia fazer o truque!
Swen
Foi por isso que pedi o nome e o prefixo da tabela. Todas as tabelas do wordpress têm um prefixo que você define durante a configuração do site do wordpress. Aqui estão mais detalhes sobre o codex. Verifique minha resposta atualizada com o uso correto do nome da tabela.
Chittaranjan 29/01

Respostas:

27

Se você está apenas tentando obter uma contagem, o $wpdb->get_var();uso COUNT()do 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 exemplo anterior, você não estava atribuindo sua $wpdb->get_results()instância a uma variável e, sem ela, $wpdb->num_rows;retornará zero, pois na verdade não é extraído da instância da consulta, mas sim o $ wbdb global objeto.

Se você deseja 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, eu retornaria o $ipqueryobjeto e o usaria num_rowsquando necessário:

### 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;
eteich
fonte
1
Pequena adição. Você sempre deve usar o prepare ( developer.wordpress.org/reference/classes/wpdb/prepare ) ao executar qualquer consulta para evitar a injeção de sql.
Maciej Paprocki
Na verdade, isso não deve ser uma pequena adição, é muito importante para não tornar seu código explorável via injeção de sql.
Max Carroll
2

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

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
Chittaranjan
fonte
Tentei isso e ele ainda retorna 0.
Swen