2009-08-13 8 views
3

Ich habe eine MySQL-Tabelle, deren Primärschlüssel ist ein 64-Bit-BigIntZend_Db kehrt LAST_INSERT_ID super große Anzahl

I Zend_Db (Zend Framework 1.8.4) bin mit einer neuen Zeile einzufügen, dann lastInsertId() aufrufen retreive Die ID der neuen Zeile, was ich zurückbekomme, ist eine super große Zahl wie 18446744072633694008, und diese Zahl ändert sich von Zeit zu Zeit, aber immer so groß. Der Autoinkrement-Index ist auf 0 gesetzt, und in der Datenbank wurde der Datensatz tatsächlich mit der richtigen Primär-ID (0, 1, 2 ...) eingefügt, nur dass die ID-Rückgabe von lastInsertId() eine seltsame Zahl ergibt. Ist es ein bekanntes Problem für Zend_db, das sich nicht mit der 64-Bit-Nummer beschäftigt?

Umgebung: Zend Framework 1.8.4 Apache2 auf 32-Bit-Feld, Ubuntu OS MySQL5.1 PHP5.2.4 MySQL Adapter: mysqli

Dank

+2

Was folgen, wie ich weiß, 'Zend_Db' gibt immer nur Strings. Aber ich werde mich darum kümmern. – jason

+0

Eigentlich ist es wichtig zu wissen, welchen Datenbankadapter Sie verwenden. 'PDO_Mysql' oder' Mysqli'? – jason

+0

Es ist mysqli ich benutze. Danke für die Hilfe – Beier

Antwort

3

Dies scheint ein Fehler in der OO Implementierung von PHP Mysqli Adapter zu sein. See this note on PHP's website.

Verwenden Sie für eine vorübergehende Stop-Gap-Lösung den Adapter PDO_MysqlZend_Db.

Ich bin gerade dabei ein Problem und arbeite an einer Lösung, um zu sehen, ob ich um dieses Problem in Zend_Db_Adapter_Mysqli arbeiten kann. Ich werde diese Antwort mit meinen Fortschritten auf dem Laufenden halten.

Sie können meine Fortschritte auf dieses Problem zu umgehen bei http://framework.zend.com/issues/browse/ZF-7590

+0

Aha, jetzt macht es Sinn. Bitte halte mich auf dem Laufenden. Der Primärschlüssel der Tabelle kommt der magischen Zahl 4.294.967.295 sehr nahe, daher müssen wir int32 auf int64 aufrüsten.Danke – Beier

+0

Eigentlich frage ich mich, ob dieses Problem auf einem 64-Bit-System bestehen würde? Unser Produktionsserver ist 64bit, aber der Dev-Server ist 32bit (ich weiß, wir sollten sie gleich machen). vielleicht werde ich ein paar Tests machen – Beier

+0

Auf echten 64-Bit-Plattformen ist PHP native Integer tatsächlich 64 Bit, glaube ich. – jason

1

entwickelte ich eine Menge Zend_Db Code durch ZF 1.0.

PHP Datenbank Erweiterungen zurückkehren PHP-Strings, keine ganzen Zahlen. Der Grund dafür ist, dass das RDBMS wahrscheinlich numerische Datentypen verwendet, die den Bereich von Ganzzahlen überschreiten, die in der Client-PHP-Binärdatei unterstützt werden.

Zend_Db gibt nur die Werte zurück, die es von der PHP-Datenbankerweiterung abruft. Wenn Sie also seltsame Werte sehen, liegt das wahrscheinlich an PHP, nicht an Zend_Db.

Vielleicht möchten Sie die Unit-Tests laufen Einsätze zu testen:

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

Eine der Behauptungen in diesen Tests gemacht wird, dass der Rückgabewert von lastInsertId() eine Art PHP-String ist.

+0

Danke für die Antwort, ich werde das Gerät zu testen versuchen. – Beier

+1

Bill, das liegt daran, dass der Adapter es nur in eine Zeichenfolge umwandelt. Es ist ein Fehler in der PHP-OO-Implementierung des Mysqli-Adapters, der im prozeduralen Stil offensichtlich nicht vorhanden ist. Ich schreibe kurz ein Ticket ... – jason

+0

Ja, du hast recht, ich sehe den Code jetzt. –