Как получить количество найденных строк из SELECT запроса

29 янв. 2014 г., 17:32:14
Просмотры: 125K
Голосов: 27

Я написал функцию, которая должна возвращать количество строк, найденных в 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']) возвращают значения, которые я ищу в базе данных
4
Комментарии

Как называется таблица и префикс таблицы?

Chittaranjan Chittaranjan
29 янв. 2014 г. 18:13:34

@Chittaranjan Имя таблицы - wp_postviews_ips, но я не уверен, что вы имеете в виду под префиксом таблицы.

Swen Swen
29 янв. 2014 г. 18:47:27

Удаление "$wpdb->" из $wpdb->wp_postviews_ips сработало!

Swen Swen
29 янв. 2014 г. 18:59:21

Именно поэтому я спрашивал название таблицы и префикс. Все таблицы WordPress имеют префикс, который вы устанавливаете при настройке сайта на WordPress. Подробнее об этом можно узнать в кодексе. Пожалуйста, посмотрите мой обновленный ответ с правильным использованием имени таблицы.

Chittaranjan Chittaranjan
29 янв. 2014 г. 20:14:24
Все ответы на вопрос 2
2
54

Если вам нужно просто получить количество записей, использование $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;
29 янв. 2014 г. 21:12:52
Комментарии

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

Maciej Paprocki Maciej Paprocki
29 мая 2019 г. 15:35:05

На самом деле, это не должно быть небольшим дополнением - очень важно не делать ваш код уязвимым для SQL-инъекций.

Max Carroll Max Carroll
13 сент. 2019 г. 00:09:33
1

Похоже, запрос составлен неверно. $ip является строкой, поэтому его нужно заключить в одинарные кавычки, как показано ниже:

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
29 янв. 2014 г. 18:07:00
Комментарии

Попробовал это, но всё равно возвращает 0.

Swen Swen
29 янв. 2014 г. 18:53:20