19

我尝试使用mysql_fetch_row()and获取 MySQL 查询结果,mysql_result()并且数值作为字符串返回。

有没有办法将数据作为存储在表中的数据类型来获取?

该应用程序将查询许多不同的查询,因此我将无法将值逐一转换为预期的数据类型。

4

5 回答 5

19

我不认为可以在 PHP 5.2中以它们的本机数据类型(即任何其他字符串)获取数据......

如果我没记错的话,在 PHP 5.3 中,当您使用新的(PHP >= 5.3 中的新) mysqlnd (MySQL 本机驱动程序)驱动程序时,它成为可能。

在浏览了我的书签之后,我发现了这篇关于 mysqlnd 的文章:PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

它说这个(引用):

使用 mysqlnd 进行 PDO 的优势

mysqlnd 在使用服务器端准备语句时返回本机数据类型,例如,INT 列作为整数变量而不是字符串返回。这意味着内部的数据转换更少。

但这只是 PHP 5.3(前提是您的 PHP 5.3 版本是用 mysqlnd(而不是旧的 libmysql)编译的),而且似乎只适用于准备好的语句 :-(

在你的情况下,这并没有多大帮助,我猜......


这里还有另一个,仍然是关于 mysqlnd 的新特性,它不仅讨论了准备好的语句:PHP:使用 mysqlnd 节省的新网络流量、CPU 和内存

不过,不确定这是否已合并到官方 mysqlnd 驱动程序中——最好的方法是尝试;但无论如何,它仍然是 PHP >= 5.3...


另一种解决方案是在 PHP 端拥有某种映射系统(如 ORM)来将来自 DB 的结果转换为 PHP 数据类型......

是的,如果你想使用像===!==这样的类型敏感的运算符,这很糟糕......

于 2010-03-12T05:20:06.580 回答
11

如果使用 mysqli 而不是 PDO 试试这个

$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
于 2015-08-04T02:23:57.033 回答
3

我已经以手动方式实现了这一点。其实也不算太差,就那么几行。

按照建议,对查询产生的资源调用 mysqli_fetch_fields()。

然后从 PHP 字段类型编号到 MySQL 数据类型的映射(请参阅此处的辛勤工作http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php),您可以转换您的值从 MySQLi 以字符串形式返回的各种数据库类型,转换为 PHP 中的适当类型。

我不确定它有多大的放缓。

于 2011-08-08T10:54:03.143 回答
0

我写了一个函数来规避这个(对于 PDO):

/**
 * Converts columns from strings to types according to 
 * PDOStatement::columnMeta
 * 
 * @param PDOStatement $st
 * @param array $assoc returned by PDOStatement::fetch with PDO::FETCH_ASSOC
 * @return copy of $assoc with matching type fields
 */
function convertTypes(PDOStatement $statement, $assoc)
{
    for ($i = 0; $columnMeta = $statement->getColumnMeta($i); $i++)
    {
        $type = $columnMeta['native_type'];

        switch($type)
        {
            case 'DECIMAL':
            case 'TINY':
            case 'SHORT':
            case 'LONG':
            case 'LONGLONG':
            case 'INT24':
                $assoc[$columnMeta['name']] = (int) $assoc[$columnMeta['name']];
                break;
            case 'DATETIME':
            case 'DATE':
            case 'TIMESTAMP':
                $assoc[$columnMeta['name']] = strtotime($assoc[$columnMeta['name']]);
                break;
            // default: keep as string
        }
    }

    return $assoc;
}

当然类型列表不完整,转换过于简单,但对开始很有用。

于 2012-03-31T03:13:30.173 回答
0

除了 Pascal MARTIN 的回答,如果您使用 MySQLi 准备好的语句,您将使用本机类型获取数据。试试这个:

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
?>

上面的示例将输出:

id = 1 (integer)
label = a (string)

您可以在此处获取更多信息: https ://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

于 2016-10-06T14:19:04.583 回答