Cómo obtener el número de filas encontradas en una consulta SELECT
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

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;

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.
