php - 我如何确保来自 MySQL 的值在 PHP 中保持其类型?

标签 php mysqli types mysqlnd

我的 PHP 脚本出现问题,从 MySQL 调用的值作为字符串返回,尽管在数据库中被标记为 inttinyint .

这是一个问题,因为在将基于 MySQL 日期的数组转换为 JSON 数据时,本应为整数的值会被放在双引号中,这会在使用该 JSON 数据的 Javascript 和 iPhone 应用程序中造成问题。我得到的 JSON 值看起来像 "key" : "1" ,当我想要的是"key" : 1 .

经过一些研究,似乎it should be possible to get the values as their native type只要有 PHP 5.3 和 mysqlnd安装的模块。我有 5.3.3 和 phpinfo()似乎表明我有 mysqlnd模块安装并运行:

mysqlnd enabled
Version mysqlnd 5.0.10 - 20111026

但是,我的值仍以字符串形式返回。

我看过 PHP manual entry for mysqlnd ,而且我总是有可能遗漏明显的东西,但我没有看到任何表明我需要在代码中执行任何特定操作才能获取 native 值的信息。

我究竟该怎么做才能让 PHP 中的 MySQL 函数以其 native 类型提供 MySQL 结果?


为了使下面的答案更加有趣,这是我用来连接到数据库的命令:

private function databaseConnect()
{
    $this->mysqli = new mysqli(Database::$DB_SERVER, Database::$DB_USERNAME, Database::$DB_PASSWORD);
    $this->mysqli->set_charset("utf8");
    return true;
}

private function dbConnect()
{
    Database::$USE_MYSQLI = extension_loaded('mysqli');
    if (!$this->databaseConnect())
    {
        echo "Cannot Connect To The Database Server";
        throw new Exception();
    }
    if (!$this->databaseSelectDB())
    {
        echo "The database server connected, but the system could not find the right database";
        throw new Exception();
    }
}

private function databaseQuery($query)
{
    return $this->mysqli->query($query);
}

public function doQuery($query)
{
    $result = $this->databaseQuery($query);
    if ($result == FALSE)
    {
        //ErrorHandler::backtrace();
        die("This query did not work: $query");
    }
    return $result;
}

private function getRows($table, $matches, $orderBy = array(), $limit = array())
{
    $calcFoundRows = '';
    if (count($limit) > 0)
    {
        $calcFoundRows = ' SQL_CALC_FOUND_ROWS';
    }
    $query = 'SELECT ' . $calcFoundRows . ' * FROM ' . $table;
    if (count($matches) > 0)
    {
        $query .= ' WHERE ';
        $keys = array_keys($matches);
        $first = true;
        foreach ($keys as $key)
        {
            if (!$first)
            {
                $query .= ' AND ';
            }
            $first = false;

            // now he is safe to add to the query
            // the only time this is an array is when this is called by getSelectedUsers or getSelectedArticles
            // in that case it is an array of array's as the key (which is the column name) may have more than
            // one condition
            if (is_array($matches[$key]))
            {
                $firstForColumn = true;
                foreach ($matches[$key] as $conditions)
                {
                    if (!$firstForColumn)
                    {
                        $query .= ' AND ';
                    }
                    $firstForColumn = false;

                    // if the value is an array we generate an OR selection
                    if (is_array($conditions[1]))
                    {
                        $firstOr = true;
                        $query .= '(';

                        foreach ($conditions[1] as $value)
                        {
                            if (!$firstOr)
                            {
                                $query .= ' OR ';
                            }
                            $firstOr = false;
                            // clean this guy before putting him into the query
                            $this->cleanMySQLData($value);
                            if ($conditions[0] == Selection::$CONTAINS)
                            {
                                //$query .= 'MATCH (' . $key . ') AGAINST (' . $value . ') ';
                                $value = trim($value, "'");
                                $value = "'%" . $value . "%'";
                                $query .= $key . ' LIKE ' . $value;
                            }
                            else
                            {
                                $query .= $key . ' ' . $conditions[0] . ' ' . $value;
                            }
                        }

                        $query .= ')';
                    }
                    else
                    {
                        // clean this guy before putting him into the query
                        $var = $conditions[1];
                        $this->cleanMySQLData($var);
                        if ($conditions[0] == Selection::$CONTAINS)
                        {
                            //$query .= 'MATCH (' . $key . ') AGAINST (' . $var . ') ';
                            $var = trim($var, "'");
                            $var = "'%" . $var . "%'";
                            $query .= $key . ' LIKE ' . $var;
                        }
                        else
                        {
                            $query .= $key . ' ' . $conditions[0] . ' ' . $var;
                        }
                    }
                }
            }
            else
            {
                // clean this guy before putting him into the query
                $this->cleanMySQLData($matches[$key]);
                $query .= $key . " = " . $matches[$key];
            }
        }
    }
    if (count($orderBy) > 0)
    {
        $query .= " ORDER BY ";
        $first = true;
        foreach ($orderBy as $orderCol)
        {
            if (!$first)
            {
                $query .= ',';
            }
            $query .= $orderCol;
            $first = false;
        }
    }

    if (count($limit) > 0)
    {
        $query .= ' LIMIT ' . $limit[0];
        if (count($limit) > 1)
        {
            $query .= ',' . $limit[1];
        }
    }


    $result = $this->doQuery($query);
    $data = array();
    while ($row = $this->databaseFetchAssoc($result))
    {
        $data[] = $row;
    }
    if (strlen($calcFoundRows) > 0)
    {
        $numRows = $this->databaseCountFoundRows();
        $key = '^^' . $table . '_selectionCount';
        Session::getSession()->putUserSubstitution($key, $numRows);
    }

    return $data;
}

最佳答案

What exactly do I do to get my MySQL functions in PHP to give me the MySQL results in their native type?

连接到数据库,然后准备查询、执行查询、绑定(bind)结果,然后获取结果。

让我们逐行执行这些步骤:

$conn = new Mysqli('localhost', 'testuser', 'test', 'test');
$stmt = $conn->prepare("SELECT id FROM config LIMIT 1");
$stmt->execute();
$stmt->bind_result($id);
$stmt->fetch();
var_dump($id); # it's an int!

这对我有用。随着您编写的代码越来越复杂,您将需要定位查询数据库的位置。检查您是否正在使用 Mysqli::prepare()如果没有,请介绍。

您还需要使用 Mysqli_Stmt::execute()然后 Mysqli_Stmt::bind_result()否则,不会为该结果列保留(此处为整数)类型。

关于php - 我如何确保来自 MySQL 的值在 PHP 中保持其类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180981/

相关文章:

php - 主管 laravel 不起作用并启动

php - 在进行下拉选择之前隐藏字段的搜索框

php - 获取多维数组的最后一个索引

php - 我应该怎么做才能使 MySQL 事务在我的代码中工作?

haskell - 为什么 Maybe/Optional 类型使用 Just/Some 类型而不是实际类型?

php - 如果记录相同则更新 SQL 行

php - 是什么导致这个旨在备份大型 mysql 表的 php 脚本内存不足?

php - 如何在 BitBucket 管道中设置 mysqli

c++ - C++ 模板函数可以在返回参数上重载吗?

haskell - 如何证明一个函数对于其类型来说是唯一的?