Come restituire il numero di righe trovate dalla query SELECT


15

Ho scritto una funzione che dovrebbe restituire il numero di righe trovate in una query SELECT ma sembra sempre restituire 0 o un array. Ci sto scherzando da circa un'ora ormai e non riesco ancora a capirlo! Sono sicuro che sto facendo qualcosa di stupidamente sbagliato.

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

Qual è il nome della tabella e il prefisso della tabella?
Chittaranjan,

@Chittaranjan Il nome della tabella è wp_postviews_ips, ma non sono sicuro di cosa intendi per prefisso della tabella.
Swen,

Rimuovere "$ wpdb->" da $ wpdb-> wp_postviews_ips sembra fare il trucco!
Swen,

Questo è il motivo per cui avevo chiesto il nome e il prefisso della tabella. Tutte le tabelle di wordpress hanno un prefisso impostato durante l'impostazione del sito di wordpress. Ecco ulteriori dettagli sul codice . Controlla la mia risposta aggiornata con l'uso corretto del nome della tabella.
Chittaranjan,

Risposte:


27

Se stai semplicemente cercando di ottenere un conteggio, $wpdb->get_var();insieme all'uso COUNT()nel tuo sql sarà meglio:

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

Per quanto riguarda ciò che è andato storto nel tuo esempio precedente, non stavi assegnando la tua $wpdb->get_results()istanza a una variabile, e senza di essa $wpdb->num_rows;restituirà zero poiché non sta effettivamente estraendo dall'istanza della query, ma piuttosto il $ wbdb globale oggetto.

Se vuoi usare 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

Ma non ne vedrei la necessità se non avessi bisogno dei risultati, nel qual caso restituirei l' $ipqueryoggetto e lo utilizzerei num_rowsquando ne avevo bisogno:

### 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
Piccola aggiunta. Quando si eseguono domande per prevenire l'iniezione di sql, è necessario utilizzare sempre preparazione ( developer.wordpress.org/reference/classes/wpdb/prepare ).
Maciej Paprocki,

In realtà non dovrebbe essere una piccola aggiunta, è molto importante non rendere sfruttabile il tuo codice tramite l'iniezione sql.
Max Carroll,

2

Sembra che la query sia errata. $ipè una stringa, quindi dovresti inserire una virgoletta singola attorno a quella come di seguito

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");

Ho provato questo e restituisce ancora 0.
Swen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.