Come ottenere il numero di righe trovate da una query SELECT
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
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;

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