PDO在PHP5.4中将整数列作为String返回

Coo*_*ter 9 php mysql pdo

首先,据我所知,有作为SO等各种类似的问题这个这个.但是,当我从表中获取值时,整数总是被提取为字符串.

我使用PHP5.4(5.4.16-1~dotdeb.1)和MYSQL5.5(5.5.31 + dfsg-0 + wheezy1).这里写的是PHP5.4.0中默认启用了MySQL Native Driver.但我仍然得到字符串值.

我按如下方式初始化PDO对象.

try {
        $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';

        $db = new PDO($dsn,DB_USER,DB_PASS);

        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch (PDOException $e) {
        header('HTTP/1.1 500');
        exit;
    } catch (Exception $e) {
        header('HTTP/1.1 500');
        exit;
    }
Run Code Online (Sandbox Code Playgroud)

当我插入时,我尝试使用execute(array(...))格式并使用bindValue(...,PDO::PARAM_INT),但它们并没有什么区别.

例如,以下是我插入新行的方法.

public function insertList ($db,$account_id,$list_name) {
    $sql = $db->prepare('INSERT INTO lists VALUES (?,?,?,?,?)');

    try {
        // $sql->execute(array($list_name,0,0,0,$account_id));

        $sql->bindValue(1,$list_name,PDO::PARAM_STR);
        $sql->bindValue(2,0,PDO::PARAM_INT);
        $sql->bindValue(3,0,PDO::PARAM_INT);
        $sql->bindValue(4,0,PDO::PARAM_INT);
        $sql->bindValue(5,$account_id,PDO::PARAM_INT);
        $sql->execute();
    } catch (PDOException $e) {
        header('HTTP/1.1 500');
        exit;
    } catch (Exception $e) {
        header('HTTP/1.1 500');
        exit;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我从表中获取行的方法

public function fetchLists ($db,$account_id) {
    $sql = $db->prepare('SELECT * FROM lists WHERE account_id=?');

    try {
        $sql->execute(array($account_id));

        $result = $sql->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        header('HTTP/1.1 500');
        exit;
    } catch (Exception $e) {
        header('HTTP/1.1 500');
        exit;
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

当我在使用PHP5.4.7的XAMPP for Linux 1.8.1上进行测试时,没有发生这种情况.我目前使用的是nginx而不是Apache.

怎么了?

You*_*nse 4

要使用 PDO 从 mysql 获取相应类型的整数和浮点数,您需要基于 mysqlnd 的 PDO-mysql 并关闭模拟模式。

  • 我想将它们转换为整数的主要原因是,当我将这些变量发送回客户端时,我希望它们是整数。在 JavaScript 中,`"11" + 9`​​ 不等于 20,所以我总是需要手动将其转换为整数。 (10认同)
  • 为什么这是一个奇怪的功能?如果我可以将整数列作为整数获取,我就不需要手动将它们转换为整数。 (6认同)
  • 为什么这是一个奇怪的功能?我刚刚开始将数据库代码从“mysql_”更改为 PDO,并且“$row['active'] == 1”代码失败,因为它是一个该死的字符串。谁会认为将值完全作为字符串返回几乎是一个好主意?! (6认同)
  • 我不太熟悉 PHParta。我会看一看。 (2认同)