Как получить количество найденных строк из SELECT запроса
Я написал функцию, которая должна возвращать количество строк, найденных в SELECT запросе, но она всегда возвращает либо 0, либо массив. Я потратил около часа, пытаясь разобраться, но все еще не могу понять в чем проблема! Уверен, что делаю какую-то глупую ошибку.
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
### Поиск IP в базе данных
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']);
//оба параметра $id и $_SERVER['REMOTE_ADDR']) возвращают значения, которые я ищу в базе данных

Если вам нужно просто получить количество записей, использование $wpdb->get_var();
вместе с функцией COUNT()
в SQL-запросе будет лучшим вариантом:
### Поиск IP в базе данных
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']);
//и $id, и $_SERVER['REMOTE_ADDR']) возвращают значения, которые я ищу в базе данных
Что касается ошибки в вашем предыдущем примере, вы не присваивали результат $wpdb->get_results()
переменной, и поэтому $wpdb->num_rows;
возвращал ноль, так как он не получал данные из экземпляра запроса, а обращался к глобальному объекту $wpdb.
Если вы всё же хотите использовать get_results()
:
### Поиск IP в базе данных
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']);
//и $id, и $_SERVER['REMOTE_ADDR']) возвращают значения, которые я ищу в базе данных
Но в этом нет необходимости, если вам не нужны сами результаты. В таком случае я бы просто вернул объект $ipquery
и использовал num_rows
по мере необходимости:
### Поиск IP в базе данных
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']);
//и $id, и $_SERVER['REMOTE_ADDR']) возвращают значения, которые я ищу в базе данных
echo $someVariable->num_rows;

Небольшое дополнение. Всегда используйте prepare (https://developer.wordpress.org/reference/classes/wpdb/prepare/) при выполнении любых запросов, чтобы предотвратить SQL-инъекции.
