← SMF

Alterar palavras

Lida 6726 vezes

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

Funciona assim: supõe que tens uma tabela que se chama artigos.
Nessa tabela tens, entre outros, um campo com o nome texto. Esse campo guarda textos variados. Supõe que nesses textos existe a expressão "Casa Azul", repetidas vezes e queres substituí-la pela expressão "Casa Verde".
Fazes assim:
Código: (sql) [Seleccione]
UPDATE  artigos SET texto=  REPLACE (texto, "Casa Azul", "Casa Verde");
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

ahahahah... excelente:

Citar
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 6063 bytes) in /xxxxx/troca_palavras.php on line 92

Hummm, isto em debug. suponho que mesmo que não esteja em debug faça igual!
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

Adaptei o código para BD maiores:
Código: (php) [Seleccione]

<?php
/**
 * @author Diogo Os&#243;rio
 * @url http://forum.maistrafego.pt/index.php?topic=24257.0
 * @license GPL2
 */
 
// Aumentar o tempo de execu&#231;&#227;o do script - se a bd for muito grande
// poderia levar que o script terminasse abruptamente
set_time_limit(900);
 
// Info de liga&#231;&#227;o &#224; BD
$dbHost 'localhost';
$dbUser 'xx';
$dbPass 'xx';
$dbName 'xx';
 
$prefix     'smf_pt_';
// Se o modo de depura&#231;&#227;o estiver ligado (TRUE), nenhuma
// altera&#231;&#227;o &#233; feita &#224; BD - s&#243; s&#227;o mostradas as eventuais
// altera&#231;&#245;es que seriam feitas. Para proceder &#224;s altera&#231;&#245;es,
// modificar esta op&#231;&#227;o para FALSE
$debug          =       FALSE;
 
// Insere aqui as diferentes altera&#231;&#245;es que queres fazer,
// no formato em que foram apresentados os exemplos.
// Tem aten&#231;&#227;o que caracteres especiais tem de levar escape "\" (o caso
// dos parenteses, por exemplo)
$info = Array(
        
' :P '  => ' :saltar: ',
        
' :\) ' => ' :sorrir: ',
        
' :\( ' => ' :triste: '
);
 
 
// Se estiver em modo de depura&#231;&#227;o, vamos testar os regex
if($debug){
        
// Uma string qualquer e uma matriz vazia para armazenar os erros
        
$string 'abcdefg';
        
$errors = Array();
       
        
// Iterar pela matriz $info para realizar o teste
        
foreach($info as $needle => $replacement){
                
$needle "/" $needle "/";
                @
$test preg_replace($needle$replacement$string);
               
                
// Se o preg_replace falhar (retorna NULL), vamos armazenar o
                // regex na array $errors
                
if(!$test)
                        
array_push($errors$needle);
        }
}


// Se a matriz $errors tiver mais que 0 entradas, ent&#227;o houve um erro
// Vamos abortar!
if(count($errors) > 0){
        echo 
'V&#227;o existir erros no replace: <ul>';
        foreach(
$errors as $error => $message){
                echo 
'<li>' $message '</li>';
        }
        echo 
'</ul><p>O script parou de ser executado. Corrija os erros e volte a testar';
        exit();
}
// Se houver um erro, o script p&#225;ra a execu&#231;&#227;o em cima, portanto tudo abaixo daqui
// n&#227;o ser&#225; executado
 
 
// Ligar &#224; bd
$con mysql_connect($dbHost$dbUser$dbPass) or die('Erro linha 15:' mysql_error());
$sel mysql_select_db($dbName);
 
$sql "SELECT body, ID_MSG, ID_TOPIC, ID_BOARD FROM smf_pt_messages";
$qry mysql_query($sql) or die('Erro linha 74: ' mysql_error());
 
$table $prefix."messages";

if(
$debug){
        echo 
'<p>As seguintes altera&#231;&#245;es seriam realizadas (nenhuma opera&#231;&#227;o foi na verdade executada):</p>';
        echo 
'<table border="1"><tr><td>ID_BOARD</td><tr><td>ID_TOPIC</td><tr><td>ID_MSG</td><td>Post Original</td><td>Post Modificado</td></tr>';
}

while(
$obj mysql_fetch_array($qry)){
        unset(
$id$haystack);
        
$id $obj['ID_MSG'];
        
$haystack $obj['body'];
        
$idt =$obj['ID_TOPIC'];
        
$idb =$obj['ID_BOARD'];
        
        if(
$debug){
        echo '<tr>';
        echo '<td>' $idb '</td>';
        echo '<td>' $idt '</td>';
        echo '<td>' $id '</td>';
        echo '<td>' $haystack '</td>';
        }
        foreach(
$info as $needle => $replacement){
                
$needle "/" $needle "/";
                
$haystack preg_replace($needle$replacement$haystack);
        }
        
        
//Isto porque quando um t&#243;pico termina em "/" ele d&#225; erro no SET, certamente h&#225; outro m&#233;todo mais eficaz
        
$haystack $haystack." ";
        if(
$debug){
        echo '<td>' $haystack '</td>';
        echo '</tr>'
        }else{
        

        
$sqlUp "UPDATE $table SET body='$haystack' WHERE ID_BOARD='$idb' AND ID_TOPIC='$idt' AND ID_MSG='$id'";
       
$qryUp mysql_query($sqlUp) or die('Erro linha 110: ' mysql_error());
        }
        
}
echo 
'<p>Tudo correu bem</p>';
?>


Uma forma pouco eficiente, mas que resolve o meu problema para a memória não estourar.
No entanto, para quem tem uma BD enorme, que retire a parte do debug toda, se não vai passar horas aí a testar!

Só mais uma coisa, como posso resolver o problema que tenho sobre a barra? eu acrescentei um espaço no final do post, mas isso é cheats. À maneira mais eficaz?

Obrigado por tudo! :)