• User

    php limitare lunghezza del testo in tabella Mysql

    ciao a tutti
    il mio problema è quello di limitare una descrizione in una tabella Mysql.
    Ho provato lo script in un testo normale fuori tabella e funziona regolarmente ma non riesco ad ottenere lo stesso risultato in un campo della tabella Mysql.
    Compare soltanto un trattino verde. Vorrei anche intervenire sulla dimensione del carattere.
    Allego una parte della pagina.
    [/HR]
    <table class="righealterne">
    <thead><tr>
    <th>rif</th>
    <th>foto</th>
    <th>comune / zona</th>
    <th>descrizione</th>
    <th>mq</th>
    <th>prezzo/canone</th>
    <th>dettaglio</th>
    </tr></thead>
    <?php
    include("config.inc.php");
    // parametri del database
    $db = mysql_connect ($db_host, $db_user, $db_pass);
    if($db = FALSE) die ("errore nella connessione");
    mysql_select_db ($db_name)or die("errore nella selezione del database");

    $query = "SELECT * FROM $db_tab WHERE vetrina='si' AND uso='co' ORDER BY rif DESC" ;
    $result = mysql_query ($query) or die("nessun immobile con questi requisiti");

    $numero_caratteri = 10;
    $stringa_in_input = '$row[des_scheda]';
    if(strlen(trim($stringa_in_input))>$numero_caratteri)
    {
    $testo = substr($stringa_in_input,0,strpos($stringa_in_input,' ',$numero_caratteri)).'...';
    }
    else
    {
    $testo = $stringa_in_input;
    }
    $testo='$row[des_scheda]';

    //conto il numero di occorrenze trovate nel db
    $numrows = mysql_num_rows($result);

    //se il database e' vuoto lo stampo a video
    if ($numrows==0){
    print"<b><font size=2>
    <P><FONT SIZE=2><B>Al momento non abbiamo immobili con questi
    requisiti.<BR>Contattateci per avere notizie su eventuali
    acquisizioni non ancora pubblicate.</B></FONT></P>
    </font></b><br><br>
    <br><br>";
    }

    //Se invece trovo delle occorrenze...
    else
    {
    while ($row = mysql_fetch_array ($result))
    {echo "<tr><td>$row[rif]</td>";
    echo '<td align="center"><a href="scheda_dettaglio.php?rif='.$row['rif'].'" target=_blank alt="scheda"><img src="icona.php?rif='.$row['rif'].'"alt="scheda"></a></td>';
    echo "<td>$row[comune]</td>";
    echo "<td >$row[des_tabella]<br/>";
    $testo = '$row[des_scheda]';

    echo "<span id='prova'>$testo</span></td>";

    echo "<td style="width: 50px" align="center">$row[mq]</td>";
    echo '<td>'.number_format($row['prezzo'],0,',','.').'</td>';
    echo '<td><a href="scheda_dettaglio.php?rif='.$row['rif'].'" target=_blank>scheda</a></td></tr>';
    }
    }
    mysql_free_result ($result);
    ?>
    </table>

    [/HR]
    Qualche anima buona mi può aiutare? Grazie


  • User

    se mi spieghi meglio l'effetto che vuoi ti pox aiutare 🙂


  • User

    in pratica vorrei che la voce del campo "des_scheda" della tabella apparisse soltanto per i primi 10 caratteri seguiti dai 3 punti, dato che il testo intero è molto più lungo.
    grazie ciao


  • User

    Dopo innumerevoli tentativi ho risolto il problema spostando lo script all'interno della tabella, se può essere utile a qualcuno inserisco un tratto di codice;

    [PHP]...
    while ($row = mysql_fetch_array ($result))
    {
    echo "<tr><td>$row[rif]</td>";

    $numero_caratteri = 35;
    $stringa_in_input = $row['des_scheda'];
    if(strlen(trim($stringa_in_input))>$numero_caratteri)
    {
    $testo = substr($stringa_in_input,0,strpos($stringa_in_input,' ',$numero_caratteri)).'...';
    }
    else
    {
    $testo = $stringa_in_input;
    }
    echo "<span id='p1'>$testo</span></td>";
    echo "<td style="width: 50px" align="center">$row[mq]</td>";
    echo '<td>'.number_format($row['prezzo'],0,',','.').'</td>';
    echo '<td><a href="scheda_dettaglio.php?rif='.$row['rif'].'" target=_blank>scheda</a></td></tr>';
    }
    }
    mysql_free_result ($result);
    ?>
    </table>[/PHP]

    Saluti a tutti


  • User Attivo

    Ciao eisenblu,
    ho visto il codice del post #4 ed ho notato che prende un numero di caratteri eccedenti la quantità prefissata.
    Ho fatto una veloce modifica per cercare di approssimarlo per difetto, ma l'unica precondizione è che sia presente almeno uno spazio all'interno del troncone di stringa della massima lunghezza prefissata altrimenti troverai soltanto i puntini di sospensione.

    [PHP]$numero_caratteri = 35;
    $stringa_in_input = $row['des_scheda'];
    if(strlen(trim($stringa_in_input))>$numero_caratteri)
    {
    $aux = substr($stringa_in_input, 0, $numero_caratteri);
    $testo = substr($stringa_in_input, 0, strrpos($aux,' ')) . '...';
    unset ($aux);
    }
    else
    {
    $testo = $stringa_in_input;
    }[/PHP]

    Spero che ti possa essere utile.


  • User

    ciao MenteLibera, ho impostato il mio limite a 75 caratteri e pare che nel mio sito funzioni regolarmente. La variazione del numero di caratteri rispetto al numero impostato penso dipenda dal fatto che lo script non deve interrompere le parole. In ogni caso testerò anche il tuo suggerimento.
    Comunque grazie, ancora una volta questo forum si conferma il migliore della categoria.
    ciao


  • User Attivo

    Ciao eisenblu,
    a mio avviso la tua nuova versione potrebbe continuare a riportare una dimensione maggiore di quella impostata; ciò capita per esempio quando la lunghezza di $row['des_scheda'] è maggiore di $numero_caratteri ed ha uno spazio dopo quest'ultimo valore.
    Il mio cerca di non superare $numero_caratteri. Si potrebbe verificare un piccolo bug in questo scenario:
    $numero_caratteri = 35; la stringa $row['des_scheda'] ha uno spazio in posizione 33 (o comunque entro $numero_caratteri), la mia procedura prende fino a quel punto e poi aggiunge i 3 byte associati ai puntini di sospensione, quindi la somma complessiva supera il valore di $numero_caratteri. Questa criticità si potrebbe ripetere traslando tutti i precedenti parametri in più o in meno.
    Penso che sia un caso raro ma potrebbe comunque capitare, per superarlo potrai per esempio impostare $numero_caratteri = 32 (o poco meno) in maniera tale che la stringa con i puntini di sospensione diventi complessivamente di lunghezza 35 (= 32 + 3).
    Con la tua versione senza opportuni aggiustamenti la vedo un po' più critica.

    Ciao.


  • User

    Ciao MenteLibera, sto sperimentando la tua versione ma il risultato è che per qualsiasi valore di $numero_caratteri il testo si ferma alla prima parola, non mi sembra di aver modificato niente rispetto al tuo script.
    Ciao


  • User Attivo

    Ciao eisenblu, ecco i codici che ho utilizzato al termine del debug. Prova a mettere in file vuoti i seguenti codici:

    La tua versione:

    [PHP]<?php
    $numero_caratteri = 35;
    $stringa_in_input = "questo si tratta di un testo abbastanza lungo, ma privo di caratteri accentati che possono far saltare l'editor in maniera scandalosa";
    if(strlen(trim($stringa_in_input))>$numero_caratteri)
    {
    $testo = substr($stringa_in_input,0,strpos($stringa_in_input,' ',$numero_caratteri)).'...';
    }
    else
    {
    $testo = $stringa_in_input;
    }
    echo "$testo<br>\nLunghezza della stringa: ".strlen($testo);
    ?>[/PHP]

    la mia versione:

    [PHP]<?php
    $numero_caratteri = 35;
    $stringa_in_input = "questo si tratta di un testo abbastanza lungo, ma privo di caratteri accentati che possono far saltare l'editor in maniera scandalosa";
    if(strlen(trim($stringa_in_input))>$numero_caratteri)
    {
    $aux = substr($stringa_in_input, 0, $numero_caratteri);
    $testo = substr($stringa_in_input, 0, strrpos($aux,' ')) . '...';
    unset ($aux);
    }
    else
    {
    $testo = $stringa_in_input;
    }
    echo "$testo<br>\nLunghezza della stringa: ".strlen($testo);
    ?>[/PHP]

    Nel tuo caso vedo che c'è in più la stringa " abbastanza". Ti torna?


  • User

    Esattamente!