SQL suche&ersetze

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
kolja
Mitglied
Beiträge: 1546
Registriert: 13.05.2005 16:39
Wohnort: münster

SQL suche&ersetze

Beitrag von kolja »

Moin phpBB Forum

Gerne würde ich unsere alten "custom-BBCodes" aus allen Beiträgen entfernen.
Es gibt zwei unterschiedliche Fälle:

Code: Alles auswählen

[kalender=Wo:]hier[/kalender]
Soll zu: Wo: hier werden.

Code: Alles auswählen

[kalender=custom_field:]was auch immer[/kalender]
Soll zu: was auch immer werden

Den ersten Fall kann ich mit:

Code: Alles auswählen

UPDATE tabelle SET post_content = replace(post_content, "[kalender=Wo:]", "<b>Wo: </b>);
lösen. (Das Fettgedruckte hier im Post dient nur der Anschauung)

Die Endtags ([/kalender]) bekomme ich ja auch ganz einfach weg...

Aber die Custom-Fields können ja unterschiedlich aussehen,
aber immer nach diesem Schema:

Code: Alles auswählen

[kalender=test1] inhalt [/kalender]
[kalender=test2] inhalt [/kalender]
Ich benötige nur den "Inhalt", test1 und test2 können verschwinden....

Aber wie bekomme ich diese in meine Suche mit einbezogen?

Gibt es so etwas in der Art:
["Kalender=*]
Wobei das Sternchen für alles mögliche stehen kann.

Gruß aus Hannover

Kolja
Das Leben ist unberechenbar - deshalb ist Improvisation wichtiger als Planung!

Es ist besser zu geben, als zu leihen, und kostet ungefähr gleichviel.

.: Münsters Reggae Forum :.
Benutzeravatar
Crizzo
Administrator
Administrator
Beiträge: 11968
Registriert: 19.05.2005 21:45
Kontaktdaten:

Re: SQL suche&ersetze

Beitrag von Crizzo »

Hi,

mit der Methode müsste das doch gehen: viewtopic.php?f=85&t=162049

Grüße
Benutzeravatar
kolja
Mitglied
Beiträge: 1546
Registriert: 13.05.2005 16:39
Wohnort: münster

Re: SQL suche&ersetze

Beitrag von kolja »

Hallo

Danke für den Link.

Leider ist das genau der Weg, zumindest sollte er das sein,
welcher mir bei dem ersten Problem hilft.

Aber da muss ich jetzt dieses * unterbringen :roll:


etwa so:

Code: Alles auswählen

UPDATE phpbb_posts
SET post_text = REPLACE(post_text, 'old * text', 'new text')
WHERE post_text LIKE '%old text%'
Um damit z.B. sowas zu finden: "old red text" und "ols green text",
und diese mit "new text" zu ersetzen.

Gruß Kolja
Das Leben ist unberechenbar - deshalb ist Improvisation wichtiger als Planung!

Es ist besser zu geben, als zu leihen, und kostet ungefähr gleichviel.

.: Münsters Reggae Forum :.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: SQL suche&ersetze

Beitrag von Miriam »

Also ich meine, daß keiner der bisher genannten Ansätze wie gewünscht funktioniert, weil BBCodes eine ID dabei haben. Von daher ist bloßes Suchen und Ersetzen nicht möglich.
Möglicherweise können dort Regular Expressions zum Einsatz kommen.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: SQL suche&ersetze

Beitrag von gn#36 »

Auch wenn das möglicherweise sehr langsam ist: Bevor ich mir über sowas lange Gedanken machen würde, würde ich mir dazu vermutlich einfach ein kurzes PHP Skript schreiben:
  • alle post ids raussuchen in denen irgend so ein Tag drin ist.
  • jeden post in einer Schleife mittels functions_post_oo.php Objekten laden (die Datei findet sich z. B. in unserem Hookup Mod, alternativ gehen die phpbb internen funktionen natürlich auch, oder man macht es zu fuß)
  • bbcode uids etc kümmert sich das Objekt schon drum, also per RegEx filtern und wieder speichern.
Reguläre Ausdrücke gibt es zwar auch in mysql, aber ob du damit auf einfache Weise Ersetzungen machen kannst weiß ich nicht: http://dev.mysql.com/doc/refman/5.5/en/regexp.html

Das hier sieht recht vielversprechend aus (und sagt mir, dass das standardmäßig nicht geht): https://launchpad.net/mysql-udf-regexp

Alternativ könntest du auch einen Dump der Tabelle erstellen und den dann mit einem Tool deiner Wahl filtern, das Reguläre Ausdrücke beherrscht und anschließend wieder importieren. Da da einiges bei Schief gehen kann würde ich das aber nicht empfehlen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
kolja
Mitglied
Beiträge: 1546
Registriert: 13.05.2005 16:39
Wohnort: münster

Re: SQL suche&ersetze

Beitrag von kolja »

Nabend gn

Danke für die ausführliche Antwort!

Viel von dem was du geschrieben hast, ist mindestens eine Nummer zu hoch für mich...
Aber das diese mysql udf regexp seite gibt, zeigt auch mir,
dass mein Problem nicht trivial ist.

@Miriam
Vielleicht liegt es an den damals nicht sauber programmierten custom BB-Codes,
aber eine ID ist mir noch nicht untergekommen.
Aber jetzt wo du es sagst....

Das ganze Aktion dient auch der Aktualisierung und Portierung der Datenbank bzw. des Forums,
ist scheinbar nötig....

Grüße Kolja
Das Leben ist unberechenbar - deshalb ist Improvisation wichtiger als Planung!

Es ist besser zu geben, als zu leihen, und kostet ungefähr gleichviel.

.: Münsters Reggae Forum :.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: SQL suche&ersetze

Beitrag von gn#36 »

Also ein grobes Muster für ein Skript wäre sowas:

Code: Alles auswählen

<?php
// ... Initialisierung, schenke ich mir mal
include "{$phpbb_root_path}includes/functions_post_oo.php";

// Vorauswahl treffen, nur Posts die irgendwas in der Richtung enthalten:
// Achtung, könnte Case Sensitive sein, wenn post_text als BINARY Spalte definiert ist.
// Eventuell auch hier schon durch einen Regulären Ausdruck ersetzen.
$sql = 'SELECT post_id FROM ' . POSTS_TABLE . ' WHERE post_text LIKE \'%[kalender%\'';
$result = $db->sql_query($sql);

$i = 0;
while($row = $db->sql_fetchrow($result))
{
    //Post laden
    $post = post::get($row['post_id']);
    // Hier wird die Ersetzung vorgenommen
    // Dinge der Form [kalender=blabla] entfernen (blabla darf nicht alles sein, nur Unterstriche, Zahlen und Text)
    $post->post_text = preg_replace('#\[kalender=[\w\s]*?\]#i', '', $post->post_text);
    
    // Dinge der Form [kalender=blabla] durch blabla ersetzen (blabla darf nicht alles sein, nur Unterstriche, Zahlen und Text)
    $post->post_text = preg_replace('#\[kalender=([\w\s]*?)\]#i', '$1', $post->post_text);

    //Das ganze mit bbcode UID, falls die alten BBcodes da irgendwie mist gebaut haben
    // Dinge der Form [kalender=blabla] entfernen (blabla darf nicht alles sein, nur Unterstriche, Zahlen und Text)
    $post->post_text = preg_replace('#\[kalender=[\w\s]*?(:[A-F0-9]*)?\]#i', '', $post->post_text);
    
    // Dinge der Form [kalender=blabla] durch blabla ersetzen (blabla darf nicht alles sein, nur Unterstriche, Zahlen und Text)
    $post->post_text = preg_replace('#\[kalender=([\w\s]*?)(:[A-F0-9]*)?\]#i', '$1', $post->post_text);
    
    // Einfache Strings ersetzen:
    $post->post_text = str_replace('Suchstring', 'Ersatz (darf auch leer sein)', $post->post_text);

    // Änderungen speichern.
    $post->submit();

    $i++;
    if($i %10 == 0)
    {
        echo "Posts bearbeitet: $i <br>\n";
    }
} 
echo "Fertig...";
echo "Insgesamt wurden $i Posts bearbeitet.";
Das das ungetestet ist und deshalb auf jeden Fall nur auf eine Kopie des Backups losgelassen werden sollte versteht sich hoffentlich von selbst...
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: SQL suche&ersetze

Beitrag von Miriam »

Wie sieht denn Dein BBcode in der DB aus?
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
kolja
Mitglied
Beiträge: 1546
Registriert: 13.05.2005 16:39
Wohnort: münster

Re: SQL suche&ersetze

Beitrag von kolja »

Nabed

@gn#36
Danke für dein Skript.
Leider befindet sich meine Datenbank nicht in einer PHPBB Installation.
Deswegen kann ich nicht auf die Variablen zugreifen...

Ich habe versucht das anzupassen, aber so klappt es leider nicht:

Code: Alles auswählen

<?php
$con=mysqli_connect("localhost","xxx","xxx","xxx");
$result = mysqli_query($con,"SELECT * FROM forum_posts");

$i = 0;
while($row = mysqli_fetch_array($result))
{
    //Post laden
    $post = ID::get($row['ID']);    
    // Einfache Strings ersetzen:
    $post->post_text = str_replace('Suchstring', 'Ersatz (darf auch leer sein)', $post->post_text);
    // Änderungen speichern.
    $post->submit();
    $i++;
    if($i %10 == 0)
    {
        echo "Posts bearbeitet: $i <br>\n";
    }
} 
echo "Fertig...";
echo "Insgesamt wurden $i Posts bearbeitet.";
mysqli_close($con);
?>
Siehst du da den Fehler?

@Miriam
Der BBCode sieht so aus:

Code: Alles auswählen

[kalender=custom_field:]was auch immer[/kalender]
Davon möchte ich den Teil "[kalender=custom_field:]" finden und mit nichts ersetzen (also löschen).
Das "custom_field" ist eine Zeichenkette aus Buchstaben oder / und Zahlen.

Mit REGEXP kann ich damit:

Code: Alles auswählen

 \[kalender=(.+:]) 
darauf zugreifen.

Danke für Eure Unterstützung

Kolja
Das Leben ist unberechenbar - deshalb ist Improvisation wichtiger als Planung!

Es ist besser zu geben, als zu leihen, und kostet ungefähr gleichviel.

.: Münsters Reggae Forum :.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: SQL suche&ersetze

Beitrag von Miriam »

Also dann würde ich einen Dump der DB nehmen und das ganze mit Notepad++ und dieser Regexp abarbeiten.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Antworten

Zurück zu „Coding & Technik“