喜欢声明匹配部分字符串

时间:2013-06-20 14:12:28

标签: php mysql sql magento

我正在使用脚本从CSV更新Magento中的产品价格。

目前,CSV中的SKU与Magento中的SKU完全不匹配。例如,CSV中的一个可能是33456,但在Magento中,它将是003456_01003456_02。所以我需要脚本只匹配SKU的中间部分,所以如果在Magento中的SKU之后有00_01,那么在移动到下一行之前它仍然会更新所有匹配该SKU的内容

$mageFilename = 'app/Mage.php';
    require_once $mageFilename;
    Mage::setIsDeveloperMode(true);
    ini_set('display_errors', 1);
    umask(0);
    Mage::app('admin');
    Mage::register('isSecureArea', 1);
    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

    set_time_limit(0);
    ini_set('memory_limit','1024M');

    /***************** UTILITY FUNCTIONS ********************/
    function _getConnection($type = 'core_read'){
        return Mage::getSingleton('core/resource')->getConnection($type);
    }

    function _getTableName($tableName){
        return Mage::getSingleton('core/resource')->getTableName($tableName);
    }

    function _getAttributeId($attribute_code = 'price'){
        $connection = _getConnection('core_read');
        $sql = "SELECT attribute_id
                    FROM " . _getTableName('eav_attribute') . "
                WHERE
                    entity_type_id = ?
                    AND attribute_code = ?";
        $entity_type_id = _getEntityTypeId();
        return $connection->fetchOne($sql, array($entity_type_id, $attribute_code));
    }

    function _getEntityTypeId($entity_type_code = 'catalog_product'){
        $connection = _getConnection('core_read');
        $sql        = "SELECT entity_type_id FROM " . _getTableName('eav_entity_type') . " WHERE entity_type_code = ?";
        return $connection->fetchOne($sql, array($entity_type_code));
    }

    function _getIdFromSku($sku){
        $connection = _getConnection('core_read');
        $sql        = "SELECT entity_id FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
        return $connection->fetchOne($sql, array($sku));

    }

    function _checkIfSkuExists($sku){
        $connection = _getConnection('core_read');
        $sql        = "SELECT COUNT(*) AS count_no FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
        $count      = $connection->fetchOne($sql, array($sku));
        if($count > 0){
            return true;
        }else{
            return false;
        }
    }

    function _updatePrices($data){
        $connection     = _getConnection('core_write');
        $sku            = $data[0];
        $newPrice       = $data[1];
        $productId      = _getIdFromSku($sku);
        $attributeId    = _getAttributeId();

        $sql = "UPDATE " . _getTableName('catalog_product_entity_decimal') . " cped
                    SET  cped.value = ?
                WHERE  cped.attribute_id = ?
                AND cped.entity_id = ?";
        $connection->query($sql, array($newPrice, $attributeId, $productId));
    }
    /***************** UTILITY FUNCTIONS ********************/

    $csv                = new Varien_File_Csv();
    $data               = $csv->getData('price-update/PRDAH014.csv'); //path to csv
    array_shift($data);

    $message = '';
    $count   = 1;
    foreach($data as $_data){
        if(_checkIfSkuExists($_data[0])){
            try{
                _updatePrices($_data);
                $message .= $count . '> Success:: While Updating Price (' . $_data[1] . ') of Sku (' . $_data[0] . '). <br />';

            }catch(Exception $e){
                $message .=  $count .'> Error:: While Upating  Price (' . $_data[1] . ') of Sku (' . $_data[0] . ') => '.$e->getMessage().'<br />';
            }
        }else{
            $message .=  $count .'> Error:: Product with Sku (' . $_data[0] . ') does\'t exist.<br />';
        }
        $count++;
    }
    echo $message;

2 个答案:

答案 0 :(得分:2)

如果您只想匹配中间部分,请使用%

$sql = "SELECT sku FROM table WHERE item LIKE '%$code%'";

答案 1 :(得分:1)

你必须在两个函数中放入DevZer0中所说的类似条件,因为它们都被调用。 最后的代码行将首先调用_checkIfSkuExists($_data[0]),然后_updatePrices($_data)调用$productId = _getIdFromSku($sku);