This is an article to document the migration of a Joomla! CMS running version 2.5.11 to an instance of Joomla! CMS version 3.4.1. I would consider the below instructions an ALPHA version as it is considered unstable for official use... Saying that this is how I upgraded my own personal website: www.joellipman.com.
This article assumes you are familiar with upgrading a Joomla! CMS and running MySQL statements against your database.
For the purposes of this article, we will refer to the live/current/production website running Joomla v2.5 as "v25" and the new Joomla instance as "v34". Their respective database tables are prefixed with "v25_" and "v34_". So an example MySQL statement will be:
`v25_db`.`v25_tablename`
-- with the database name and table prefix of database you are READING from (eg. `myuser_joellipmancom_mysitedb`.`lkdjf_content`)
`v34_db`.`v34_tablename`
-- with the database name and table prefix of database you are WRITING to (eg. `myuser_joellipmancom_mysitedb`.`ejf1r_content`)How?
Here's a brief outline of the whole process:
- Backups
- Install
- Users
- Categories -- unstable
- Content
- Weblinks
- 3rd-party: JComments
Here's a less brief outline of the whole process:
Pre-Notes: To begin with, ensure that no extra new users are created in the v34 system other than the user who is installing it.
- Preparation:
- Backup your Joomla v2.5.x database and website files
- Note the CURRENT super user identification number "ID" and alias (name)
- Ensure all items are "checked-in" (Do a "Global Check In")
- Install new Joomla:
- Install Joomla! CMS v3.4.x
- with Demo Content (eg. 3rd-party QuickStarts):
- [Personal Option] Modify admin ID to NOT use a text editor (ie. "Text-editor=None")
- If you are going to delete an object (eg. contacts), make a note on its contents or embedded code specific to the template.
- Copy over Users:
- Rename the Admin ID in the new v34 system to match your v25 system.
- Check your usergroups are the same in both systems. Import new ones.
- Copy all users except the v25 admin to your v34 database (with status=blocked)
- Copy over user group mappings
- Update new system admin details with old (name, registration date, etc).
- Copy over Categories:
- It is recommended to do this via the GUI and then associate the IDs to your content, weblinks, etc.
- The thing to watch out for is associating the categories with respect to the assets table.
- To do this via DB commands, refer to how the weblinks categories are added.
- Copy over Content:
- We want to maintain the same IDs for articles in case SEO settings will be enabled and the ID is in the URL.
- We will insert assets as new ones but associate these to the v25 assets.
- Categories will be associated by comparing both databases' content tables.
- Copy over Weblinks:
- Import the weblinks
- Copy over the weblink categories
- Copy over the weblink category assets
- Third-party component: JComments:
- This will be a copy of two systems running JComments version 3.x
- The MySQL scripts will copy over each table in turn
- Configure and Brand your new Joomla site
- Activate Users
Rename admin ID in the UPGRADE database
We want to make sure that the new user ID doesn't exist in our upgraded system because we may have a user with that ID in the old system who might inherit privileges they shouldn't have. This script has been adapted to change the Admin ID to a number that hasn't been taken yet or to use the current one and is specified as a local variable.
-- Specify v2.5.x admin ID and v3.4.x admin ID
SET @v25_admin_id=42; -- Set this to the ID number of the user in your Joomla 2.5.x
SET @v25_admin_alias='Webmaster'; -- Set this to the name of the admin user in your Joomla 2.5.x
SET @v34_admin_id=443; -- Set this to the ID number of the user in your Joomla 3.x
SET @v34_admin_alias='Webmaster'; -- Set this to the name of the admin user in your Joomla 3.x
-- Banners:
UPDATE `v34_db`.`v34_banners`
SET `created_by` = @v25_admin_id, `created_by_alias` = @v25_admin_alias
WHERE `created_by` = @v34_admin_id;
UPDATE `v34_db`.`v34_banners`
SET `modified_by` = @v25_admin_id
WHERE `modified_by` = @v34_admin_id;
-- Categories:
UPDATE `v34_db`.`v34_categories`
SET `created_user_id` = @v25_admin_id
WHERE `created_user_id` = @v34_admin_id;
UPDATE `v34_db`.`v34_categories`
SET `modified_user_id` = @v25_admin_id
WHERE `modified_user_id` = @v34_admin_id;
-- Contact Details: (you should clear this list as you will import them all!)
-- DELETE FROM `v34_db`.`v34_contact_details` WHERE `v34_contact_details`.`id` >= 1
-- ALTER TABLE `v34_db`.`v34_contact_details` AUTO_INCREMENT = 1
-- Content:
UPDATE `v34_db`.`v34_content`
SET `created_by` = @v25_admin_id, `created_by_alias` = @v25_admin_alias
WHERE `created_by` = @v34_admin_id;
UPDATE `v34_db`.`v34_content`
SET `modified_by` = @v25_admin_id
WHERE `modified_by` = @v34_admin_id;
-- Tags:
UPDATE `v34_db`.`v34_tags`
SET `created_user_id` = @v25_admin_id
WHERE `created_user_id`= @v34_admin_id;
UPDATE `v34_db`.`v34_tags`
SET `modified_user_id` = @v25_admin_id
WHERE `modified_user_id`= @v34_admin_id;
-- UCM Content:
UPDATE `v34_db`.`v34_ucm_content`
SET `core_created_user_id` = @v25_admin_id
WHERE `core_created_user_id`= @v34_admin_id;
UPDATE `v34_db`.`v34_ucm_content`
SET `core_modified_user_id` = @v25_admin_id
WHERE `core_modified_user_id`= @v34_admin_id;
-- UCM History:
UPDATE `v34_db`.`v34_ucm_history`
SET `editor_user_id` = @v25_admin_id
WHERE `editor_user_id` = @v34_admin_id;
-- User Usergroup Map:
UPDATE `v34_db`.`v34_user_usergroup_map`
SET `user_id` = @v25_admin_id
WHERE `user_id` = @v34_admin_id;
-- Users:
UPDATE `v34_db`.`v34_users`
SET `id` = @v25_admin_id
WHERE `id` = @v34_admin_id;
These are the Joomla! core ones that need modifying. If you have 3rd-party extensions (eg. K2) then you should run the respective commands to update the Installer ID in these as well.Copy over users (but with disabled accounts):
CHANGE the value of @v25_admin_id to the number (in my example "42") to the admin ID of your installer ID.
-- **********************************************************************
-- USERGROUPS:
-- **********************************************************************
-- Ensure ID (primary key) match up on both systems unless you have
-- custom usergroups.
-- I did not have to do it this time but shout if you need help
-- **********************************************************************
-- USERS: (but with disabled accounts)
-- **********************************************************************
-- Contrary to recommended practice, I'm moving these guys first so all
-- the objects from the existing site will retain their ownership. Based
-- on previous migrations, this tends to help not confuse the system.
-- **********************************************************************
-- Set to your v2.5.x admin ID to NOT migrate as per standard users
SET @v25_admin_id=42; -- Set this to the ID number of the user in your Joomla 2.5.x
-- Standard Users:
INSERT INTO
`v34_db`.`v34_users` (
`id`, `name`, `username`, `email`, `password`, `block`,
`sendEmail`, `registerDate`, `lastvisitDate`,
`activation`, `params`, `lastResetTime`, `resetCount`,
`otpKey`, `otep`, `requireReset`)
SELECT
`id`, `name`, `username`, `email`, `password`, 1,
`sendEmail`, `registerDate`, `lastvisitDate`,
`activation`, `params`, `lastResetTime`, `resetCount`,
'' AS `otpKey`, '' AS `otep`, 0
FROM
`v25_db`.`v25_users`
WHERE
`id` @v25_admin_id;
-- To import any new users on golive date
-- -- same as above but change the last line to "WHERE `id` > ####"
-- -- where #### is the last ID in the new v34 system.
-- -- NB: Don't forget to activate them at GoLive time.
-- *********************************************************************
-- USERGROUP MAPPING
-- *********************************************************************
-- Note-to-self: Delete rows other than the admin ID
-- DELETE FROM `v34_db`.`v34_user_usergroup_map` WHERE `user_id` @v25_admin_id;
-- *********************************************************************
INSERT INTO
`v34_db`.`v34_user_usergroup_map` (
`user_id`, `group_id`)
SELECT
`user_id`, `group_id`
FROM
`v25_db`.`v25_user_usergroup_map`
WHERE
`user_id` @v25_admin_id;
Joomla CategoriesUse method #1 if you already have third-party demo content in the database (eg. Quickstarts), use method #2 if you don't have any categories except the core Joomla ones.
-- *********************************************************************
-- CATEGORIES
-- *********************************************************************
-- Much tougher to do than one would think, especially if you have sample
-- content already in the new system. The thing to watch out for is
-- associating the categories with respect to the assets table.
-- *********************************************************************
-- METHOD #1- DOES NOT MAINTAIN V25 CATEGORY IDS: setup these categories
-- using the the Joomla admin interface Web-GUI to add them. Ensure the
-- aliases are the same in both systems. This is a more stable option.
-- *********************************************************************
-- *********************************************************************
-- METHOD #2- MAINTAINS V25 CATEGORY IDS: This will fail if you have any
-- conflicting categories already in the database. If you only have the
-- ones from an Out-of-the-box Joomla! CMS then this is what I use:
-- -- Copy and replace the below script per category
-- -- this example is for one "uncategorized content" category
-- *********************************************************************
SET @uncategorisedCategoryID_new = (
SELECT id
FROM `v34_db`.`v34_categories`
WHERE extension='com_content'
AND alias='uncategorised');
SET @uncategorisedCategoryID_old = (
SELECT id
FROM `v25_db`.`v25_categories`
WHERE extension='com_content'
AND alias='uncategorised');
UPDATE `v34_db`.`v34_categories`
SET `catid` = @uncategorisedCategoryID_new
WHERE `catid` = @uncategorisedCategoryID_old;
UPDATE `v34_db`.`v34_content`
SET `catid` = @uncategorisedCategoryID_new
WHERE `catid` = @uncategorisedCategoryID_old;
Joomla Content-- *********************************************************************
-- CONTENT
-- *********************************************************************
-- Should be a question of inserting then associating the categories and
-- inserting into the assets table per article. We are going to put a
-- marker ":|joe|:" and append the old ID for later use.
-- *********************************************************************
-- Assets
SET @maxAssetContentID = (SELECT COUNT(*) FROM `v34_db`.`v34_assets` WHERE `name` LIKE 'com_content.article.%');
SET @nextAssetContentID = @maxAssetContentID;
SET @assetParentID = (SELECT `id` FROM `v34_db`.`v34_assets` WHERE `name` LIKE 'com_content.category.%' AND `title` = 'Uncategorised' LIMIT 0,1);
INSERT INTO
`v34_db`.`v34_assets` (
`parent_id`, `lft`, `rgt`, `level`,
`name`,
`title`, `rules`)
SELECT
@assetParentID,
a.`lft`, a.`rgt`, a.`level`,
CONCAT('com_content.article.', @nextAssetContentID:=@nextAssetContentID+1, ':|joe|:', c.`id`) AS new_name,
a.`title`, a.`rules`
FROM
`v25_db`.`v25_assets` a
INNER JOIN `v25_db`.`v25_content` c ON c.`asset_id`=a.`id`
WHERE
a.`name` LIKE 'com_content.article.%';
-- Articles
INSERT INTO
`v34_db`.`v34_content` (
`id`, `asset_id`, `title`, `alias`, `introtext`,
`fulltext`, `state`, `catid`, `created`, `created_by`,
`created_by_alias`, `modified`, `modified_by`,
`publish_up`, `publish_down`, `images`, `urls`,
`attribs`, `version`, `ordering`, `metakey`, `metadesc`,
`access`, `hits`, `metadata`, `featured`, `language`,
`xreference`)
SELECT
a.`id`,
(
SELECT x.`id`
FROM `v34_db`.`v34_assets` x
WHERE x.`name` LIKE 'com_content.article.%'
AND x.`name` LIKE CONCAT('%', ':|joe|:', a.`id`)
) as asset_id,
a.`title`, a.`alias`, a.`introtext`,
a.`fulltext`, a.`state`, a.`catid`, a.`created`, a.`created_by`,
a.`created_by_alias`, a.`modified`, a.`modified_by`,
a.`publish_up`, a.`publish_down`, a.`images`, a.`urls`,
a.`attribs`, a.`version`, a.`ordering`, a.`metakey`, a.`metadesc`,
a.`access`, a.`hits`, a.`metadata`, a.`featured`, a.`language`,
a.`xreference`
FROM
`v25_db`.`v25_content` a;
-- Now associate new category IDs to new articles
UPDATE `v34_db`.`v34_content` c1
JOIN `v25_db`.`v25_content` c2 ON c2.`introtext`=c1.`introtext`
JOIN `v25_db`.`v25_categories` t2 ON c2.`catid`=t2.`id`
JOIN `v34_db`.`v34_categories` t1 ON t2.`alias`=t1.`alias`
AND t1.`path`=t2.`path`
AND t1.`extension`='com_content'
AND t2.`extension`='com_content'
SET
c1.`catid`=t1.`id`;
-- Joe-Code: LIST Rows to be affected (for test purposes)
-- SELECT SUBSTRING(a.`name`, 1, INSTR(a.`name`, ':|joe')-1 )
-- FROM `v34_db`.`v34_assets` a
-- WHERE a.`name` LIKE '%:|joe|:%'
-- Joe-Code: Remove comments
UPDATE `v34_db`.`v34_assets` a
SET a.`name`=SUBSTRING(a.`name`, 1, INSTR(a.`name`, ':|joe')-1 )
WHERE a.`name` LIKE '%:|joe|:%';
Weblinks
As helpful as they'll ever be. Still, I have a few I might want to keep, might as well migrate all of them:
-- *********************************************************************
-- Weblinks
-- *********************************************************************
-- First let us copy over all the weblinks, we will deal with categories
-- and assets afterwards:
-- *********************************************************************
-- Clear the weblinks table
DELETE FROM `v34_db`.`v34_weblinks`;
ALTER TABLE `v34_db`.`v34_weblinks` AUTO_INCREMENT=1;
-- Copy over the weblinks
INSERT INTO
`v34_db`.`v34_weblinks` (
`id`, `catid`, `title`, `alias`, `url`, `description`,
`hits`, `state`, `ordering`, `access`, `params`,
`language`, `created`, `created_by`, `created_by_alias`,
`modified`, `modified_by`, `metakey`, `metadesc`,
`metadata`, `featured`, `xreference`)
SELECT
a.`id`, a.`catid`, a.`title`, a.`alias`, a.`url`,
CONCAT(a.`description`, `:|joe|:`, a.`catid`) AS `description`,
a.`hits`, a.`state`, a.`ordering`, a.`access`, a.`params`,
a.`language`, a.`created`, a.`created_by`, a.`created_by_alias`,
a.`modified`, a.`modified_by`, a.`metakey`, a.`metadesc`,
a.`metadata`, a.`featured`, a.`xreference`
FROM
`v25_db`.`v25_weblinks` a;
-- Joe-Code: Remove comments
-- UPDATE `v34_db`.`v34_weblinks` a
-- SET a.`description`=SUBSTRING(a.`description`, 1, INSTR(a.`description`, ':|joe')-1 )
-- WHERE a.`description` LIKE '%:|joe|:%';
-- *********************************************************************
-- Weblink Categories
-- *********************************************************************
-- METHOD #1 - Use the GUI to create your weblink categories:
-- Adding the weblinks using the Joomla admin interface and then
-- updating the database with the correct IDs is easier than the script.
-- Use this if there aren't many to do. In this example, I am applying
-- this to the "uncategorized" category.
-- *********************************************************************
SET @uncategorisedCategoryID_new = (
SELECT id
FROM `v34_db`.`v34_categories`
WHERE extension='com_weblinks'
AND alias='uncategorised');
SET @uncategorisedCategoryID_old = (
SELECT id
FROM `v25_db`.`v25_categories`
WHERE extension='com_weblinks'
AND alias='uncategorised');
UPDATE `v34_db`.`v34_weblinks`
SET `catid` = @uncategorisedCategoryID_new
WHERE `catid` = @uncategorisedCategoryID_old;
-- *********************************************************************
-- Weblink Categories
-- *********************************************************************
-- METHOD #2: The challenge here is that we need the weblink categories
-- inserted as core joomla categories and their respective asset entries.
-- *********************************************************************
-- Assets
SET @maxAssetContentID = (
SELECT COUNT(*)
FROM `v34_db`.`v34_assets`
WHERE `name` LIKE 'com_weblinks.category.%');
SET @nextAssetContentID = @maxAssetContentID;
SET @assetParentID = (
SELECT `id`
FROM `v34_db`.`v34_assets`
WHERE `name` LIKE 'com_weblinks.category.%'
AND `title` = 'Uncategorised');
INSERT INTO
`v34_db`.`v34_assets` (
`parent_id`, `lft`, `rgt`,
`level`, `name`, `title`, `rules`)
SELECT
@assetParentID,
a.`lft`, a.`rgt`, a.`level`,
CONCAT('com_weblinks.category.', @nextAssetContentID:=@nextAssetContentID+1, ':|joe|:', c.`id`,':|joe|:', a.`name`) AS new_name,
a.`title`, a.`rules`
FROM
`v25_db`.`v25_assets` a
INNER JOIN `v25_db`.`v25_categories` c ON c.asset_id=a.id
WHERE
a.`name` LIKE 'com_weblinks.category.%';
-- Categories
SET @assetParentID = (
SELECT `id`
FROM `v34_db`.`v34_assets`
WHERE `name` LIKE 'com_weblinks.category%'
AND `title` = 'Uncategorised'
LIMIT 0,1);
INSERT INTO
`v34_db`.`v34_categories` (
`asset_id`, `parent_id`,
`level`, `path`, `extension`, `title`
`alias`, `note`, `description`, `published`
`access`, `params`, `metadesc`, `metakey`
`metadata`, `created_user_id`, `created_time`,
`modified_user_id`, `modified_time`, `hits`, `language`)
SELECT
a.`asset_id`,
@assetParentID,
a.`level`, a.`path`, a.`extension`, a.`title`,
a.`alias`, a.`note`, a.`description`, a.`published`,
a.`access`, a.`params`, a.`metadesc`, a.`metakey`,
a.`metadata`, a.`created_user_id`, a.`created_time`,
a.`modified_user_id`, a.`modified_time`, a.`hits`, a.`language`
FROM
`v25_db`.`v25_categories` a
INNER JOIN `v25_db`.`v25_assets` a2 ON a2.id=a.asset_id
INNER JOIN `v34_db`.`v34_assets` b ON (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(b.`name`, ':|joe|:', -2),':|joe|:', 1)
FROM `v34_db`.`v34_assets` b
WHERE b.`name` LIKE 'com_weblinks.category.%:|joe%'
) = a.id
WHERE
a2.`name` LIKE 'com_weblinks.category.%';
Pre-Release Go-Live Notes:The following is to enable any activated users on the v2.5 system so that they can log in to the new system.
-- TO ACTIVATE USERS (do NOT do this until after you have finished the migration):
UPDATE `v34_db`.`v34_users` a, `jbuzzer_joellipman_live`.`jdlv2_users` b SET a.`block`=b.`block` WHERE a.`id`=b.`id`;
-- Tip: order by created_user_id in both ascending/descending to ensure any new user IDs
-- Any deletions should be accompanied by reset of auto-increment
-- eg. ALTER TABLE `v34_content` AUTO_INCREMENT = 1
JComments
Obviously only do this if you have jComments installed. If I ever get a task to migrate a website with K2, I'll update this article.
-- *********************************************************************
-- JComments 3.0 for Joomla 3.x
-- *********************************************************************
-- A third-party product which is integrated to many delivered templates
-- that use the Joomla core content components.
-- *********************************************************************
-- Our task here is to insert the new comments, correctly associated to
-- their respective articles and users. Most of the users as per
-- previous steps will match up, anonymous users (non-registered members)
-- will be migrated without association (retain UserID=0). The article IDs
-- should also match up.
-- *********************************************************************
-- This script assumes you have no jComments in the new system (why
-- should you have new ones? This is a site migration not an upgrade).
-- [Optional: Clear jComments and reset table index with DELETE and ALTER]
-- NOTE: One-line inserts only apply where the column count is the same.
-- *********************************************************************
-- Comments
DELETE FROM `v34_db`.`v34_jcomments`;
ALTER TABLE `v34_db`.`v34_jcomments` AUTO_INCREMENT=1;
INSERT INTO
`v34_db`.`v34_comments` (
`id`, `parent`, `thread_id`,
`path`, `level`, `object_id`,
`object_group`, `object_params`, `lang`,
`userid`, `name`, `username`,
`email`, `homepage`, `title`, `comment`
`ip`, `date`, `isgood`, `ispoor`
`published`, `deleted`, `subscribe`, `source`
`source_id`, `checked_out`, `checked_out_time`, `editor`
)
SELECT
a.`id`, a.`parent`, a.`thread_id`,
a.`path`, a.`level`, a.`object_id`,
a.`object_group`, a.`object_params`, a.`lang`,
a.`userid`, a.`name`, a.`username`,
a.`email`, a.`homepage`, a.`title`, a.`comment`
a.`ip`, a.`date`, a.`isgood`, a.`ispoor`
a.`published`, a.`deleted`, a.`subscribe`, a.`source`
a.`source_id`, a.`checked_out`, a.`checked_out_time`, a.`editor`
FROM
`v25_db`.`v25_comments` a
-- Blacklist
DELETE FROM `v34_db`.`v34_jcomments_blacklist`;
ALTER TABLE `v34_db`.`v34_jcomments_blacklist` AUTO_INCREMENT=1;
INSERT INTO
`v34_db`.`v34_jcomments_blacklist` (
`id`, `ip`, `userid`,
`created`, `created_by`,
`expire`, `reason`, `notes`,
`editor`
)
SELECT
a.`id`, a.`ip`, a.`userid`,
a.`created`, a.`created_by`,
a.`expire`, a.`reason`, a.`notes`,
a.`editor`
FROM
`v25_db`.`v25_jcomments_blacklist` a
-- Custom BB Codes
DELETE FROM `v34_db`.`v34_jcomments_custom_bbcodes`;
ALTER TABLE `v34_db`.`v34_jcomments_custom_bbcodes` AUTO_INCREMENT=1;
INSERT INTO `v34_db`.`v34_jcomments_custom_bbcodes`
SELECT * FROM `v25_db`.`v25_jcomments_custom_bbcodes`;
DELETE FROM `v34_db`.`v34_jcomments_objects`;
ALTER TABLE `v34_db`.`v34_jcomments_objects` AUTO_INCREMENT=1;
INSERT INTO
`v34_db`.`v34_jcomments_objects` (
`id`, `object_id`, `object_group`,
`lang`, `title`,
`link`, `access`, `userid`,
`expired`, `modified`
)
SELECT
a.`id`, a.`object_id`, a.`object_group`,
a.`lang`, a.`title`,
a.`link`, a.`access`, a.`userid`,
a.`expired`, a.`modified`
FROM
`v25_db`.`v25_jcomments_objects` a
-- INSERT INTO `v34_db`.`v34_jcomments_reports`
-- SELECT * FROM `v25_db`.`v25_jcomments_reports`;
DELETE FROM `v34_db`.`v34_jcomments_settings`;
ALTER TABLE `v34_db`.`v34_jcomments_settings` AUTO_INCREMENT=1;
INSERT INTO `v34_db`.`v34_jcomments_settings`
SELECT * FROM `v25_db`.`v25_jcomments_settings`;
DELETE FROM `v34_db`.`v34_jcomments_subscriptions`;
ALTER TABLE `v34_db`.`v34_jcomments_subscriptions` AUTO_INCREMENT=1;
INSERT INTO
`v34_db`.`v34_jcomments_subscriptions` (
`id`, `object_id`, `object_group`,
`lang`, `userid`,
`name`, `email`, `hash`,
`published`, `source`
)
SELECT
a.`id`, a.`object_id`, a.`object_group`,
a.`lang`, a.`userid`,
a.`name`, a.`email`, a.`hash`,
a.`published`, a.`source`
FROM
`v25_db`.`v25_jcomments_subscriptions` a
-- INSERT INTO `v34_db`.`v34_jcomments_version` SELECT * FROM `v25_db`.`v25_jcomments_version`;
DELETE FROM `v34_db`.`v34_jcomments_votes`;
ALTER TABLE `v34_db`.`v34_jcomments_votes` AUTO_INCREMENT=1;
INSERT INTO
`v34_db`.`v34_jcomments_votes` (
`id`, `commentid`, `userid`,
`ip`, `date`,
`value`
)
SELECT
`id`, `commentid`, `userid`,
`ip`, `date`,
`value`
FROM
`v25_db`.`v25_jcomments_votes` a
Quick string replacementsThese are merely for reference for myself. Their purpose are for quick tweaks to the database values after a migration.
-- Replace stringtofind with the string you want to find
-- Replace stringtoreplace with the string you want to replace with
-- REPLACE FROM A STARTING POINT
-- Read-Only (see changes to commit)
SELECT a.`fieldtochange`, SUBSTRING(a.`fieldtochange`, INSTR(a.`fieldtochange`, 'stringtofind') )
FROM `v34_mytablename` a
WHERE a.`fieldtochange` LIKE '%stringtofind%'
-- Write-Mode (commit changes)
UPDATE `v34_mytablename` a
SET a.`fieldtochange`= SUBSTRING(a.`fieldtochange`, INSTR(a.`fieldtochange`, 'stringtofind') )
WHERE a.`fieldtochange` LIKE '%stringtofind%'
-- REPLACE ANY OCCURRENCE
-- Read-Only (see changes to commit)
SELECT a.`fieldtochange`, REPLACE(a.`fieldtochange`, 'stringtofind', 'stringtoreplace')
FROM `v34_mytablename` a
WHERE a.`fieldtochange` LIKE '%stringtofind%'
-- Write-Mode (commit changes)
UPDATE `v34_mytablename` a
SET a.`fieldtochange` = REPLACE(a.`fieldtochange`, 'stringtofind', 'stringtoreplace')
WHERE a.`fieldtochange` LIKE '%stringtofind%'
Watch out for any recursive loops.Disclaimer:
As I use this on more websites, I will update this article accordingly. At the time of print, I have only done one website with the above instructions, mine.
Discussion
Comments
Questions, corrections and useful additions are reviewed before appearing here.
No comments yet. Start the discussion.