Cum să returnezi numărul de rânduri găsite dintr-o interogare SELECT
Am scris o funcție care ar trebui să returneze numărul de rânduri găsite într-o interogare SELECT, dar întotdeauna pare să returneze fie 0, fie un array. M-am chinuit cu asta aproximativ o oră și tot nu reușesc să-mi dau seama! Sunt sigur că fac ceva extrem de greșit.
Tabelul 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
### Caută IP-ul în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR'] returnează valorile pe care le caut în baza de date

Dacă încerci doar să obții un număr, folosirea $wpdb->get_var();
împreună cu COUNT()
în interogarea SQL va fi mai eficient:
### Caută IP în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR']) returnează valorile pe care le caut în baza de date
În ceea ce privește problema din exemplul tău anterior, nu ai atribuit rezultatul $wpdb->get_results()
unei variabile, iar fără aceasta $wpdb->num_rows;
va returna zero deoarece nu se extrage din instanța interogării, ci din obiectul global $wbdb.
Dacă dorești să folosești get_results()
:
### Caută IP în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR']) returnează valorile pe care le caut în baza de date
Dar nu aș vedea nevoia pentru aceasta decât dacă ai nevoie de rezultate, caz în care aș returna obiectul $ipquery
și aș folosi num_rows
atunci când am nevoie:
### Caută IP în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR']) returnează valorile pe care le caut în baza de date
echo $someVariable->num_rows;

O mică completare. Ar trebui să folosești întotdeauna prepare (https://developer.wordpress.org/reference/classes/wpdb/prepare/) atunci când execuți orice interogări pentru a preveni injecțiile SQL.
