問題描述
$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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。