2009-08-13 2 views
3

У меня есть таблица MySql, чей первичный ключ является 64-битной BigIntZend_Db last_insert_id возвращается супер большой номер

Я использую Zend_Db (Zend Framework 1.8.4), чтобы вставить новую строку, а затем вызвать lastInsertId(), чтобы извлечь идентификатор новой строки, то, что я получаю, является очень большим числом, таким как 18446744072633694008, и это число время от времени меняется, но всегда это большое. индекс автоматического инкремента установлен в 0, а в базе данных запись фактически вставлена ​​с правильным первичным идентификатором (0, 1, 2 ...), это просто, что возврат id из lastInsertId() дает странное число. Это известная проблема для Zend_db, которая не имеет дело с 64-битным номером?

среды: Zend Framework 1.8.4 Apache2 на 32-битном поле, Ubuntu OS MySQL5.1 PHP5.2.4 MySQL адаптер: MySQLi

Благодаря

+2

Насколько я знаю, 'Zend_Db' только когда-либо возвращает строки. Но я посмотрю. – jason

+0

На самом деле, важно знать, какой адаптер базы данных вы используете. 'PDO_Mysql' или' Mysqli'? – jason

+0

Я использую mysqli. Спасибо за помощь – Beier

ответ

3

Это, кажется, ошибка в реализации OO адаптера Mysqli PHP. See this note on PHP's website.

Для временного решения с зазором попробуйте использовать адаптер PDO_MysqlZend_Db.

В настоящее время я создаю проблему и работаю над решением, чтобы узнать, могу ли я решить эту проблему в Zend_Db_Adapter_Mysqli. Я буду держать этот ответ в курсе моих успехов.

Вы можете следить за моими успехами на обходного пути в http://framework.zend.com/issues/browse/ZF-7590

+0

ага, теперь это имеет смысл. Пожалуйста, держите меня в курсе исправления. Первичный ключ таблицы близок к этому магическому номеру 4 294 967 295, поэтому нам нужно обновить int32 до int64.Спасибо – Beier

+0

На самом деле, интересно, будет ли эта проблема существовать на 64-битной системе? наш производственный сервер - 64-битный, но dev-сервер 32-битный (я знаю, мы должны сделать их одинаковыми). возможно, я сделаю некоторое тестирование – Beier

+0

На настоящих 64-битных платформах, по-моему, на самом деле собственное число на PHP составляет 64 бит. – jason

1

Я разработал много Zend_Db кода через ZF 1.0.

PHP-расширения базы данных возвращают строки PHP, а не целые числа. Причиной этого является то, что СУБД, скорее всего, будет использовать числовые типы данных, которые превышают диапазон целых чисел, поддерживаемых в двоичном двоичном файле клиента.

Zend_Db только что возвращает значения, которые он извлекает из расширения базы данных PHP, поэтому, если вы видите странные значения, то это, вероятно, связано с PHP, а не Zend_Db.

Вы можете запустить юнит-тесты, чтобы проверить вставки:

$ cd <zf>/tests 
$ vi TestConfiguration.php # enable the MySQL adapter you're using 
$ phpunit --verbose --filter testAdapterInsert Zend/Db/AllTests.php 

Одно из утверждений, сделанных в этих тестах является то, что возвращаемое значение lastInsertId() типа PHP строки.

+0

Спасибо за ответ, я буду стараться модульный тест. – Beier

+1

Билл, это потому, что адаптер просто передает его в строку. Это ошибка в реализации OO PHP адаптера Mysqli, который, по-видимому, отсутствует в процедурном стиле. Я скоро отправлю билет ... – jason

+0

Да, вы правы, я вижу код сейчас. –

Смежные вопросы