Я работаю над новым платежным модулем для Magento и столкнулся с проблемой, которую я не могу объяснить. Следующий код, который запускается после кредитной карты, проверяется:
$table_prefix = Mage::getConfig()->getTablePrefix(); $tableName = $table_prefix.'authorizecim_magento_id_link'; $resource = Mage::getSingleton('core/resource'); $writeconnection = $resource->getConnection('core_write'); $acPI = $this->_an_customerProfileId; $acAI = $this->_an_customerAddressId; $acPPI = $this->_an_customerPaymentProfileId; $sql = "insert into {$tableName} values ('', '$customerId', '$acPI', '$acPI', '3')"; $writeconnection->query($sql); $sql = "insert into {$tableName} (magCID, anCID, anOID, anObjectType) values ('$customerId', '$acPI', '$acAI', '2')"; $writeconnection->query($sql); $sql = "insert into {$tableName} (magCID, anCID, anOID, anObjectType) values ('$customerId', '$acPI', '$acPPI', '1')"; $writeconnection->query($sql);
Я проверил использование Firebug и FirePHP, что SQL-запросы синтаксически правильны и ошибок не возвращают.
Странная вещь здесь в том, что я проверил базу данных, и значение autoincrement увеличивается при каждом запуске кода. Однако в базу данных не добавляются строки. Я проверил это, добавив die();
заявление сразу после первой записи.
Любые идеи, почему это происходит?
Относительная часть файла config.xml такова:
<config> <global> <models> <authorizecim> <class>CPAP_AuthorizeCim_Model</class> </authorizecim> <authorizecim_mysql4> <class>CPAP_AuthorizeCim_Model_Mysql4</class> <entities> <anlink> <table>authorizecim_magento_id_link</table> </anlink> </entities> <entities> <antypes> <table>authorizecim_magento_types</table> </antypes> </entities> </authorizecim_mysql4> </models> <resources> <authorizecim_setup> <setup> <module>CPAP_AuthorizeCim</module> <class>CPAP_AuthorizeCim_Model_Resource_Mysql4_Setup</class> </setup> <connection> <use>core_setup</use> </connection> </authorizecim_setup> <authorizecim_write> <connection> <use>core_write</use> </connection> </authorizecim_write> <authorizecim_read> <connection> <use>core_read</use> </connection> </authorizecim_read> </resources> </global> </config>
Изменить: запрос на создание таблицы в ее нынешнем виде:
CREATE TABLE `mag_authorizecim_magento_id_link` ( `link_id` INT(11) NOT NULL AUTO_INCREMENT, `magCID` INT(11) NOT NULL, `anCID` INT(11) NOT NULL, `anOID` INT(11) NOT NULL, `anObjectType` INT(11) NOT NULL, PRIMARY KEY (`link_id`) ) ENGINE=INNODB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8
похоже, что вам не хватает команды commit.
->save()
..или что-то
После копания кода и поиска по всему, я понял, что Magento использует модель транзакции для соединений с базой данных. В результате Imre L
имел правильную идею, но не тот код.
В качестве эксперимента я изменил этот код:
$sql = "insert into {$tableName} values ('', '$customerId', '$acPI', '$acPI', '3')"; $writeconnection->query($sql); $sql = "insert into {$tableName} (magCID, anCID, anOID, anObjectType) values ('$customerId', '$acPI', '$acAI', '2')"; $writeconnection->query($sql); $sql = "insert into {$tableName} (magCID, anCID, anOID, anObjectType) values ('$customerId', '$acPI', '$acPPI', '1')"; $writeconnection->query($sql);
к этому:
$sql = "insert into {$tableName} values ('', '$customerId', '$acPI', '$acPI', '3'); commit;"; $writeconnection->query($sql); $sql = "insert into {$tableName} (magCID, anCID, anOID, anObjectType) values ('$customerId', '$acPI', '$acAI', '2'); commit;"; $writeconnection->query($sql); $sql = "insert into {$tableName} (magCID, anCID, anOID, anObjectType) values ('$customerId', '$acPI', '$acPPI', '1'); commit;"; $writeconnection->query($sql);
Удивительно, но это сработало. Новые значения появились в базе данных. (Я не понимал, что транзакции, поддерживаемые MySQL)
Где-то в моем новом коде я запрещал выполнение инструкции commit, поэтому значения не сохранялись в базе данных. Я буду охотиться на это, когда я пойду, но на данный момент, commit;
должен остаться.
Спасибо за помощь, которая работает над этим.