Come ottenere il numero di righe trovate da una query SELECT

29 gen 2014, 17:32:14
Visualizzazioni: 125K
Voti: 27

Ho scritto una funzione che dovrebbe restituire il numero di righe trovate in una query SELECT ma sembra sempre restituire 0 o un array. Ho provato a sistemarlo per circa un'ora ma non riesco ancora a capire dove sia il problema! Sono sicuro di star 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

### Cerca IP nel 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']);
//sia $id che $_SERVER['REMOTE_ADDR'] restituiscono i valori che sto cercando nel database
4
Commenti

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

Chittaranjan Chittaranjan
29 gen 2014 18:13:34

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

Swen Swen
29 gen 2014 18:47:27

Rimuovere "$wpdb->" da $wpdb->wp_postviews_ips sembra aver funzionato!

Swen Swen
29 gen 2014 18:59:21

Questo è il motivo per cui avevo chiesto il nome della tabella e il prefisso. Tutte le tabelle di WordPress hanno un prefisso che imposti durante la configurazione del sito WordPress. Qui ci sono maggiori dettagli sul codex. Per favore controlla la mia risposta aggiornata con l'uso corretto del nome della tabella.

Chittaranjan Chittaranjan
29 gen 2014 20:14:24
Tutte le risposte alla domanda 2
2
54

Se stai cercando semplicemente di ottenere un conteggio, $wpdb->get_var(); insieme all'uso di COUNT() nella tua query SQL sarà meglio:

### Cerca l'IP nel 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']);
//sia $id che $_SERVER['REMOTE_ADDR']) restituiscono i valori che sto cercando nel database

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

Se vuoi usare get_results():

### Cerca l'IP nel 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']);
//sia $id che $_SERVER['REMOTE_ADDR']) restituiscono i valori che sto cercando nel database

Ma non vedrei la necessità di ciò a meno che non avessi bisogno dei risultati, nel qual caso restituirei semplicemente l'oggetto $ipquery e userei num_rows su di esso quando necessario:

### Cerca l'IP nel 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']);
//sia $id che $_SERVER['REMOTE_ADDR']) restituiscono i valori che sto cercando nel database

echo $someVariable->num_rows;
29 gen 2014 21:12:52
Commenti

Piccola aggiunta. Dovresti sempre utilizzare prepare (https://developer.wordpress.org/reference/classes/wpdb/prepare/) quando esegui qualsiasi query per prevenire l'sql injection.

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

In realtà non dovrebbe essere una piccola aggiunta, è molto importante non rendere il tuo codice vulnerabile all'sql injection.

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

Sembra che la query sia errata. $ip è una stringa, quindi dovresti mettere degli apici singoli attorno come mostrato di seguito

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

Ho provato questo e restituisce ancora 0.

Swen Swen
29 gen 2014 18:53:20