Як повернути кількість знайдених рядків із запиту SELECT


15

Я написав функцію, яка повинна повертати кількість рядків, знайдених у 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

### 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
Невелике доповнення. Ви завжди повинні використовувати Priprav ( 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.