← SMF

Alterar palavras

Lida 6714 vezes

Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Boas,
Gostaria de saber se existe um mod/script para alterar em todos os posts uma palavra por outra. Ou seja, o meu objectivo neste momento é alterar o código de atalho dos smileys mas para tal, nos posts já feitos também têm que ser alterados.

Cumps
Offline

Pedro Lopes 
Beta tester
Mensagens 3568 Gostos 18
Feedback +6

Troféus totais: 32
Trófeus: (Ver todos)
Level 6 Windows User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3

Vais ao phpmyadmin, procuras e substituis.
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Vais ao phpmyadmin, procuras e substituis.
Bem que morria se o fizesse! :P ... São milhares de posts. (E não há phpmyadmin neste caso, conseguiria aceder única e exclusivamente através de ssh, mas os meus comandos de MySQL andam esquecidos).
Offline

Carlos Gandra 
Administrador
Mensagens 3081 Gostos 97
Feedback +1

Troféus totais: 34
Trófeus: (Ver todos)
Level 6 Super Combination Combination Topic Starter 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4

Podes fazer um find and replace automático, programas como o Notepad++ dão para isso ;)
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Podes fazer um find and replace automático, programas como o Notepad++ dão para isso ;)
Não é muito viável! Estamos a falar de uma base de dados que já é pesadinha, e isso implica ter o fórum parado por algum tempo. Daí a eu perguntar se não anda por aí uma script que o faça ou mesmo um mod que futuramente daria-me jeito para outras modificações.
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Boas,
Gostaria de saber se existe um mod/script para alterar em todos os posts uma palavra por outra. Ou seja, o meu objectivo neste momento é alterar o código de atalho dos smileys mas para tal, nos posts já feitos também têm que ser alterados.

Cumps

Uma solução será iterares pela base de dados, na tabela e campo onde te interessa repor esses valores e para cada post, realizar um preg_replace (ou equivalente) para substituir a o padrão que queres repor.

A título exemplificativo (se quiseres mais detalhe manda PM):

Citação de: exemplo.php

<?php
set_time_limit
(900);

$dbHost
	
	
'localhost';
$dbUser
	
	
'user';
$dbPass
	
	
'passwd';
$dbName
	
	
'wordpress';

$needle 
	
'/images/avatars/';
$new_path
	
'/novo_caminho/avatars';

$con mysql_connect($dbHost$dbUser$dbPass) or die('Erro ao ligar à bd');
$sel mysql_select_db($dbName) or die('Erro a seleccionar a bd');

$sql "SELECT post_content, ID FROM wp_posts";
$qry mysql_query($sql) or die('Erro linha 13:' mysql_error());

while(
$obj mysql_fetch_object($qry)){
	
unset(
$haystack$new_value$id);
	

	
$id $obj->ID;
	
$haystack $obj->post_content;
	
$new_value preg_replace($needle$new_path$haystack);
	

	
$new_value mysql_real_escape_string($new_value);
	

	
$sqlIns "UPDATE wp_posts SET post_content='$new_value' WHERE ID='$id'";
	
$qryIns mysql_query($sqlIns) or die('Erro linha 28: ' mysql_error());
}
?>

Podes ter de elaborar um pouco o regex, mas a ideia está ai.


EDIT - Escusado será dizer que para realizares a alteração deves primeiro fazer uma cópia da BD e testar (ver se o preg_match está a apanhar a string correctamente).

Quando tiveres a certeza que sim, fechas o fórum (para ter a certeza que a BD não é mexida), fazes um backup da BD e corres o ficheiro.
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

grande ajuda diogoosorio.

No entanto vi que usaste ou foste buscar isso a algo do WP. No entanto vou só fazer umas modificações nisso e já trago novidades!!

Obrigado!
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Código: [Seleccione]
$sqlIns = "UPDATE wp_posts SET post_content='$new_value' WHERE ID='$id'";
Eu pensei em substituir isto por:
Código: [Seleccione]
$sqlIns = "UPDATE prefixoTabela_messages SET body='$new_value' WHERE ID='$id'";
Mas, acho que não deve ser isso. Alguém corrige?
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Código: [Seleccione]
<?php
set_time_limit
(900);

$dbHost 'localhost';
$dbUser 'xxx';
$dbPass 'xxx';
$dbName 'xxx';

$needle  ':p';
$new_path ':saltar:';

$con mysql_connect($dbHost$dbUser$dbPass) or die('Erro ao ligar &#224; bd');
$sel mysql_select_db($dbName) or die('Erro a seleccionar a bd');

$sql "SELECT body, ID_MSG, ID_TOPIC, ID_BOARD FROM smf_pt_messages";
$qry mysql_query($sql) or die('Erro linha 13:' mysql_error());

while(
$obj mysql_fetch_object($qry)){
unset($haystack$new_value$id$idt$idb);

$id $obj->ID_MSG;
$idt $obj->ID_TOPIC;
$idb $obj->ID_BOARD;
$haystack $obj->body;
$new_value preg_replace($needle$new_path$haystack);

$new_value mysql_real_escape_string($new_value);
$new_value $haystack;
$sqlIns "UPDATE smf_pt_messages SET body='$new_value' WHERE ID_BOARD='$idb' && ID_TOPIC='$idt' && ID_MSG='$id'";
$qryIns mysql_query($sqlIns) or die('Erro linha 28: ' mysql_error());
}
?>


Dá erro:
Citar
Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in /Users/nram/Sites/troca_palavras.php on line 25
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Espera um pouco. Tem a haver com o regex que utilizei (que não é regex nenhum, é uma string).

Já te dou o código certinho.
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Espera um pouco. Tem a haver com o regex que utilizei (que não é regex nenhum, é uma string).

Já te dou o código certinho.
Obrigadão, precisava mesmo disso! :)
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Então ai vai:

Citação de: exemplo.php
<?php
set_time_limit
(900);

$dbHost
	
	
=
	
'localhost';
$dbUser
	
	
=
	
'xxx';
$dbPass
	
	
=
	
'xxx';
$dbName
	
	
=
	
'xxx';

$info = Array(
	
':P' => ':saltar:',
	
':\)' => ':sorrir:',
	
':\(' => ':triste:'
);

$con mysql_connect($dbHost$dbUser$dbPass) or die('Erro linha 15:' mysql_error());
$sel mysql_select_db($dbName);

$sql "SELECT body, ID_MSG FROM smf_messages";
$qry mysql_query($sql) or die('Erro linha 19: ' mysql_error());

while(
$obj mysql_fetch_array($qry)){
	
unset(
$id$haystack);
	
$id $obj['ID_MSG'];
	
$haystack $obj['body'];
	

	
foreach(
$info as $needle => $replacement){
	
	
$needle "/" $needle "/";
	
	
$haystack preg_replace($needle$replacement$haystack);
	
}
	

	
$haystack mysql_real_escape_string($haystack);
	
$sqlUp "UPDATE smf_messages SET body='$haystack' WHERE ID_MSG='$id'";
	
$qryUp mysql_query($sqlUp) or die('Erro linha 33: ' mysql_error());
}
?>

Entretanto como me pareceste um tipo interessado e eu entusiasmei-me, acabei por desenvolver uma solução mais completa:

Ver aqui...

Parece grande, mas não é. Está é muito documentado. Se quiseres perde um pouco de tempo a ler que pelo que vi acima, para a próxima já te consegues safar sozinho.

Entretanto isto bonitinho seria estruturar isto no paradigma de orientação por objectos (leia-se "enfiar" isto numa classe). Se houver interesse (apenas para efeitos pedagógicos), diz que eu quando tiver um tempinho reestruturo novamente o código.

Tem atenção ao enfiares os valores de pesquisa na primeira matriz, há determinados caracteres que têm de levar escape ("\") senão vão dar erro. Tens lá dois exemplos ( :) e :( = :\) e :\( ) por causa dos parêntesis.
Offline

epsy 
Membro
Mensagens 553 Gostos 1
Feedback +1

Troféus totais: 25
Trófeus: (Ver todos)
Search Windows User Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1

Deves poder usar a função de SQL replace() directamente no phpmyadmin.
Penso que a sintaxe é esta:

Código: (sql) [Seleccione]
update tabela set campo=  replace (campo, "texto-existente", "texto-novo");
Atenção: antes de fazer coisas destas deve-se fazer backup da BD.

O 2º parâmetro da função (o texto existente) é "case sensitive".
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

@diogoosorio: ainda não testei mas deve ser mesmo isso que pretendo, obrigado por tudo!
@epsy: essa função substitui o texto todo, e não partes do texto, certo?
Offline

nram 
Membro
Mensagens 777 Gostos 0
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Estive a analisar o código por alto e acho que não está correcto. Porque está para WP, tem que ser uma Query como a que eu tenho, penso eu.