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

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;

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'");

Sudah mencoba ini dan masih mengembalikan 0.
Swen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.