Seite 1 von 2

SQL suche&ersetze

Verfasst: 10.03.2013 17:55
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

Re: SQL suche&ersetze

Verfasst: 10.03.2013 18:03
von Crizzo
Hi,

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

Grüße

Re: SQL suche&ersetze

Verfasst: 10.03.2013 22:01
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

Re: SQL suche&ersetze

Verfasst: 10.03.2013 22:05
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.

Re: SQL suche&ersetze

Verfasst: 10.03.2013 22:44
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.

Re: SQL suche&ersetze

Verfasst: 10.03.2013 23:19
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

Re: SQL suche&ersetze

Verfasst: 11.03.2013 01:07
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...

Re: SQL suche&ersetze

Verfasst: 11.03.2013 18:00
von Miriam
Wie sieht denn Dein BBcode in der DB aus?

Re: SQL suche&ersetze

Verfasst: 12.03.2013 22:07
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

Re: SQL suche&ersetze

Verfasst: 12.03.2013 22:40
von Miriam
Also dann würde ich einen Dump der DB nehmen und das ganze mit Notepad++ und dieser Regexp abarbeiten.