Habituellement, j'utilise find manuel pour remplacer du texte dans une base de données MySQL avec phpmyadmin. J'en ai assez, comment puis-je lancer une requête pour trouver et remplacer un texte par un nouveau texte dans tout le tableau de phpmyadmin?
Exemple: recherchez le mot clé domain.com
, remplacez-le par www.domain.com
.
Pour une mise à jour single table
UPDATE `table_name`
SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')
De multiple tables
-
Si vous voulez éditer toutes les tables, le mieux est de prendre dump
puis find/replace
et de le télécharger à nouveau.
Le moyen le plus simple que j'ai trouvé est de vider la base de données dans un fichier texte, d'exécuter une commande sed pour remplacer et de recharger la base de données dans MySQL.
Toutes les commandes sont bash sur Linux, à partir de la mémoire.
Vider la base de données dans un fichier texte
mysqldump -u user -p databasename > ./db.sql
Exécuter la commande sed pour rechercher/remplacer la chaîne cible
sed -i 's/oldString/newString/g' ./db.sql
Recharger la base de données dans MySQL
mysql -u user -p databasename < ./db.sql
Peasy facile.
Mettez ceci dans un fichier php et lancez-le. Il devrait faire ce que vous voulez.
// Connect to your MySQL database.
$hostname = "localhost";
$username = "db_username";
$password = "db_password";
$database = "db_name";
mysql_connect($hostname, $username, $password);
// The find and replace strings.
$find = "find_this_text";
$replace = "replace_with_this_text";
$loop = mysql_query("
SELECT
concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s
FROM
information_schema.columns
WHERE
table_schema = '{$database}'")
or die ('Cant loop through dbfields: ' . mysql_error());
while ($query = mysql_fetch_assoc($loop))
{
mysql_query($query['s']);
}
Exécuter une requête SQL dans PHPmyadmin pour rechercher et remplacer du texte dans toutes les publications de blog wordpress, telles que rechercher mysite.com/wordpress et le remplacer par mysite.com/newsTable, dans cet exemple, est tj_posts.
UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);
Comme par exemple, si je veux remplacer toutes les occurrences de John par Mark, je vais utiliser ci-dessous,
UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Une autre option consiste à générer les instructions pour chaque colonne de la base de données:
SELECT CONCAT(
'update ', table_name ,
' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');'
) AS statement
FROM information_schema.columns
WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%';
Cela devrait générer une liste d'instructions de mise à jour que vous pouvez ensuite exécuter.
Je crois que "swapnesh" répond d'être le meilleur! Malheureusement, je ne pouvais pas l'exécuter dans phpMyAdmin (4.5.0.2) qui, bien qu'illogique (et ayant essayé plusieurs choses), répétait qu'une nouvelle déclaration avait été trouvée et qu'aucun délimiteur n'avait été trouvé…
Ainsi, je suis arrivé avec la solution suivante qui pourrait être utile si vous rencontrez le même problème et n’avez pas d’autre accès à la base de données que PMA…
UPDATE `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
SET `toUpdate`.`guid`=`updated`.`guid`
WHERE `toUpdate`.`ID`=`updated`.`ID`;
Pour tester le résultat attendu, vous pouvez utiliser:
SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid`
FROM `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
WHERE `toUpdate`.`ID`=`updated`.`ID`;
Si vous êtes certain qu'aucun des champs à mettre à jour n'est sérialisé, les solutions ci-dessus fonctionneront bien.
Toutefois, si l'un des champs nécessitant une mise à jour contient des données sérialisées, une requête SQL ou une simple recherche/remplacement sur un fichier de vidage interrompt la sérialisation - à moins que la chaîne remplacée ait exactement le même nombre de caractères que la chaîne recherchée.
Pour être sûr, un champ "sérialisé" ressemble à ceci:
a:1:{s:13:"administrator";b:1;}
Le nombre de caractères dans les données pertinentes est codé en tant que partie des données. C'est un moyen de convertir facilement des "objets" en un format facilement stocké dans une base de données. Voici un explication de comment, pourquoi et de différentes méthodes utilisé pour sérialiser les données d'objet. Voici une autre description , mais en langage clair.
Ce serait étonnant si MySQL avait un outil intégré pour gérer correctement les données sérialisées, mais ce n’est pas le cas.
(Pour être juste, le lien précédent indique pourquoi cela n’aurait même pas de sens de le faire.)
wp-cli
Certaines des réponses ci-dessus semblaient spécifiques aux WordPress bases de données, qui sérialisent une grande partie de leurs données. WordPress propose un outil de ligne de commande, wp search-replace , qui gère la sérialisation.
Une commande de base serait:
wp search-replace 'an-old-string' 'a-new-string' --dry-run
Cependant, wordpress souligne que le guid
ne devrait jamais être modifié , il est donc recommandé de sauter cette colonne. Cela suggère également que vous voudrez souvent sauter la table wp_users
. Voici à quoi cela ressemblerait:
wp search-replace 'https://old-domain.com' 'https://shiney-new-domain.com' --skip-columns=guid --skip-tables=wp_users --dry-run
Remarque: j'ai ajouté le drapeau --dry-run
afin qu'un copier-coller ne gâche pas automatiquement la base de données de quiconque. Une fois que vous êtes certain que le script fait ce que vous voulez, exécutez-le à nouveau sans cet indicateur.
Plugins
Si vous utilisez WordPress, il existe également de nombreux plug-ins gratuits et commerciaux offrant une interface graphique permettant de faire la même chose, avec de nombreuses fonctionnalités supplémentaires.
Script php d'interconnexion/it
Interconnect/propose un script php pour gérer les données sérialisées, outil Safe Search and Replace , créé pour être utilisé sur les sites WordPress, mais semble pouvoir être utilisé. sur toute base de données sérialisée par PHP. De nombreuses entreprises, y compris WordPress, recommandent elles-mêmes cet outil. Instructions ici, environ 3/4 en bas de la page.
le mieux que vous exportez sous forme de fichier SQL et ouvrez-le avec l'éditeur tel que code de studio visuel et trouver et repalace vos mots . Je remplace dans 1 fichier de fichier SQL en 1 minutes pour 16 Word que total est 14600 Word . c’est la meilleure façon… .. et après le remplacer, sauvegardez et importez-le à nouveau… .. n'oubliez pas de le compresser avec Zip pour l’importer.
mysql -e "SELECT CONCAT ('update', nom_table, 'set', nom_colonne, '= replace (', nom_colonne, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Instruction AS FROM information_schema.columns WHERE nom_table LIKE' wp_% '"-u racine -p votre_nom_bdd_ici> upgrade_script.sql
nano upgrade_script.sql
mysql -u root -p votre_nom_db_ici - ici --force <upgrade_script.sql