将数据库内容类型与PHP类型匹配

时间:2011-11-29 作者:Geert

这个$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
    }
}

1 个回复
最合适的回答,由SO网友:Matthew Boynes 整理而成

无法自动使wpdb执行此操作。这确实是WordPress无法解决的PHP限制。wpdb也没有任何可以帮助您的挂钩或操作,因此您可以做的最好的事情是编写自己的包装器函数并运行查询,以避免重复。

首先,你可以退房http://us2.php.net/manual/en/function.mysql-fetch-field.php 使包装器更加动态。

其次,wpdb将此信息存储在wpdb::col\\u info中,可以通过wpdb::get\\u col\\u 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或其他类型,那么您需要对其进行测试并根据需要进行修复。此外,我假设布尔值被认为是数字,但这可能是错误的——再次测试。祝你好运

结束

相关推荐

如何修改此wpdb查询以包括POST_STATUS为PUBLISH和DRAFT的帖子?

我使用下面的函数来计算作者从自定义帖子类型中发表的帖子数量。<?php function count_user_posts_by_type($userid, $post_type) { global $wpdb; $where = get_posts_by_author_sql($post_type, TRUE, $userid); $count = $wpdb->get_var( \"SELECT COUNT(*) FROM $wpdb