如何从SELECT查询中返回找到的行数


15

我编写了一个函数,该函数应该返回在SELECT查询中找到的行数,但它似乎总是返回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 2014年

@Chittaranjan表的名称是wp_postviews_ips,但是我不确定表前缀是什么意思。
Swen 2014年

从$ wpdb-> wp_postviews_ips中删除“ $ wpdb->”似乎可以解决问题!
Swen 2014年

这就是我要求输入表名和前缀的原因。所有wordpress表格都有一个前缀,您可以在设置wordpress网站时设置该前缀。这是有关法典的更多详细信息,请正确使用表名来检查我更新的答案。
Chittaranjan 2014年

Answers:


27

如果您只是想获得一个计数,那么在您的sql中$wpdb->get_var();使用COUNT()它会更好:

### 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
小加成。执行任何查询以防止sql注入时,应始终使用prepare(developer.wordpress.org/reference/classes/wpdb/prepare)。
Maciej Paprocki,

实际上,这不应该是一个很小的补充,这很重要,不要使您的代码可通过sql注入进行利用。
Max Carroll

2

似乎查询是错误的。$ip是字符串,因此您应该在下面加上单引号

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

尝试这样做,它仍然返回0
赛文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.