Cómo devolver el número de filas encontradas de la consulta SELECT

15

Escribí una función que se supone que devuelve el número de filas encontradas en una consulta SELECT, pero siempre parece devolver 0 o una matriz. ¡He estado jugando con esto durante aproximadamente una hora y todavía no puedo resolverlo! Estoy seguro de que estoy haciendo algo estúpidamente mal.

La tabla de 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
fuente
¿Cuál es el nombre de la tabla y el prefijo de la tabla?
Chittaranjan
@Chittaranjan El nombre de la tabla es wp_postviews_ips, aunque no estoy seguro de qué quieres decir con prefijo de tabla.
Swen
¡Eliminar "$ wpdb->" de $ wpdb-> wp_postviews_ips parecía hacer el truco!
Swen
Esa es la razón por la que solicité el nombre y el prefijo de la tabla. Todas las tablas de wordpress tienen un prefijo que se establece durante la configuración del sitio de wordpress. Aquí hay más detalles sobre el códice. Compruebe mi respuesta actualizada con el uso correcto del nombre de la tabla.
Chittaranjan

Respuestas:

27

Si simplemente está tratando de obtener un recuento, $wpdb->get_var();junto con el uso COUNT()en su sql será mejor:

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

En cuanto a lo que salió mal en su ejemplo anterior, no estaba asignando su $wpdb->get_results()instancia a una variable, y sin ella $wpdb->num_rows;solo devolverá cero, ya que en realidad no se extrae de la instancia de la consulta, sino más bien el $ wbdb global objeto.

Si quieres 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

Pero no vería la necesidad de eso a menos que necesite los resultados, en cuyo caso simplemente devolvería el $ipqueryobjeto y lo usaría num_rowscuando lo necesitara:

### 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
fuente
1
Pequeña adición. Siempre debe usar prepare ( developer.wordpress.org/reference/classes/wpdb/prepare ) al ejecutar cualquier consulta para evitar la inyección de sql.
Maciej Paprocki
En realidad, eso no debería ser una pequeña adición, eso es muy importante para no hacer que su código sea explotable mediante inyección SQL.
Max Carroll
2

Parece que la consulta es incorrecta. $ipes una cadena, por lo que debe poner una comilla simple alrededor de eso como a continuación

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
Chittaranjan
fuente
Intenté esto y aún devuelve 0.
Swen