Cum să returnezi numărul de rânduri găsite dintr-o interogare SELECT

29 ian. 2014, 17:32:14
Vizualizări: 125K
Voturi: 27

Am scris o funcție care ar trebui să returneze numărul de rânduri găsite într-o interogare SELECT, dar întotdeauna pare să returneze fie 0, fie un array. M-am chinuit cu asta aproximativ o oră și tot nu reușesc să-mi dau seama! Sunt sigur că fac ceva extrem de greșit.

Tabelul 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

### Caută IP-ul în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR'] returnează valorile pe care le caut în baza de date
4
Comentarii

Care este numele tabelului și prefixul tabelului?

Chittaranjan Chittaranjan
29 ian. 2014 18:13:34

@Chittaranjan Numele tabelului este wp_postviews_ips, nu sunt sigur ce înțelegi prin prefixul tabelului.

Swen Swen
29 ian. 2014 18:47:27

Eliminarea "$wpdb->" din $wpdb->wp_postviews_ips pare că a funcționat!

Swen Swen
29 ian. 2014 18:59:21

Acesta este motivul pentru care am cerut numele tabelului și prefixul. Toate tabelele WordPress au un prefix pe care îl setați în timpul configurații site-ului WordPress. Aici sunt mai multe detalii în codex Vă rugăm să verificați răspunsul meu actualizat cu utilizarea corectă a numelui tabelului.

Chittaranjan Chittaranjan
29 ian. 2014 20:14:24
Toate răspunsurile la întrebare 2
2
54

Dacă încerci doar să obții un număr, folosirea $wpdb->get_var(); împreună cu COUNT() în interogarea SQL va fi mai eficient:

### Caută IP în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR']) returnează valorile pe care le caut în baza de date

În ceea ce privește problema din exemplul tău anterior, nu ai atribuit rezultatul $wpdb->get_results() unei variabile, iar fără aceasta $wpdb->num_rows; va returna zero deoarece nu se extrage din instanța interogării, ci din obiectul global $wbdb.

Dacă dorești să folosești get_results():

### Caută IP în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR']) returnează valorile pe care le caut în baza de date

Dar nu aș vedea nevoia pentru aceasta decât dacă ai nevoie de rezultate, caz în care aș returna obiectul $ipquery și aș folosi num_rows atunci când am nevoie:

### Caută IP în baza de date
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']);
//atât $id cât și $_SERVER['REMOTE_ADDR']) returnează valorile pe care le caut în baza de date

echo $someVariable->num_rows;
29 ian. 2014 21:12:52
Comentarii

O mică completare. Ar trebui să folosești întotdeauna prepare (https://developer.wordpress.org/reference/classes/wpdb/prepare/) atunci când execuți orice interogări pentru a preveni injecțiile SQL.

Maciej Paprocki Maciej Paprocki
29 mai 2019 15:35:05

De fapt, asta nu ar trebui să fie doar o mică completare, este foarte important să nu faci codul tău vulnerabil la injecții SQL.

Max Carroll Max Carroll
13 sept. 2019 00:09:33
1

Se pare că interogarea este greșită. $ip este un șir de caractere, așa că ar trebui să puneți ghilimele simple în jurul acestuia, ca mai jos:

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
29 ian. 2014 18:07:00
Comentarii

Am încercat asta și tot returnează 0.

Swen Swen
29 ian. 2014 18:53:20