SELECTクエリから見つかった行の数を返す方法


14

SELECTクエリで見つかった行の数を返すことになっている関数を書きましたが、常に0または配列を返すようです。私はこれを約1時間いじっていますが、それでもまだわかりません!私は愚かに間違ったことをしていると確信しています。

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

テーブルの名前とテーブルプレフィックスは何ですか。
チッタランジャン2014年

@Chittaranjanテーブル名はwp_postviews_ipsですが、テーブルプレフィックスの意味がわかりません。
2014年

$ wpdb-> wp_postviews_ipsから "$ wpdb->"を削除すると、うまくいくようです!
2014年

それが、テーブル名とプレフィックスを要求した理由です。すべてのワードプレステーブルには、ワードプレスサイトのセットアップ時に設定したプレフィックスがあります。codexの詳細は次のとおりです。テーブル名を正しく使用して、更新された回答を確認してください。
チッタランジャン2014年

回答:


26

あなたが単にカウントを取得しようとしているなら、あなたのSQL $wpdb->get_var();での使用と一緒にCOUNT()すると良いでしょう:

### 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
小さな追加。SQLインジェクションを防ぐためにクエリを実行するときは、常にprepare(developer.wordpress.org/reference/classes/wpdb/prepare)を使用する必要があります。
Maciej Paprocki

実際、これは小さな追加ではありません。SQLインジェクションを介してコードを悪用できないようにすることは非常に重要です。
Max Carroll、

2

クエリが間違っているようです。$ip文字列なので、以下のように一重引用符で囲む必要があります

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

これを試してみましたが、それはまだ0を返す
SWEN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.