web-dev-qa-db-ja.com

データベースのコンテンツタイプを PHP タイプ

$wpdb クエリメソッドは、すべてのクエリ結果を文字列として返します。たとえば、 'ID'列は整数の'42'ではなく42のような文字列値を返します。

データベースコンテンツタイプを PHPタイプ に一致させるようにWPデータベースクラスを設定する方法はありますか?それとも、以下のように手動でこれを続ける必要がありますか?

$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
    }
}
6
Geert

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;
}

私は実際にそれが返す型が何であるかわからない、それらが浮動小数点数、倍精度浮動小数点数であるかどうか、それであなたはそれを試してみて、それを適切に修正したいでしょう。また、ブール値は数値と見なされると思いますが、おそらくそれは正しくありません - テストしてください。がんばろう!

2
Matthew Boynes