Search And Replace
Recherche-remplacement MySQL respectant les données sérialisées, avec simulation, sauvegardes automatiques et restauration en un clic.
Version 1.0.0 · Extension Store · requiert PHP 7.4+ avec
mysqliRechercher et remplacer en toute sécurité des chaînes (y compris des domaines) dans des bases MySQL, en respectant les données sérialisées, avec simulation, sauvegardes automatiques et restauration.
Search And Replace réécrit des chaînes dans une base MySQL sans corrompre les données sérialisées — le classique problème de migration WordPress. Les valeurs sérialisées PHP voient leurs préfixes de longueur régénérés, les colonnes JSON sont ré-encodées, le texte simple est remplacé directement. Chaque exécution en écriture est précédée d'un mysqldump gzippé obligatoire, restaurable en un clic.
Usages typiques : migrations de domaine (ancien → nouveau domaine à travers wp_options, wp_postmeta, constructeurs de pages…), et remplacements de texte littéral en masse.
Onglet Run

Le flux suit quatre étapes numérotées sur une seule page :
1. Database
| Champ | Défaut | Notes |
|---|---|---|
| Host | localhost |
Nom d'hôte ou IP. |
| Database name | — | Lettres, chiffres, _, $, - seulement (max 64 caractères). |
| User / Password | — | Identifiants MySQL. |
Les identifiants ne sont jamais stockés — ni sur le disque, ni en session, ni dans les cookies. Ils vivent en mémoire PHP le temps de chaque requête et dans la mémoire de votre navigateur pour la durée de vie de la page (pour que la fenêtre Restore puisse les pré-remplir). Les champs bloquent activement l'autofill des gestionnaires de mots de passe, pour éviter l'injection de mauvais identifiants.
Cliquez Connect & list tables — l'extension introspecte le schéma et révèle les étapes 3 et 4.
2. Quoi remplacer
Deux modes (boutons radio) :
- Domain (recommandé) — saisissez l'ancien domaine et le nouveau domaine nus (sans protocole, sans
www.). L'outil les déploie en six variantes d'URL trouvées dans les bases réelles —https://www.,http://www.,//www.,https://,http://,//— appliquées dans un ordre sûr, avec un aperçu en direct des motifs exacts.- Force HTTPS on rewritten URLs (coché par défaut) : chaque variante réécrit vers
https://; décochez pour préserver le protocole d'origine de chaque URL.
- Force HTTPS on rewritten URLs (coché par défaut) : chaque variante réécrit vers
- Raw string — une seule paire recherche/remplacement littérale (pas de regex). Le PHP sérialisé et le JSON restent gérés de façon transparente.
3. Tables et colonnes
Une liste à cocher de chaque table (avec nombre de lignes, taille, moteur), toutes cochées par défaut. Dépliez une table pour basculer ses colonnes texte individuelles (CHAR/VARCHAR/TEXT/JSON — les colonnes BLOB/BINARY ne sont jamais touchées). Les tables sans clé primaire sont listées mais sautées (aucun UPDATE sûr possible) avec un avertissement.
4. Run
- Dry-run (preview only) — analyse tout, ne modifie rien, et montre ce qui serait changé.
- Run with backup — prend d'abord le mysqldump, puis applique les changements. Une fenêtre de confirmation exige que vous tapiez le nom de la base avant que le bouton se déverrouille.
Résultats
Après l'une ou l'autre opération : un résumé (changements trouvés, tables touchées, durée), une ventilation par table avec des fenêtres View changes, une grille d'échantillons avant/après (tronqués à 200 caractères), les avertissements éventuels (tables sautées, etc.), et — après une vraie exécution — le nom de la sauvegarde créée.
La progression est interrogée chaque seconde pendant les longues analyses (table courante, lignes analysées/modifiées). Un verrou empêche deux opérations simultanées.
Onglet Backups

Chaque entrée est le mysqldump pris juste avant un Run.
- Résumé du stockage — nombre de sauvegardes et taille totale. Les sauvegardes de plus de 7 jours sont supprimées automatiquement (vérifié à chaque chargement de page).
- Par sauvegarde : base, horodatages créé/expire, taille, l'opération qu'elle a précédée (mode + chaînes recherche/remplacement), et :
- Download — le
.sql.gzbrut. - Restore — ouvre une fenêtre (identifiants pré-remplis depuis votre dernière connexion si disponible, confirmation par saisie du nom de la base). Restaurer supprime et recrée les tables du dump, puis réimporte toutes les lignes — les changements faits après la sauvegarde sont perdus.
- Delete — permanent (avec confirmation).
- Download — le
Ce que contient une sauvegarde
mysqldump --single-transaction --quick --routines --triggers --events --skip-lock-tables --no-tablespaces --set-charset --default-character-set=utf8mb4, compressé en gzip (niveau 6), nommé <dbname>-AAAAMMJJ-HHMMSS.sql.gz, stocké root seulement sous extensions/search-and-replace/var/backups/. Le dump et la restauration ont chacun un plafond de délai d'une heure.
Comment les remplacements restent sûrs
| Forme des données | Traitement |
|---|---|
PHP sérialisé (s:14:"http://old.com";) |
Désérialisé avec allowed_classes => false (aucune instanciation d'objet), chaînes remplacées récursivement, re-sérialisé — préfixes de longueur régénérés. Les cellules contenant des objets sérialisés retombent sur un remplacement brut avec un avertissement. |
| JSON | Décodé, chaînes remplacées récursivement, ré-encodé. |
| Texte simple | Remplacement littéral direct, dans l'ordre des variantes. |
Autres garde-fous :
- Les identifiants (base/table/colonne) validés contre une liste blanche stricte et contre le schéma en direct.
- Les UPDATE s'exécutent en transactions, validées toutes les 500 lignes ; les lignes sont diffusées (usage mémoire stable sur d'énormes tables).
- Le mot de passe MySQL est passé à
mysqldump/mysqlvia un fichier temporaire--defaults-extra-fileen 0600 — jamais sur la ligne de commande (invisible àps). - Les chaînes recherche et remplacement doivent différer ; une recherche vide est refusée.
Défauts et limites (settings.default.json)
| Réglage | Défaut |
|---|---|
| Taille d'échantillon en dry-run (par table) | 50 |
| Niveau de compression des sauvegardes (gzip) | 6 |
| Rétention des sauvegardes | 7 jours |
| Longueur d'aperçu avant/après | 200 caractères |
| Taille de lot d'UPDATE (lignes par transaction) | 500 |
| Délai de connexion MySQL | 5 s |
(la v1.0.0 n'a pas d'interface de réglages — ceux-ci s'ajustent dans config/settings.default.json de l'extension au besoin.)
Carte des données et fichiers
| Chemin | Rôle |
|---|---|
extensions/search-and-replace/var/backups/ |
Dumps .sql.gz (0600, dossier 0700) |
extensions/search-and-replace/var/history.json |
Journal d'audit — chaque backup/restore/run/dry-run, plafonné à 500 entrées |
extensions/search-and-replace/var/operation.lock / operation-status.json |
Verrou d'exécution / progression en direct (éphémère) |