SELECT sorgusundan bulunan satır sayısını döndürme


15

SELECT sorgusunda bulunan satır sayısını döndürmesi gereken bir işlev yazdım ama her zaman 0 veya bir dizi döndürüyor gibi görünüyor. Yaklaşık bir saattir bununla uğraşıyorum ve hala anlayamıyorum! Eminim yanlış bir şey yapıyorum.

MySQL Tablosu

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

Tablonun adı ve tablo öneki nedir?
Chittaranjan

@Chittaranjan Tablo adı wp_postviews_ips, ancak tablo öneki ile ne demek istediğinizden emin değilim.
Swen

"$ Wpdb->" $ $ wpdb-> wp_postviews_ips öğesinden kaldırılırsa hile yapıyor gibi görünüyordu!
Swen

Bu yüzden tablo adını ve önekini istemiştim. Tüm wordpress tablolarında wordpress sitesini ayarlarken ayarladığınız bir önek bulunur. Kodeks hakkında daha fazla bilgi için lütfen tablo adının doğru kullanımı ile güncellenmiş cevabımı kontrol ediniz.
Chittaranjan

Yanıtlar:


27

Sadece bir sayı almaya çalışıyorsanız, $wpdb->get_var();sql'nizle birlikte kullanmak COUNT()daha iyi olacaktır:

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

Önceki örneğinizde nelerin yanlış gittiğine gelince, $wpdb->get_results()örneğinizi bir değişkene $wpdb->num_rows;atamıyordunuz ve bu olmadan , aslında sorgu örneğinden çekilmediği için sıfır yerine dönmeyecek, bunun yerine global $ wbdb nesne.

Kullanmak istiyorsanız 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

Ama sonuçlara ihtiyaç duymadıkça buna ihtiyaç duymazdım, bu durumda sadece $ipquerynesneyi iade edip num_rowsihtiyaç duyduğumda kullanırım:

### 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
Küçük ekleme. Sql enjeksiyonunu önlemek için herhangi bir sorgu yürütürken her zaman prepar ( developer.wordpress.org/reference/classes/wpdb/prepare ) kullanmalısınız .
Maciej Paprocki 29

Aslında bu küçük bir ek olmamalı, kodunuzu sql enjeksiyonu ile sömürülebilir hale getirmemek çok önemlidir.
Max Carroll

2

Sorgunun yanlış olduğu anlaşılıyor. $ipdize bu yüzden aşağıdaki gibi tek tırnak koymak gerekir

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

Bunu denedim ve yine 0 döndürüyor.
Swen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.