Toon posts:

MySQL Query (find & replace)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor mijn Wordpress website gebruik ik momenteel een verouderde plugin die niet meer compatible is met PHP8.
Een andere plugin welke hetzelfde kunstje kan (het weergeven van geotagged foto's op een kaart + route).
De code om dit voor elkaar te krijgen lijkt ook grotendeels op elkaar, kwestie van find & replace zou je zeggen.
Nu kan ik natuurlijk de DB downloaden (zo groot is ie niet) met Notepad++ aan de gang gaan, maar het moet ook kunnen met PHPMyAdmin lijkt mij, wellicht met de MySQL Replace functie, echter heb ik daar niet echt kaas van gegeten...

Uiteraard heb ik al een backup van DB gemaakt, maar doe het liever in 1x goed, zonder restores en ander geklooi.

Wat moet er gebeuren?
De huidige plugin wordt op 2 manieren gebruikt op mijn site:

Mét en zonder foto's (alleen route).
code:
1
2
[sgpx nggalleries=324 gpx="/wp-content/uploads/2021/08/sGPX_2021081.gpx"]
[sgpx gpx="/wp-content/uploads/2021/08/sGPX_20210813.gpx"]


De nieuwe plugin wil graag deze string:
code:
1
2
[geo2 id=324 xmlurl=/wp-content/uploads/2021/08/sGPX_2021081.gpx]
[geo2 xmlurl=/wp-content/uploads/2021/08/sGPX_20210813.gpx]


Handmatig al getest in een post en dat werkt goed.
Feitelijk zal moeten gebeuren:

code:
1
2
3
4
5
6
7
8
Oud: [sgpx nggalleries= 
Nieuw: [geo2 id=

Oud: gpx="
Nieuw: xmlurl=

Oud: .gpx"
Nieuw: .gpx


De DB naam is: wp_db
De tabel naam is: wp_dbpost
De inhoud staat in kolom: post_content
Komt niet in elke regel voor in de tabel.

Uiteraard heb ik zelf al wat gezocht en kom uit op iets als:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        '[sgpx nggalleries=',
        '[geo2 id=');

SET 
    wp_dbpost = REPLACE(post_content,
        'gpx="',
        'xmlurl=');

SET 
    wp_dbpost = REPLACE(post_content,
        '.gpx"',
        '.gpx');


Weet alleen niet helemaal of dit zo gaat werken (ook ivm de quotes) en of het wellicht nog simpeler kan?
Welke DB guru kijkt even mee in mijn idee (schiet het gerust stuk) en kan me opweg helpen?

Alle reacties


Acties:
  • +1 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 24-09 15:32
Op regel 7 begin je een nieuwe statement, en op regel 12 ook. Het zijn echter geen geldige statements (UPDATE ontbreekt).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank, dit zou em dan moeten worden?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        '[sgpx nggalleries=',
        '[geo2 id=');

UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        'gpx="',
        'xmlurl=');

UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        '.gpx"',
        '.gpx');

Acties:
  • 0 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 24-09 15:32
Dat is syntactisch correct.

Acties:
  • 0 Henk 'm!

  • Wasp
  • Registratie: Maart 2001
  • Laatst online: 18:30
Wat ik zelf vaak doe met UPDATE statements is een controlequery maken die de kolommen vóór aanpassing en ná aanpassing weergeven, middels een SELECT query.

Soort van dry run. :)

Ryzen 9 5900X, MSI Tomahawk MAX, 32GB RAM, Nvidia RTX 4070 Ti | Mijn livesets


Acties:
  • 0 Henk 'm!

  • Kontsnorretje
  • Registratie: Augustus 2011
  • Laatst online: 14-06-2024
Wasp schreef op maandag 23 augustus 2021 @ 19:16:
Wat ik zelf vaak doe met UPDATE statements is een controlequery maken die de kolommen vóór aanpassing en ná aanpassing weergeven, middels een SELECT query.

Soort van dry run. :)
Dit altijd doen. Ik heb het 1x niet gedaan, en even een hele kolom verpest door 2 argumenteren om te draaien in een replace :+

Verder weet ik niet hoe Mysql reageert als je dit met losse replaces als kolom doet. Ik nest de replaces meestal.

code:
1
2
3
UPDATE table
SET column = REPLACE( REPLACE( REPLACE( column, 'oude waarde', 'nieuwe waarde'), 'aa', 'bb'), 'http://', 'https://') 
WHERE <conditie>;

Acties:
  • +2 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op maandag 23 augustus 2021 @ 18:44:
Dank, dit zou em dan moeten worden?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        '[sgpx nggalleries=',
        '[geo2 id=');

UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        'gpx="',
        'xmlurl=');

UPDATE wp_db
SET 
    wp_dbpost = REPLACE(post_content,
        '.gpx"',
        '.gpx');
Zoals @Kontsnorretje al aangeeft kan je die combineren. Hou er wel rekening mee dat de replaces volledig contextloos gebeuren. Dus als er ergens voor een andere plugin ook 'gpx=' in staat of '.gpx"', wordt dat ook vervangen.

Als dat voor jou relevant is, kan je ook kijken naar de REGEXP_REPLACE in MySQL 8 (zit niet in 5.7 en lager en vanaf 10.0.5 in MariaDB). Daarmee kan je deze wellicht wat veiliger de vervanging doen; maar het is wel wat complexer om goed te krijgen, gelukkig zijn er wel wat handige online test tools om regexpen uit te proberen.

Acties:
  • +1 Henk 'm!

Verwijderd

Topicstarter
Inmiddels gelukt. :)
Pagina: 1