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


15

Я написал функцию, которая должна возвращать количество строк, найденных в запросе SELECT, но она всегда либо возвращает 0, либо массив. Я уже около часа возился с этим и до сих пор не могу понять! Я уверен, что я делаю что-то глупо неправильно.

MySQL Table

+--------+-------------+---------------------+
| 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

### Search for IP in 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']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

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

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

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

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

Ответы:


27

Если вы просто пытаетесь получить счет, лучше $wpdb->get_var();использовать COUNT()в вашем sql:

### Search for IP in 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']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

Что касается того, что пошло не так в вашем предыдущем примере, вы не присваивали свой $wpdb->get_results()экземпляр переменной, а без него $wpdb->num_rows;просто возвращали бы ноль, так как на самом деле это не извлечение из экземпляра запроса, а глобальный $ wbdb объект.

Если вы хотите использовать get_results():

### Search for IP in 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']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

Но я бы не увидел в этом необходимости, если бы вам не понадобились результаты, и в этом случае я бы просто возвратил $ipqueryобъект и использовал num_rowsего, когда мне это нужно:

### Search for IP in 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']);
//both $id and $_SERVER['REMOTE_ADDR']) return the values I'm searching for in the database

echo $someVariable->num_rows;

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

На самом деле это не должно быть небольшим дополнением, очень важно не делать ваш код пригодным для использования с помощью внедрения SQL.
Макс Кэрролл

2

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

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");

Пробовал это и до сих пор возвращает 0.
Swen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.