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

¿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;

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'");

Intenté esto y aún devuelve 0.
Swen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.