• User Attivo

    SQL - Da [spoiler:abcdefgh] a [spoiler]

    Ciao, ancora un altro problema con impex.. 😞

    Tutti i tag spoiler che avevo ora mi compaiono in questo modo: [spoiler:abcdefgh]

    Il problema è che in ogni post "abcdefgh" sono caratteri differenti, e possono essere lettere o numeri. L'assistenza vbulletin mi ha detto che dovrebbe esserci un modo per risolvere, tramite una query sql, però non riesco a capire come fare.. In pratica la parte variabile, due punti inclusi, deve scomparire. Come si può configurare una cosa del genere?

    So che la query è:

    *UPDATE post SET pagetext = replace(pagetext, ?text you want to replace?, ?replacament text?);*
    

    Ma come gestisco la parte variabile? L'unica cosa su cui penso di poter giocare è che si tratta sempre di 8 caratteri.


  • User

    Ciao
    Hai provato in questo modo?

    
    
    *UPDATE post SET pagetext = replace(pagetext, ‘[spoiler %]’, ‘[spoiler]’);*
    
    

    Praticamente, se non ho capito male, vuoi che quando nel db c'è [spoiler:abcdefgh] venga sostituito con [spoiler] e basta?
    Fammi sapere.
    Alfonso


  • User Attivo

    Confermo. C'è anche qualche tag tipo [center:12bvbn12] che voglio convertire in [center], ma fatto uno l'altro dovrebbe esser praticamente identico. Il problema è che di mysql ne so veramente poco... 😞
    Il tuo codice da quest'errore: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[center%]’, ‘[center]’)' at line 1
    Mettendo gli apici "normali" prima e dopo le quadre invece modifica 0 righe.


  • User

    Dunque, io non sono molto esperto di funzioni sql, preferisco (generalmente) elaborare i dati con PHP. Io farei in questo modo:

    [PHP]
    /*
    Qui fai la connessione al tuo database, fai la query e ottieni i vari risultati.
    Quindi...
    */
    $query="SELECT....";
    $res = mysql_query($query);
    while($ris = mysql_fetch_array($res, MYSQL_ASSOC)) {
    $variabile = $ris['pagetext'];
    while(true) {
    $stringa = findRep($variabile);
    $res = findRep($stringa);
    if($stringa==$res) break;
    $variabile=$res;
    }
    // In $stringa hai il tuo testo con sostituito gli [spoiler:balbalaba] in [spoiler].
    //Adesso fai una query di update in modo da aggiornare il valore
    }

    function findRep($string) {
    for($i=0; $i<strlen($string); $i++) {
    $cmp = substr($string, $i, 9);
    $str2 = substr($string, $i, $i+9);
    if($cmp=="[spoiler:") {
    $string = substr($string, 0, $i)."[spoiler]".substr($string,$i+18);
    }
    }
    return $string;

    [/PHP]

    Sostituendo nella funzione findRep [spoiler: con center: modifichi anche per altri.
    Fammi sapere se va bene 😉
    Alfonso


  • User Attivo

    Ciao the_best,

    dovresti utilizzare il comando REPLACE, come hai ben pensato, ma usando una Regular Expression che, se non hai un dedicato o un VPS su cui montare pacchetti UDF o magari i permessi per creare Procedure personalizzate, non puoi utilizzare.
    Se sei su un hosting economico con pochi permessi e poca possibilità di personalizzazione, ti conviene seguire il consiglio di icefoxsoftware, tenendo in considerazione che se vuoi modificare il contenuto del DB, ti basta eseguire una query di UPDATE per ogni valore TRUE restituito dalla sua funzione findRep().