Newsgroup: it.comp.www.php
Titolo: PDO e virgolette

Salve a tutti,
ho un problema con PDO.
 
Praticamente le virgolette " inserite in un stringa, che dovrebbe essere 
memorizzata nel db, spezzano la stringa stessa.
 
I dati sono passati in questo modo:
 
$data = array(
'nome' => $nome,
'cognome' => $cognome,
'nickname' => $nickname
 
);
$query = 'UPDATE user
SET
firstname = :nome,
familyname = :cognome,
WHERE nickname= :nickname';
$sth = $this->pdo->prepare($query);
$sth->execute($data);
 
Ho letto in giro, qualcuno suggerisce QUOTE ma il manuale lo sconsiglia 
a favore di PREPARE.
 
Il charset è definito tra i parametri di connessione come:
define('CHARSET', 'utf8');
 
Ho anche provato a modificarlo in utf8mb4 ma il risultato non cambia.
 
Come posso risolvere?
Grazie in anticipo


 
A me sembra a posto: hai stringhe "spezzate" nel DB? Hai controllato prima della
query (nell'array) e dopo (nella tabella) se è tutto come ti aspetti?
 
Ciao!
 

Ciao,
guarda stavo per scrivere che in effetti la soluzione è in lettura e non 
in scrittura.
Mi sono accorto che la stringa è memorizzata bene ma in lettura non era 
trattata.
 
Ora ho risolto mettendo un htmlspecialchars($datoRisultanteDallaSelect);
 
Domanda: trami PDO, c'è un modo per trattare i dati letti direttamente 
dall'oggetto di PDO? (ora come ora applico htmlspecialchars ai dati 
mentre li stampo a video, volevo sapere se potevo "pulirli" direttamente 
da qualche metodo PDO in fase di select).
 
Grazie cmq per la risposta.


 
 
Non mi pare, anche perché non è il lavoro di PDO :) Puoi fare varie altre cose
che magari ti "puliscono" un po' il codice, tipo la fetch in una classe (e poi
usare dei metodi appositi della classe stessa) o magari una semplice array_map.
 
Io personalmente non faccio nulla: nelle View, se ho bisogno di stampare una
stringa, scrivo esplicitamente htmlspecialchars (e/o simili) perché lo trovo
più chiaro da leggere. YMMV.
 
Ciao!

 define('CHARSET', 'utf8');
 
Questo definisce una costante generica, non passa parametri al DB.
 
Sei sicuro che poi questa costante venga usata?
 
Bye.
 
 

Hai ragione, ho messo la definizione della variabile ma per la fretta ho 
dimenticato il resto la funzione di connessione....
 
Questo è il codice completo che credo sia corretto.
 
define('HOST', $db_host); // Database host name eg. localhost
define('USER', $db_user); // Database user. eg. root ( if your on local 
server)
define('PASSWORD', $db_password); // Database user password  (if 
password is not set for your root user then keep it empty )
define('DATABASE', $db_name); // Database name
define('CHARSET', 'utf8');
 
 
function DB()
{
     try {
         static $instance;
         if ($instance === null) {
             $opt = array(
                 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                 PDO::ATTR_EMULATE_PREPARES => FALSE,
             );
             $dsn = 'mysql:host=' . HOST . ';dbname=' . DATABASE . 
';charset=' . CHARSET;
             $instance = new PDO($dsn, USER, PASSWORD, $opt);
         }
         return $instance;
     } catch (PDOException $e) {
         return "Error!: " . $e->getMessage();
