Visualizzazione risultati 1 fino 5 di 5

Discussione: Visualizzare testo preso da database con indentazione

  1. #1
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito Visualizzare testo preso da database con indentazione

    Salve,

    E' da giorni che sto cercando una soluzione online, ma niente. Avendo il seguente codice:
    Codice PHP:
    <?php
    $conn
    = new mysqli("localhost", "sevenjeak", "", "my_sevenjeak");

    if (isset(
    $_GET["send"])) {
    if (!empty(
    $_POST["text"])) {
    $txt = htmlspecialchars($_POST["text"]);
    $conn->query("UPDATE t1 SET p1 = '$txt' WHERE id = 1");
    }
    }
    ?>
    <h3>Current text</h3>
    <?php
    $query
    = $conn->query("SELECT * FROM t1 WHERE id = 1");
    $rs = $query->fetch_array(MYSQLI_ASSOC);
    echo
    nl2br($rs["p1"]);
    ?>
    <h3>Edit text</h3>
    <form action="test.php?send" method="post">
    <textarea name="text"><?=$rs["p1"] ?></textarea>
    <br />
    <input type="submit" />
    </form>
    <?php
    $conn
    ->close();
    ?>
    Che come potete notale ha una textarea il qui valore, una volta premuto il submit, viene salvato all'interno di una tabella e visualizzato tramite la funzione nl2br() e all'interno della textarea stessa.

    Fin qui tutto ok, il problema si verifica quando, all'interno della textarea inserisco del testo tipo:
    Codice:
    <div>
       prova
    </div>
    Con la tabulazione ( tre spazi ) all'inizio della seconda riga.

    Premendo il pulsante submit è salvando nella tabella, me lo salva correttamente, l'unico problema è chè: l'istruzione echo nl2br($rs["p1"]); mi ritorna il testo cosi:
    Codice:
    <div>
    prova
    </div>
    Senza i tre spazi all'inizio della seconda riga, cosa che mi mette nel testo stampato all'interno della textarea.

    La mia domandà è questa, come faccio a stampare, la stringa con i tre spazi all'inizio della seconda riga?
    Ultima modifica di sevenjeak : 19-01-2023 alle ore 19.20.02

    Sevenjeak
    Software developer and much more

  2. #2
    L'avatar di dreadnaut
    dreadnaut è connesso ora Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,265

    Predefinito

    In HTML una sequenza di spazi conta come uno spazio singolo. Se vuoi modificare questo comportamento ci sono due modi:

    - mettere il contenuto dentro ad un tag <pre>, che sta per preformattato
    - applicare lo stesso effetto di <pre> ad un altro tag, via CSS; a quel punto nl2br diventa superfluo e va tolto

    Esempio del secondo caso:
    Codice PHP:
    <div style="white-space: pre;">
    <?= $rs['p1'] ?>
    </div>

    Un paio di commenti a parte:
    - OK che questo è un esempio, ma occhio ad infilare stringhe potenzialmente maligne dentro ad una query
    - htmlspecialchars serve per sanificare l'output, non i dati che vanno nel database; salva l'originale proteggendoti con una funzione di escape, ed usa htmlspecialchars quando li inserisci nella pagina — ti salva un sacco di problemi

    Codice PHP:
    <?php
    # ...
    $txt = mysqli_escape_string($_POST["text"]);
    $conn->query("UPDATE t1 SET p1 = '$txt' WHERE id = 1");
    # ...
    ?>

    <div style="white-space: pre">
    <?= htmlspecialchars($rs['p1']) ?>
    </div>
    Ed infine ?> alla fine dello script non è necessario, e può creare problemi. Meglio evitarlo.

  3. #3
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Inoltre imposta esplicitamente il parametro $encoding di htmlspecialchars, come anche mysqli::set_charset (discorso complesso per compatibilità di cosa sia alias UTF8 in Mysql 8 o precedente, inoltre non è importante solo la connessione del cliente php ma anche la COLLATION).
    Al più se ti occorre markup HTML via php utilizza per il debug
    Codice PHP:
    var_dump(urlencode($var)); // Da php >= 7.2 non utilizza EBCDIC
    però i tag HTML hanno comunque le loro limitazioni. Una come menzionato da @dreadnaut mentre il resto è per tag HTML.
    Codice PHP:
    <?php
    /*
    8.1.0 flags changed from ENT_COMPAT to ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.
    */
    $string = "\xE1" ; //á ISO-8859-1
    $string = urldecode(urlencode($string)); // Simulazione cliente invio dati con codifica percentuale e la conversione
    $value = htmlspecialchars(
    $string,
    ENT_QUOTES | ENT_HTML401,
    'UTF-8'); // php >= 5.4
    // $double_encode https://bugs.php.net/bug.php?id=80928 &apos; non riconosciuto con ENT_HTML401
    if($value) {
    var_dump($value);
    } else {
    echo
    'my bad user';
    }
    Quando chiami la variabile super globale $_POST potrebbe anche non effettuare automaticamente la conversione della codifica percentuale a seconda se è codice legacy e com'è impostato php.
    Ultima modifica di darbula : 20-01-2023 alle ore 15.29.20

  4. #4
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Ok, risolto, grazie a tutte e due per la risposta.

  5. #5
    L'avatar di dreadnaut
    dreadnaut è connesso ora Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,265

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Inoltre imposta esplicitamente il parametro $encoding di htmlspecialchars

    [...]

    Codice PHP:
    <?php
    $value
    = htmlspecialchars(
    $string,
    ENT_QUOTES | ENT_HTML401,
    'UTF-8'); // php >= 5.4
    A mio parere questo non migliora la situazione, suggerisco di lasciar fare ai valori default:

    - l'encoding sarà quello del sistema, su AlterVista ed il 99% dei server UTF-8
    - i flags saranno ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

    Sopra hai rimosso ENT_SUBSTITUTE, che è importante. Quando è presente, la funzione sostituisce i rari caratteri problematici con un segnaposto facile da identificare. Senza di esso, la funzione si blocca e restituisce una stringa vuota — una cosa utile solo in situazioni molto specifiche.
    Ultima modifica di dreadnaut : 20-01-2023 alle ore 21.22.12

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •