Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306

    Memorizzare in db testo di textarea

    Ciao a tutti ragazzi
    vorrei sapere il da farsi in ambito memorizzazione in db di testo immesso in una textarea, e la sua successiva lettura dal db.

    Poichè il tema è simile per tutti le tipologie di campi form (textarea,checkbox, radio, select) ho voluto creare nel mio database di prova (chiamato "db_prova") una tabella dal nome "campi".

    Questa tabella "campi" ha questi campi colonna : "id" (INT), "textarea", "checkbox", "radio", "select" (tutti e quattro VARCHAR).

    Non so se è la tabella piu' adatta per capire questo argomento, ma mi è sembrata quella piu' semplice per il momento.


    Ho creato una pagina html , dove c'è appunto la textarea ed un tasto che richiama l'applicazione "memorizzo-textarea.php".

    codice:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>vediamo come memorizzare textarea</title>
    </head>
    <body>
    <h3>voglio memorizzare textarea</h3>
    <form method="post" action ="memorizzo-textarea.php">
    
    
    Messaggio : <br> <textarea cols="50" rows="5" name = "messaggio"></textarea>
    <input type="submit" value ="invia dati">
    </form>
    </body>
    </html>



    "memorizzo-textarea.php", in questa applicazione viene utilizzata l'istruzione php htmlentities(stringa), per convertire i possibili caratteri > o < ( o altri) che possono essere immessi nella textarea, e che possono memorizzare cose strane nel db, che poi quando lo si va a leggere vengono male interpretati.
    codice:
    <?php
    
    
    require_once('configurazione_credenziali_esterno.php');
    $link = mysqli_connect(DB_HOST, DB_USERN, DB_PSW) or die("Errore connessione: ". mysqli_connect_error());
    
    $dbw = mysqli_select_db($link, DB_PROVA) or die("Errore apertura database: " . mysqli_error($link));
    
    $mess=htmlentities($_POST['messaggio']);
    
    
    $strsql = "INSERT INTO campi(textarea,checkbox,radio,select) VALUES ('$mess','-','-','-')";
    $rs = mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));
    if($rs){
        echo"Inserimento avvenuto con successo";
        echo"$mess";
    }
    
    
    ?>

    Poich� mi compariva questo errore " Errore query database: Field 'select' doesn't have a default value" ho dovuto immettere i trattini nella query anche per tutti gli altri campi della tabella, ma cmq non risolvo perch� mi compare un problema del genere

    Errore query database: Errore di sintassi nella query SQL vicino a 'select) VALUES ('scrivo questa cosa nella textarea','-','-','-')' linea 1



    Poi il programma "leggere-textarea.php"
    codice:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>vediamo come leggere textarea</title>
    </head>
    <body>
    <h3>voglio leggere textarea</h3>
    
    
    <?php
    
    
    require_once('configurazione_credenziali_esterno.php');
    $link = mysqli_connect(DB_HOST, DB_USERN, DB_PSW) or die("Errore connessione: ". mysqli_connect_error());
    $dbw = mysqli_select_db($link, DB_PROVA) or die("Errore apertura database: " . mysqli_error($link));
    
    
    $strsql = "SELECT textarea FROM campi";
    
    
    $rs = mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));
    
    
    
    
    ?>
    
    
    <p><?php echo htmlentities(textarea)?></p>
    
    
    </body>
    </html>

    Cosa posso fare? sembrava che andasse tutto bene logicamente...
    Ultima modifica di Alfoxx; 17-09-2016 a 17:08

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Come puoi immaginare il campo select si chiama come l'omonima keyword (SELECT ...). Quindi

    1 cambi il nome al campo
    2 oppure lo fai precedere dal nome della tabella: INSERT INTO campi (..., campi.select) VALUES(...)
    3 oppure metti il nome del campo tra backtick (gli apici inclinati): INSERT INTO campi (..., `select`) VALUES(...)

    Visto che usi mysql, usa i prepared statement, in questo modo ti fa in automatico l'escape. Ora come ora se nella textarea metti un apice la query risulterà errata.

    Per quanto riguarda il "recupero" dei dati devi usare le funzioni di fetch:

    Codice PHP:

    $strsql 
    "SELECT textarea FROM campi";

    $rs mysqli_query($link$strsql) or die("Errore query database: " mysqli_error($link));
    // La query prende tutte le tuple della tabella, quindi il while "scorre" tutte le righe trovate
    while ($row mysqli_fetch_assoc($rs)) {
       echo 
    $row['textarea'];


  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Grazie mille per avermi risposto

    Quote Originariamente inviata da boots Visualizza il messaggio
    Come puoi immaginare il campo select si chiama come l'omonima keyword (SELECT ...). Quindi

    1 cambi il nome al campo
    2 oppure lo fai precedere dal nome della tabella: INSERT INTO campi (..., campi.select) VALUES(...)
    3 oppure metti il nome del campo tra backtick (gli apici inclinati): INSERT INTO campi (..., `select`) VALUES(...)

    Visto che usi mysql, usa i prepared statement, in questo modo ti fa in automatico l'escape. Ora come ora se nella textarea metti un apice la query risulterà errata.

    Per quanto riguarda il "recupero" dei dati devi usare le funzioni di fetch:

    Codice PHP:

    $strsql 
    "SELECT textarea FROM campi";

    $rs mysqli_query($link$strsql) or die("Errore query database: " mysqli_error($link));
    // La query prende tutte le tuple della tabella, quindi il while "scorre" tutte le righe trovate
    while ($row mysqli_fetch_assoc($rs)) {
       echo 
    $row['textarea'];

    Non ci ho pensato minimamente a questo fatto della coincidenza dei nomi. Cambierò il nome del campo tabella.


    cosa sono i prepared statement? l'escape?? non ne ho mai sentiti nominare.
    Ultima modifica di Alfoxx; 17-09-2016 a 19:38

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Quando esegui mysqli_query non fai altro che inviare una stringa al dbms con il comando sql. Dato che parte di questa (potrebbe) dipendere da input inseriti dal utente, devi stare attento che non vi siano caratteri che "cambino" la query.
    Prendi ad esempio:

    Codice PHP:
    $name $_POST['name'];
    $query "DELETE FROM utenti WHERE name='$name'"
    Valutata la stringa invieresti al database, ad esempio

    Codice PHP:
    "DELETE FROM utenti WHERE name='boots'"
    Che è corretta. Ma se un utente scrivesse:
    Codice PHP:
    $name "bo'ots";
    // La query diventerebbe
    DELETE FROM utenti WHERE name='bo'ots
    in pratica l'apice in $name andrebbe a chiudere quello della query, mandandola in errore. Peggio ancora, ti esponi ad attacchi di sql injection.
    Pensa se un utente scrivesse:
    Codice PHP:
    $name "bo' OR 'a'='a";
    // La query diventerebbe
    DELETE FROM utenti WHERE name='bo' OR 'a'='a' 
    Questa query cancellerebbe TUTTI i record della tabella.

    Per questo è bene fare l'escape (cioè eliminare il significato dei caratteri speciali usati dal linguaggio, l'apice appunto)
    Codice PHP:
    $name mysqli_real_escape_string($link$_POST['name']); 
    Con i prepared statement, non ti devi preoccupare di questo. Ci pensa mysqli a creare la query in modo sicuro

    http://php.net/manual/en/mysqli.prepare.php
    Ultima modifica di boots; 18-09-2016 a 11:24

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Grazie boots
    ho capito cosa volevi dirmi fino alle penultime righe, il collegamento che mi hai dato non lo capisco, sarà il manuale...però...

    ci sono dei comandi che permettono di non pensare a dover "disinnescare" i caratteri speciali ?

    Quest'istruzione
    Codice PHP:
    $name mysqli_real_escape_string($link$_POST['name']); 

    mi stai dicendo che fa queste tre righe di codice?

    Codice PHP:
    $mess=htmlentities($_POST['messaggio']);
    $strsql "INSERT INTO campi(textarea,checkbox,radio,select) VALUES ('$mess','-','-','-')";
    $rs mysqli_query($link$strsql) or die("Errore query database: " mysqli_error($link)); 

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Nel senso che puoi fare così;

    Codice PHP:
    $mess=mysqli_real_escape_string($link,htmlentities($_POST['messaggio']));
    $strsql "INSERT INTO campi(textarea,checkbox,radio,select) VALUES ('$mess','-','-','-')";
    mysqli_query($link$strsql) or die("Errore query database: " mysqli_error($link)); 
    oppure, con i prepared statement

    Codice PHP:
    $mess=htmlentities($_POST['messaggio']));
    $stmt mysqli_prepare($link"INSERT INTO campi(textarea,checkbox,radio,select) VALUES (?,'-','-','-')");
    mysqli_stmt_bind_param($stmt"s"$mess); // la s sta per string
    mysqli_stmt_execute($stmt); // esegue la query

    // Con più parametri sarebbe

    $mess=htmlentities($_POST['messaggio']));
    $stmt mysqli_prepare($link"INSERT INTO campi(textarea,checkbox,radio,select) VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt"ssss"$mess$checkbox$radio$select); 
    // la s sta per string. In questo caso tutti i paramentri sono string
    mysqli_stmt_execute($stmt); // esegue la query 
    Ultima modifica di boots; 18-09-2016 a 12:21

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Ho seguito i tuoi consigli ed sono riuscito a memorizzare nel db il campo textarea ed a leggerlo con questo programma



    codice:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>vediamo come leggere textarea</title>
    </head>
    <body>
    <h3>voglio leggere textarea</h3>
    
    
    <?php
    
    
    require_once('configurazione_credenziali_esterno.php');
    $link = mysqli_connect(DB_HOST, DB_USERN, DB_PSW) or die("Errore connessione: ". mysqli_connect_error());
    $dbw = mysqli_select_db($link, DB_PROVA) or die("Errore apertura database: " . mysqli_error($link));
    
    
    $strsql = "SELECT textarea FROM campi";
    
    
    $rs = mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));
    while ($riga = mysqli_fetch_array($rs)) {
    	//echo"<br>";
    	//echo $riga['textarea'];
    	$testo=$riga['textarea'];
    
    
    	?>	
    	
    	<p>Messaggi messi nel db: "<?php echo $testo?>"</p>
    
    
    
    
    <?php
    }//per chiudere il ciclo while
    ?>
    </body>
    </html>

    Ho leggermente modificato quello che hai scritto nel primo intervento, poichè volevo rendere indipendente ciò che la connessione al db trova, e la pagina html. Mi spiego:

    Penso, però, di non essere riuscito a rendere indipendente tutti i vari messaggi, infatti dipendono ancora dal ciclo while. Se volessi mettere il primo messaggio del db in un parte dalla pagina ed il terzo messaggio in una altra, cosa potrei fare?
    Ultima modifica di Alfoxx; 18-09-2016 a 12:29

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Quote Originariamente inviata da boots Visualizza il messaggio
    Nel senso che puoi fare così;

    Codice PHP:
    $mess=mysqli_real_escape_string($link,htmlentities($_POST['messaggio']));
    $strsql "INSERT INTO campi(textarea,checkbox,radio,select) VALUES ('$mess','-','-','-')";
    mysqli_query($link$strsql) or die("Errore query database: " mysqli_error($link)); 
    oppure, con i prepared statement

    Codice PHP:
    $mess=htmlentities($_POST['messaggio']));
    $stmt mysqli_prepare($link"INSERT INTO campi(textarea,checkbox,radio,select) VALUES (?,'-','-','-')");
    mysqli_stmt_bind_param($stmt"s"$mess); // la s sta per string
    mysqli_stmt_execute($stmt); // esegue la query

    // Con più parametri sarebbe

    $mess=htmlentities($_POST['messaggio']));
    $stmt mysqli_prepare($link"INSERT INTO campi(textarea,checkbox,radio,select) VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt"ssss"$mess$checkbox$radio$select); 
    // la s sta per string. In questo caso tutti i paramentri sono string
    mysqli_stmt_execute($stmt); // esegue la query 
    con il mio grado di preparazione non riesco ad apprezzare il vantaggio di scrivere più righe

    EDIT::::

    EDIT:::::
    come hai detto tu, senza modifiche del codice, se inserisco nel textarea dei simboli particolari mi da errore
    Ultima modifica di Alfoxx; 18-09-2016 a 12:34

  9. #9
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Penso, però, di non essere riuscito a rendere indipendente tutti i vari messaggi, infatti dipendono ancora dal ciclo while. Se volessi mettere il primo messaggio del db in un parte dalla pagina ed il terzo messaggio in una altra, cosa potrei fare?
    In questo caso io farei così:

    Codice PHP:
    <?php
      
    ....
      
    $data = array();
      while (
    $riga mysqli_fetch_array($rs)) {
        
    $data[]=$riga['textarea'];
      }
    ?>
    ....
    <p><?php echo $data[0?></p>
    .... da qualche altra parte
    <p><?php echo $data[2?></p>

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Codice PHP:
    $mess=mysqli_real_escape_string($link,htmlentities($_POST['messaggio'])); 
    Mi sto concentrando ora su questa riga.

    Ho fatto una piccola ricerca ed ho trovato questo
    http://forum.html.it/forum/showthrea...ostid=10166292

    mysqli_real_escape_string()

    riceve come parametro $link cioè l'identificativo di connessione al DB, e la stringa a cui serve l'escape.

    se serve l'escape a che serve mettere anche l'istruzione htmlentities
    Codice PHP:
    htmlentities($_POST['messaggio']) 
    ibastava solo
    Codice PHP:
    $_POST['messaggio' 
    ]

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.