PHP PDO lastInsertId返回字符串而不是整数

时间:2010-11-05 03:51:45

标签: php mysql doctrine pdo identity

我目前正在构建一个symfony / doctrine应用程序,一个模型具有以下结构:

Session:
  columns:
    session_id:
      type: integer(8)
      primary: true
      autoincrement: true
    session_number:
      type: string(30)

这正确地映射到数据库:

CREATE TABLE `session` (
  `session_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `session_number` varchar(30) NOT NULL,

所以我们在那里很安全。

然后在尝试创建新记录时,代码为:

$newSession = new Session();
$newSession->session_number = session_id();
$newSession->save();
//...
echo $newSession->session_id; //<------ this will return a string '1'

最后一行是有问题的。 session_id字段使用最后一个标识值填充,但作为字符串!!

首先,我认为学说是罪魁祸首,但随后调试代码,我发现PDO似乎实际上是将值作为字符串返回的那个。被调用的方法是:

dbh->lastInsertId()

所以显而易见的问题是:我该如何解决这个问题?。我在互联网上发现了这些东西,但还没有尝试过:

  1. PDO :: ATTR_STRINGIFY_FETCHES。这会有用吗?如果是,我该如何配置?
  2. 使用mysql本机驱动程序而不是pdo。然而,学说处理它所以我不确定我是否可以配置它。
  3. 另一个明显的解决方法是将类型转换为int:(int)$ session-&gt; session_id。但这只是简单的丑陋,因为它应该返回一个整数值(这是使用pdo和doctrine的全部目的!)而所有其他模型都会有同样的问题。
  4. 对此最好的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

您可能希望使用转换功能see php manual

$myInteger = intval($myString)

如果字符串代表一个太高的数字要转换为整数(并避免代码中有一些令人讨厌的间歇性错误),为了发送异常,请使用以下代码包围:

$myInteger = intval($myString)
if ($myInteger === PHP_INT_MAX) { // PHP 4.4.0 & 5.0.5 min
      throw new Exception('Integer out of range, please call your developer for bug fixing!')
}