Cara mengembalikan jumlah baris yang ditemukan dari kueri SELECT

15

Saya menulis sebuah fungsi yang seharusnya mengembalikan jumlah baris yang ditemukan dalam kueri SELECT tetapi sepertinya selalu mengembalikan 0 atau array. Saya telah bermain-main dengan ini selama sekitar satu jam sekarang dan saya masih tidak bisa mengetahuinya! Saya yakin saya melakukan sesuatu yang salah.

Tabel 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
sumber
Apa nama tabel dan awalan tabel?
Chittaranjan
@Chittaranjan Nama tabel adalah wp_postviews_ips, saya tidak yakin apa yang Anda maksud dengan awalan tabel.
Swen
Menghapus "$ wpdb->" dari $ wpdb-> wp_postviews_ips tampaknya berhasil!
Swen
Itulah alasan saya meminta nama tabel dan awalan. Semua tabel wordpress memiliki awalan yang Anda atur saat mengatur situs wordpress. Berikut ini rincian lebih lanjut tentang kodeks. Silakan periksa jawaban saya yang diperbarui dengan penggunaan nama tabel yang benar
Chittaranjan

Jawaban:

27

Jika Anda hanya mencoba untuk mendapatkan hitungan, $wpdb->get_var();seiring dengan menggunakan COUNT()dalam sql Anda akan lebih baik:

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

Mengenai apa yang salah pada contoh Anda sebelumnya, Anda tidak menugaskan $wpdb->get_results()instance Anda ke variabel, dan tanpanya $wpdb->num_rows;hanya akan mengembalikan nol karena sebenarnya tidak menarik dari instance kueri, melainkan global $ wbdb obyek.

Jika Anda ingin menggunakan 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

Tapi saya tidak akan melihat perlunya kecuali Anda membutuhkan hasilnya, dalam hal ini saya hanya akan mengembalikan $ipqueryobjek dan menggunakannya num_rowsketika saya membutuhkannya:

### 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
sumber
1
Selain kecil. Anda harus selalu menggunakan prep ( developer.wordpress.org/reference/classes/wpdb/prepare ) saat menjalankan kueri untuk mencegah injeksi sql.
Maciej Paprocki
Sebenarnya itu bukan tambahan kecil, itu sangat penting untuk tidak membuat kode Anda dieksploitasi melalui injeksi sql.
Max Carroll
2

Tampaknya kueri salah. $ipadalah string sehingga Anda harus meletakkan tanda kutip di sekitarnya seperti di bawah ini

$wpdb->get_results("SELECT * FROM {$wpdb->prefix}postviews_ips WHERE postid = $id AND ip = '$ip'");
Chittaranjan
sumber
Sudah mencoba ini dan masih mengembalikan 0.
Swen