Comment renvoyer le nombre de lignes trouvées à partir de la requête SELECT

15

J'ai écrit une fonction qui est censée renvoyer le nombre de lignes trouvées dans une requête SELECT mais elle semble toujours renvoyer 0 ou un tableau. Je joue avec ça depuis environ une heure maintenant et je ne peux toujours pas le comprendre! Je suis sûr que je fais quelque chose de stupidement mauvais.

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
Swen
la source
Quel est le nom de la table et le préfixe de la table?
Chittaranjan
@Chittaranjan Le nom de la table est wp_postviews_ips, je ne sais pas ce que vous entendez par préfixe de table.
Swen
Supprimer "$ wpdb->" de $ wpdb-> wp_postviews_ips semblait faire l'affaire!
Swen
C'est la raison pour laquelle j'avais demandé le nom et le préfixe de la table. Toutes les tables wordpress ont un préfixe que vous définissez lors de la configuration du site wordpress. Voici plus de détails sur le codex Veuillez vérifier ma réponse mise à jour en utilisant correctement le nom de la table.
Chittaranjan

Réponses:

27

Si vous essayez simplement d'obtenir un compte, l' $wpdb->get_var();utilisation COUNT()de votre sql sera meilleure:

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

Quant à ce qui n'a pas fonctionné dans votre exemple précédent, vous n'assigniez pas votre $wpdb->get_results()instance à une variable, et sans elle $wpdb->num_rows;va simplement retourner zéro car elle ne tire pas réellement de l'instance de la requête, mais plutôt le $ wbdb global objet.

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 à moins que vous n'ayez besoin des résultats, auquel cas je retournerais simplement l' $ipqueryobjet et l'utiliserais num_rowsquand 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;
eteich
la source
1
Petit ajout. Vous devez toujours utiliser prepare ( developer.wordpress.org/reference/classes/wpdb/prepare ) lors de l'exécution de toute requête pour empêcher l'injection SQL.
Maciej Paprocki
En fait, cela ne devrait pas être un petit ajout, il est très important de ne pas rendre votre code exploitable via l'injection SQL.
Max Carroll
2

Semble que la requête est incorrecte. $ipest une chaîne, vous devez donc mettre un guillemet simple comme ci-dessous

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
Chittaranjan
la source
J'ai essayé cela et il renvoie toujours 0.
Swen