Categorie
Computer Internet Linux

Di come un bug in uno script PHP possa mettere in ginocchio un sito

Il sito in questione è il mio, tuttoeniente.net, che ha un sistema creato da me per visualizzare le ultime notizie in ogni pagina. Per ovvie ragioni di spazio non posso visualizzare la notizia completa, quindi la tronco a 70 caratteri.

Tagliare brutalmente porterebbe ad avere 9 volte su 10 parole a metà, quindi avevo scritto uno stupidissimo script che taglia allo spazio successivo. Eccolo:

function ultime_news($notizie = 2, $forumid = 10, $cut = 70){
    $news = '';
    $q_news = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT $notizie");
    while($notizia = mysql_fetch_array($q_news)){
       $lenght = strlen($notizia['testo']);
       if($lenght > $cut){
            while(substr($notizia['testo'], $cut, 1) != ' '){
                $cut++;
            }
            $testo = substr($notizia['testo'], 0, $cut).' [...]';
        }else{
            $testo = substr($notizia['testo'], 0, $cut);
        }
        $data = strftime("%d/%m/%Y", $notizia['data']);
        $news .= "<p><a href=\"/news/$notizia[id]-".encode_for_url($notizia['titolo']).
                 ".html\"><span class=\"news-title\">$notizia[titolo]</span></a> ".
                 "<span class=\"news-date\">($data)</span><br />".
                 "<span class=\"news-text\">$testo</span></p>";
    }
    return $news;
}

Tutto bene, se non fosse che l’ultima notizia che ho inserito è “Si aggiungono nuove barzellette alla nostra collezione, corri a leggerle!”, 74 caratteri. A 70 caratteri siamo giusto a metà della parola “leggerle”, quindi avanziamo alla ricerca di uno spazio. Lettera, lettera, lettera, punto esclamativo. Fine. Nessuno spazio. Risultato? Loop infinito e sito KO. Peccato che quando ho inserito la notizia non ci ho fatto caso, e oggi ho dovuto smadonnare non poco prima di trovare la ragione del sito fuori uso…
La solulzione? Una banalissima limitazione dello spostamento del taglio fino alla lunghezza totale della notizia.
In pratica while(substr($notizia['testo'], $cut, 1) != ' '){ diventa while(substr($notizia['testo'], $cut, 1) != ' ' && $cut <= $lenght){