วิธีส่งคืนจำนวนแถวที่พบจากแบบสอบถามแบบใช้เลือกข้อมูล


15

ฉันเขียนฟังก์ชันที่ควรคืนค่าจำนวนแถวที่พบในแบบสอบถามแบบใช้เลือกข้อมูล แต่ดูเหมือนว่าจะส่งคืน 0 หรืออาร์เรย์เสมอ ฉันยุ่งกับสิ่งนี้มาประมาณหนึ่งชั่วโมงแล้วและฉันก็ยังนึกไม่ออก! ฉันแน่ใจว่าฉันกำลังทำอะไรผิดพลาดอย่างโง่เขลา

ตาราง 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

ชื่อของตารางและคำนำหน้าตารางคืออะไร?
Chittaranjan

@Chittaranjan ชื่อตารางคือ wp_postviews_ips ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดยใช้คำนำหน้าตาราง
Swen

การลบ "$ wpdb->" ออกจาก $ wpdb-> wp_postviews_ips ดูเหมือนจะเป็นการหลอกลวง!
Swen

นั่นคือเหตุผลที่ฉันขอชื่อตารางและคำนำหน้า ตารางเวิร์ดเพรสทั้งหมดมีคำนำหน้าซึ่งคุณตั้งค่าในระหว่างการตั้งค่าไซต์เวิร์ดเพรส นี่คือรายละเอียดเพิ่มเติมเกี่ยวกับcodexโปรดตรวจสอบคำตอบที่อัปเดตของฉันด้วยการใช้ชื่อตารางอย่างถูกต้อง
Chittaranjan

คำตอบ:


27

หากคุณเพียงแค่พยายามที่จะได้รับการนับ$wpdb->get_var();พร้อมกับใช้COUNT()ใน sql ของคุณจะดีกว่า:

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

ในสิ่งที่ผิดพลาดในตัวอย่างก่อนหน้าของคุณคุณไม่ได้กำหนด$wpdb->get_results()อินสแตนซ์ของคุณให้กับตัวแปรและไม่มีมัน$wpdb->num_rows;จะกลับไปเป็นศูนย์เพราะมันไม่ได้ดึงจากอินสแตนซ์ของแบบสอบถาม แต่แทนที่จะเป็น $ wbdb ทั่วโลก วัตถุ.

หากคุณต้องการใช้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

แต่ฉันจะไม่เห็นความต้องการสิ่งนั้นเว้นแต่คุณจะต้องการผลลัพธ์ในกรณีนี้ฉันจะส่งคืน$ipqueryวัตถุและใช้num_rowsกับมันเมื่อฉันต้องการมัน:

### 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
นอกจากนี้ขนาดเล็ก คุณควรใช้การเตรียม ( developer.wordpress.org/reference/classes/wpdb/prepare ) เสมอเมื่อเรียกใช้คิวรีใด ๆ เพื่อป้องกัน sql injection
Maciej Paprocki

ที่จริงแล้วไม่น่าจะเป็นส่วนเสริมเล็ก ๆ น้อย ๆ นั่นเป็นสิ่งสำคัญมากที่จะไม่ทำให้โค้ดของคุณถูกใช้ประโยชน์จากการฉีด sql
Max Carroll

2

ดูเหมือนว่าแบบสอบถามไม่ถูกต้อง $ipเป็นสตริงดังนั้นคุณควรใส่เครื่องหมายคำพูดเดี่ยว ๆ

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

พยายามทำสิ่งนี้และยังคงส่งคืน 0
Swen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.