Cómo obtener el número de filas encontradas en una consulta SELECT

29 ene 2014, 17:32:14
Vistas: 125K
Votos: 27

Escribí una función que se supone debe devolver el número de filas encontradas en una consulta SELECT pero siempre parece devolver 0 o un array. ¡He estado intentando resolver esto durante una hora y todavía no puedo solucionarlo! Estoy seguro de que estoy cometiendo algún error tonto.

La Tabla 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

### Buscar IP en la base de datos
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']);
//tanto $id como $_SERVER['REMOTE_ADDR']) devuelven los valores que estoy buscando en la base de datos
4
Comentarios

¿Cuál es el nombre de la tabla y el prefijo de la tabla?

Chittaranjan Chittaranjan
29 ene 2014 18:13:34

@Chittaranjan El nombre de la tabla es wp_postviews_ips, no estoy seguro de a qué te refieres con el prefijo de la tabla.

Swen Swen
29 ene 2014 18:47:27

¡Eliminar "$wpdb->" de $wpdb->wp_postviews_ips parece haber funcionado!

Swen Swen
29 ene 2014 18:59:21

Esa es la razón por la que pedí el nombre de la tabla y el prefijo. Todas las tablas de WordPress tienen un prefijo que configuras durante la instalación del sitio de WordPress. Aquí hay más detalles en el codex. Por favor revisa mi respuesta actualizada con el uso correcto del nombre de la tabla.

Chittaranjan Chittaranjan
29 ene 2014 20:14:24
Todas las respuestas a la pregunta 2
2
54

Si solo estás intentando obtener un conteo, $wpdb->get_var(); junto con usar COUNT() en tu SQL será mejor:

### Buscar IP en la base de datos
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']);
// tanto $id como $_SERVER['REMOTE_ADDR']) devuelven los valores que estoy buscando en la base de datos

En cuanto a lo que salió mal en tu ejemplo anterior, no estabas asignando tu instancia de $wpdb->get_results() a una variable, y sin ella $wpdb->num_rows; simplemente devolverá cero ya que no está obteniendo datos de la instancia de la consulta, sino del objeto global $wpdb.

Si quieres usar get_results():

### Buscar IP en la base de datos
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']);
// tanto $id como $_SERVER['REMOTE_ADDR']) devuelven los valores que estoy buscando en la base de datos

Pero no veo la necesidad de eso a menos que necesites los resultados, en cuyo caso simplemente devolvería el objeto $ipquery y usaría num_rows cuando lo necesitara:

### Buscar IP en la base de datos
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']);
// tanto $id como $_SERVER['REMOTE_ADDR']) devuelven los valores que estoy buscando en la base de datos

echo $someVariable->num_rows;
29 ene 2014 21:12:52
Comentarios

Pequeña adición. Siempre deberías usar prepare (https://developer.wordpress.org/reference/classes/wpdb/prepare/) al ejecutar cualquier consulta para prevenir inyección SQL.

Maciej Paprocki Maciej Paprocki
29 may 2019 15:35:05

En realidad eso no debería ser una pequeña adición, es muy importante no hacer que tu código sea vulnerable a inyección SQL.

Max Carroll Max Carroll
13 sept 2019 00:09:33
1

Parece que la consulta está mal. $ip es una cadena, por lo que deberías poner comillas simples alrededor como se muestra a continuación

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
29 ene 2014 18:07:00
Comentarios

Probé esto y aún devuelve 0.

Swen Swen
29 ene 2014 18:53:20