Magento - данные не вставляются в базу данных, но идентификатор автоматически инкрементален - PullRequest
2 голосов
/ 02 июня 2010

Я работаю над новым модулем оплаты для 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 синтаксически верны и ошибок не возвращается.

Странно то, что я проверил базу данных, и значение автоинкремента увеличивается при каждом запуске кода. Тем не менее, строки не вставляются в базу данных. Я подтвердил это, добавив оператор 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>

Edit: Запрос для создания таблицы в таком виде:

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

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

После изучения кода и поиска по всему я понял, что 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; придется остаться.

Спасибо за помощь в работе над этим.

1 голос
/ 02 июня 2010

похоже, что вам не хватает команды коммита.

->save()

.. или что-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...