agiannis
3/1/2020 - 9:04 PM

cs-cart transfer data between two installations

Easily transfer data betweem two databases. The destination db must have access to old db.

labels: php , cs-cart , cscart , database , mysql , migrate

<?php


$php_value = phpversion();
if (version_compare($php_value, '5.6.0') == -1) {
    echo 'Currently installed PHP version (' . $php_value . ') is not supported. Minimal required PHP version is 5.6.0.';
    die();
}

define('AREA', 'C');

try {
    require(dirname(__FILE__) . '/init.php');
} catch (Exception $e) {
    \Tygh\Tools\ErrorHandler::handleException($e);
} catch (Throwable $e) {
    \Tygh\Tools\ErrorHandler::handleException($e);
}


function fn_copy_table($from, $to, $extra = '')
{
    /* Warning : Input is not sanitized */
    $old_columns = db_get_array("SHOW COLUMNS FROM " . $from);
    $new_columns = db_get_array("SHOW COLUMNS FROM " . $to);
    foreach ($old_columns as &$column) {
        $column = $column['Field'];
    }
    unset($column);
    foreach ($new_columns as &$column) {
        $column = $column['Field'];
    }
    $fields = array_intersect($old_columns, $new_columns);
    foreach ($fields as &$field) {
        $field = "`$field`";
    }
    $fields = implode(',', $fields);

    db_query("INSERT INTO $to ($fields) SELECT $fields FROM $from $extra");
}


function fn_transfer_categories()
{
    db_query("TRUNCATE eshopkatoikidio.cscart_categories");
    fn_copy_table('eshopkatoikidio_old.cscart_categories', 'eshopkatoikidio.cscart_categories');

    db_query("TRUNCATE eshopkatoikidio.cscart_category_descriptions");
    fn_copy_table('eshopkatoikidio_old.cscart_category_descriptions', 'eshopkatoikidio.cscart_category_descriptions');

    db_query("DELETE FROM eshopkatoikidio.cscart_seo_names WHERE `type`='c'");
    fn_copy_table('eshopkatoikidio_old.cscart_seo_names', 'eshopkatoikidio.cscart_seo_names', "WHERE type='c'");
}


function fn_transfer_products()
{
    $tables = ['cscart_products', 'cscart_products_categories', 'cscart_product_descriptions', 'cscart_product_prices', 'cscart_ult_product_descriptions', 'cscart_ult_product_prices'];
    foreach ($tables as $table) {
        db_query("TRUNCATE eshopkatoikidio.$table");
        fn_copy_table("eshopkatoikidio_old.$table", "eshopkatoikidio.$table");
    }


    db_query("DELETE `cscart_images`,`cscart_images_links` FROM `cscart_images` INNER JOIN cscart_images_links ON cscart_images_links.detailed_id = cscart_images.image_id AND cscart_images_links.object_type ='product'");
    db_query("DELETE FROM eshopkatoikidio.cscart_images_links WHERE `object_type`='product'");
    fn_copy_table('eshopkatoikidio_old.cscart_images_links', 'eshopkatoikidio.cscart_images_links', "WHERE object_type='product'");
    $image_ids = db_get_fields("SELECT detailed_id FROM eshopkatoikidio_old.cscart_images_links WHERE object_type='product'");
    foreach ($image_ids as $image_id) {
        fn_copy_table('eshopkatoikidio_old.cscart_images', 'eshopkatoikidio.cscart_images', "WHERE image_id = $image_id");
    }

    db_query("DELETE FROM eshopkatoikidio.cscart_seo_names WHERE `type`='p'");
    fn_copy_table('eshopkatoikidio_old.cscart_seo_names', 'eshopkatoikidio.cscart_seo_names', "WHERE type='p'");
}

function fn_transfer_product_features()
{

    $tables = ['cscart_product_features', 'cscart_product_features_descriptions', 'cscart_product_features_values', 'cscart_product_features_descriptions', 'cscart_product_feature_variants', 'cscart_product_feature_variant_descriptions'];
    foreach ($tables as $table) {
        db_query("TRUNCATE eshopkatoikidio.$table");
        fn_copy_table("eshopkatoikidio_old.$table", "eshopkatoikidio.$table");
    }

    db_query("DELETE FROM eshopkatoikidio.cscart_ult_objects_sharing WHERE `share_object_type`='product_features'");
    fn_copy_table('eshopkatoikidio_old.cscart_ult_objects_sharing', 'eshopkatoikidio.cscart_ult_objects_sharing', "WHERE share_object_type='product_features'");

    db_query("DELETE `cscart_images`,`cscart_images_links` FROM `cscart_images` INNER JOIN cscart_images_links ON cscart_images_links.detailed_id = cscart_images.image_id AND cscart_images_links.object_type ='feature_variant'");
    db_query("DELETE FROM eshopkatoikidio.cscart_images_links WHERE `object_type`='feature_variant'");
    fn_copy_table('eshopkatoikidio_old.cscart_images_links', 'eshopkatoikidio.cscart_images_links', "WHERE object_type='feature_variant'");
    $image_ids = db_get_fields("SELECT detailed_id FROM eshopkatoikidio_old.cscart_images_links WHERE object_type='feature_variant'");
    foreach ($image_ids as $image_id) {
        fn_copy_table('eshopkatoikidio_old.cscart_images', 'eshopkatoikidio.cscart_images', "WHERE image_id = $image_id");
    }

    db_query("DELETE FROM eshopkatoikidio.cscart_seo_names WHERE `type`='e'");
    fn_copy_table('eshopkatoikidio_old.cscart_seo_names', 'eshopkatoikidio.cscart_seo_names', "WHERE type='e'");
}

function fn_transfer_pages()
{
    $tables = ['cscart_pages', '	cscart_page_descriptions'];

    foreach ($tables as $table) {
        db_query("TRUNCATE eshopkatoikidio.$table");
        fn_copy_table("eshopkatoikidio_old.$table", "eshopkatoikidio.$table");
    }

    db_query("DELETE FROM eshopkatoikidio.cscart_ult_objects_sharing WHERE `share_object_type`='pages'");
    fn_copy_table('eshopkatoikidio_old.cscart_ult_objects_sharing', 'eshopkatoikidio.cscart_ult_objects_sharing', "WHERE share_object_type='pages'");

    db_query("DELETE FROM eshopkatoikidio.cscart_seo_names WHERE `type`='a'");
    fn_copy_table('eshopkatoikidio_old.cscart_seo_names', 'eshopkatoikidio.cscart_seo_names', "WHERE type='a'");
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {


    if (isset($_REQUEST['categories'])) {
        fn_transfer_categories();
    }

    if (isset($_REQUEST['products'])) {
        fn_transfer_products();
    }

    if (isset($_REQUEST['features'])) {
        fn_transfer_product_features();
    }

    if (isset($_REQUEST['pages'])) {
        fn_transfer_pages();
    }

    header('Location: transfer_data.php');
}
?>
<style>
    body {
        margin: 0;
    }

    form {
        display: flex;
        align-items: center;
        width: 100%;
        height: 100vh;
        justify-content: center;
        flex-direction: column;
        margin: 0;
    }

    input {
        font-size: 18px;
        padding: 5px 10px;
        width: 250px;
        margin: 5px;
    }
</style>
<form method="post">
    <input type="submit" name="products" value="Transfer Products" />
    <input type="submit" name="categories" value="Transfer Categories" />
    <input type="submit" name="features" value="Transfer Product Features" />
    <input type="submit" name="pages" value="Transfer Pages" />
</form>