spot_img
HomeWordPress教程wordpress建站公司 将数据库内容类型与 PHP 类型相匹配

wordpress建站公司 将数据库内容类型与 PHP 类型相匹配

JasperAI 10000字免费额度试用

$wpdb 查询方法将所有查询结果作为字符串返回。 例如,“ID”列将返回一个字符串值,例如 '42' 而不是整数 42.

有没有办法配置 WP 数据库类以使数据库内容类型与 PHP 类型相匹配? 或者我是否需要像下面那样继续手动执行此操作?

$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 执行此操作。 这确实是 PHP 的一个限制,而 WordPress 恰好没有解决。 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 或其他什么,所以你会想要测试它并适当地修复它。 另外,我假设布尔值被认为是数字,但也许这是不正确的——再次测试。 祝你好运!

高质量外链购买
5分钟生成10篇英文软文article forge软件试用
siteground guangda
WordPress花园官方账号
WordPress花园隶致力于为广大跨境电商和独立站爱好者提供优质的WordPress教程、Woocommerce教程、Facebook、Twitter、tiktok、Instagram教程和谷歌SEO教程等资料和对应的建站推广服务。关注‘哟派出海’公众号了解最新资讯。粉丝福利:Shopline免费独立站建设14天优惠 商务合作: [email protected]
RELATED ARTICLES
spot_img