問題描述

$wpdb 查詢方法將所有查詢結果作為字串返回。例如,’ID’ 列將返回一個字串值,如'42'而不是整數 42

有沒有辦法配置 WP 資料庫類以使資料庫內容型別與 PHP types 匹配?或者我需要繼續手動如下所示?

$results = $wpdb->get_results('SELECT * FROM my_table');

foreach ($results as $result)
{
    // All integer values
    foreach (array('id', 'user_id', 'comment_count') as $field)
    {
        $result->$field = (int) $result->$field;
    }
    // All float values
    foreach (array('price') as $field)
    {
        $result->$field = (float) $result->$field;
    }
    // All boolean values
    foreach (array('is_open', 'is_confirmed') as $field)
    {
        $result->$field = (bool) $result->$field;
    }
    // Etc.
}

為什麼麻煩,你可能會想?那麼,對於初學者來說,乾淨的程式碼是有趣的。整數值不應該作為字串儲存。當您建立一個自定義函式來查詢某個東西時,例如,我喜歡根據傳遞的引數的資料型別區分該欄位以查詢:

function load_product($id_or_slug)
{
    if (is_int($id_or_slug))
    {
        // Look up by ID
    }
    else
    {
        // Look up by slug
    }
}

最佳解決方法

沒有辦法自動使 wpdb 這樣做。這實際上是 WordPress 不會發生的 PHP 的限制。 wpdb 沒有任何可以幫助你的鉤子或動作,所以你可以做的最好的事情是編寫你自己的包裝函式,並透過它來執行你的查詢,以避免重複你自己。

首先,您可以檢視 http://us2.php.net/manual/en/function.mysql-fetch-field.php 以使您的包裝更加動態。

其次,wpdb 將這些資訊儲存在 wpdb :: col_info 中,可以透過 wpdb :: get_col_info() 進行訪問。每個查詢後該變數被覆蓋,所以你必須立即訪問它。此外,它是數字索引,所以你需要知道你的欄位在哪個順序 (或迴圈,這是一個不必要的工作量) 。

只是從這裡的臀部拍攝,但像…

function get_typed_results($sql, $output = OBJECT) {
    global $wpdb;
    $rows = $wpdb->get_results($sql, ARRAY_N);
    $new_result = array();
    foreach ($rows as $row) {
        $new_row = array();
        foreach ($row as $i => $value) {
            if ( $wpdb->col_info[$i]->numeric ) {
                if ( $wpdb->col_info[$i]->type == 'float' || $wpdb->col_info[$i]->type == 'double' )
                    $new_row[$wpdb->col_info[$i]->name] = (float)$value;
                elseif ( $wpdb->col_info[$i]->type == 'bool' || $wpdb->col_info[$i]->type == 'boolean' )
                    $new_row[$wpdb->col_info[$i]->name] = (bool)$value;
                else
                    $new_row[$wpdb->col_info[$i]->name] = (int)$value;
            }
            elseif ( $wpdb->col_info[$i]->type == 'datetime' )
                $new_row[$wpdb->col_info[$i]->name] = strtotime($value);
            else
                $new_row[$wpdb->col_info[$i]->name] = $value;
        }
        if ($output == ARRAY_A) $new_result[] = $new_row;
        elseif ($output == OBJECT) $new_result[] = (object)$new_row;
        else $new_result[] = array_values($new_row);
    }
    return $new_result;
}

我實際上並不知道它返回的是什麼型別的,如果它們是 float 或 double 或者是什麼,那麼你需要測試它,並在適當的時候修正它。此外,我認為布林被認為是數字,但也許這是不正確的 – 再次測試。祝你好運!

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。