PHP PDO lastInsertId возвращает строку вместо целого числа - PullRequest
3 голосов
/ 05 ноября 2010

Я сейчас создаю приложение 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-> session_id. Но это просто безобразно, так как должно возвращать целочисленное значение (в этом и заключается цель использования pdo и доктрины!), И все другие модели будут иметь такую ​​же проблему.
  4. Что было бы лучшим решением для этого?

1 Ответ

0 голосов
/ 22 августа 2012

Вы можете использовать функцию преобразования см. Руководство по PHP .

$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!')
}
...