2010-06-01 95 views
2

我正在为Magento设计一个新的付款模块,并且遇到了一个我无法解释的问题。该信用卡后运行下面的代码进行验证:Magento - 数据未插入数据库,但ID是自动增加的

$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> 

编辑: 创建表,因为它代表的查询是:

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 
+0

请张贴表def ...... – Zak 2010-06-01 22:05:46

+0

@Zak:感谢您的快速响应。表def已发布。 – Joseph 2010-06-01 22:12:36

回答

1

样子你错过了提交命令。

->save() 

..或东西

+0

我试着在'$ writeconnection-> query($ sql);'之后立即添加'$ writeconnection-> save();',但这导致了该脚本在此时停止运行。我只能假定代码中有错误,但我一直无法捕捉具体问题。因此,我肯定' - > save()'只有在使用Magento的内置函数而不是直接SQL方法时才起作用。另外,当使用' - > query()'时,没有示例(包括核心模块)使用' - > save()'。 (还是)感谢你的建议。 – Joseph 2010-06-02 04:38:48

+0

我也尝试切换到EAV模型,但它似乎不起作用或者给出上述相同的问题。 – Joseph 2010-06-02 04:43:20

+0

尽管细节并不完美,我仍然接受这个答案作为答案,因为理论依然是正确的。我的解决方案也作为答案发布。 – Joseph 2010-06-03 14:15:44

2

挖掘到的代码,并通过一切搜索后,我意识到,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;将不得不留下。

感谢您在这方面的帮助。