So geben Sie die Anzahl der gefundenen Zeilen aus der SELECT-Abfrage zurück

13

Ich habe eine Funktion geschrieben, die die Anzahl der in einer SELECT-Abfrage gefundenen Zeilen zurückgeben soll, aber immer entweder 0 oder ein Array zurückzugeben scheint. Ich habe jetzt ungefähr eine Stunde damit rumgespielt und kann es immer noch nicht herausfinden! Ich bin sicher, ich mache etwas dumm falsch.

Die MySQL-Tabelle

+--------+-------------+---------------------+
| 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
Swen
quelle
Wie heißt die Tabelle und das Tabellenpräfix?
Chittaranjan
@Chittaranjan Tabellenname ist wp_postviews_ips, ich bin mir jedoch nicht sicher, was Sie mit Tabellenpräfix meinen.
Swen
Das Entfernen von "$ wpdb->" aus $ wpdb-> wp_postviews_ips schien den Trick zu tun!
Swen
Aus diesem Grund hatte ich nach dem Tabellennamen und dem Präfix gefragt. Alle WordPress-Tabellen haben ein Präfix, das Sie beim Einrichten der WordPress-Site festgelegt haben. Hier finden Sie weitere Details zum Codex. Bitte überprüfen Sie meine aktualisierte Antwort unter korrekter Verwendung des Tabellennamens.
Chittaranjan

Antworten:

25

Wenn Sie nur versuchen, eine Zählung zu erhalten, ist $wpdb->get_var();die Verwendung COUNT()in Ihrem SQL besser:

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

Was in Ihrem vorherigen Beispiel schief gelaufen ist, Sie haben Ihre $wpdb->get_results()Instanz keiner Variablen $wpdb->num_rows;zugewiesen , und ohne sie wird nur Null zurückgegeben, da sie nicht tatsächlich aus der Instanz der Abfrage gezogen wird, sondern aus dem globalen $ wbdb Objekt.

Wenn Sie verwenden möchten 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

Aber ich würde die Notwendigkeit dafür nicht sehen, wenn Sie nicht die Ergebnisse benötigen. In diesem Fall würde ich das $ipqueryObjekt einfach zurückgeben und es verwenden num_rows, wenn ich es benötige:

### 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;
eteich
quelle
1
Kleine Ergänzung. Sie sollten immer prepare ( developer.wordpress.org/reference/classes/wpdb/prepare ) verwenden, wenn Sie Abfragen ausführen, um eine SQL-Injection zu verhindern.
Maciej Paprocki
Eigentlich sollte das keine kleine Ergänzung sein, das ist sehr wichtig, um Ihren Code nicht über SQL Injection ausnutzbar zu machen.
Max Carroll
2

Die Abfrage scheint falsch zu sein. $ipist Zeichenfolge, daher sollten Sie dies wie unten in einfache Anführungszeichen setzen

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
Chittaranjan
quelle
Versuchte dies und es gibt immer noch 0 zurück.
Swen