代码之家  ›  专栏  ›  技术社区  ›  Colin O'Dell

Magento:锁定不起作用的自定义MySQL查询

  •  1
  • Colin O'Dell  · 技术社区  · 14 年前

    last_used 现场。

    查询在phpMyAdmin中运行得非常好,但在Magento中失败。我得到以下错误:

    SQLSTATE[HY000]: General error

    #0 /var/www/virtual/magentodev.com/htdocs/lib/Varien/Db/Adapter/Pdo/Mysql.php(249): PDOStatement->fetch(2)
    

    以下是我的模型代码,包括SQL查询:

    $write = Mage::getSingleton('core/resource')->getConnection('core_write');
    
    $sql = "LOCK TABLES mytable AS mytable_write WRITE, mytable AS mytable_read READ;
            SELECT @val := unique_field_to_grab FROM mytable AS mytable_read ORDER BY last_used ASC LIMIT 1;        
            UPDATE mytable AS mytable_write SET last_used = unix_timestamp() WHERE unique_field_to_grab = @val LIMIT 1;
            UNLOCK TABLES;
            SELECT @val AS val;";
    
    $result = $write->raw_fetchrow($sql, 'val');
    

    raw_query query 而不是 raw_fetchrow 没有运气。

    编辑 :我开始认为这可能与PDO驱动程序有关,Magento肯定在使用这个驱动程序。我认为phpMyAdmin正在使用mysqli,但我不能证实这一点。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Naktibalda    14 年前

    可能Magento使用的函数不支持多个sql语句。 分别调用每个语句。

    exec("LOCK TABLES mytable AS mytable_write WRITE, mytable AS mytable_read READ");
    exec("SELECT @val := unique_field_to_grab FROM mytable AS mytable_read ORDER BY last_used ASC LIMIT 1");
    exec("UPDATE mytable AS mytable_write SET last_used = unix_timestamp() WHERE unique_field_to_grab = @val LIMIT 1");
    exec("UNLOCK TABLES");
    exec("SELECT @val AS val");