web-dev-qa-db-fra.com

Comment renvoyer le nombre de lignes trouvées à partir d'une requête SELECT

J'ai écrit une fonction qui est supposée renvoyer le nombre de lignes trouvées dans une requête SELECT mais elle semble toujours renvoyer 0 ou un tableau. Cela fait environ une heure que je déconne avec ça et je n'arrive toujours pas à comprendre! Je suis sûr que je fais quelque chose de bêtement faux.

La table 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
8
Swen

Si vous essayez simplement d’obtenir un compte, $wpdb->get_var(); avec l’utilisation de COUNT() dans votre sql sera préférable:

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

En ce qui concerne le problème rencontré dans votre exemple précédent, vous n’affectiez pas votre instance $wpdb->get_results() à une variable. Sans elle, $wpdb->num_rows; renverra simplement zéro car il n’est pas réellement extrait de l’instance de la requête, mais plutôt de la variable globale. objet $ wbdb.

Si vous souhaitez utiliser 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

Mais je ne verrais pas la nécessité de cela sauf si vous aviez besoin des résultats. Dans ce cas, je renverrais simplement l'objet $ipquery et utiliserais num_rows lorsque j'en aurais besoin:

### 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;
21
eteich

Semble la requête est fausse. $ip est une chaîne, vous devriez donc mettre un guillemet simple comme ci-dessous

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