代码之家  ›  专栏  ›  技术社区  ›  Joseph

magento-数据未插入数据库,但ID是自动增加的

  •  2
  • Joseph  · 技术社区  · 16 年前

    我正在为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和FireHP验证了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
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Imre L    16 年前

    看起来您缺少commit命令。

    ->save()
    

    ..或某事

        2
  •  2
  •   Joseph    16 年前

    在深入研究代码并搜索所有内容之后,我意识到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; 必须留下来。

    感谢您的帮助。

    推荐文章