Il linguaggio di programmazione PHP
 

PDO e virgolette

NoS 1 Mar 2017 19:36
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
fmassei@gmail.com 1 Mar 2017 19:50
On Wednesday, March 1, 2017 at 1:37:00 PM UTC-5, NoS wrote:
> ...
> Come posso risolvere?
>

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!
NoS 1 Mar 2017 19:53
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.

Il 01/03/2017 19.50, fmassei@gmail.com ha scritto:
> On Wednesday, March 1, 2017 at 1:37:00 PM UTC-5, NoS wrote:
>> ...
>> Come posso risolvere?
>>
>
> 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!
>
fmassei@gmail.com 1 Mar 2017 20:08
On Wednesday, March 1, 2017 at 1:53:19 PM UTC-5, NoS wrote:
> 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).
>

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!
Alessandro Pellizzari 1 Mar 2017 21:47
On 01/03/17 18:36, NoS wrote:

> Il charset è definito tra i parametri di connessione come:
> define('CHARSET', 'utf8');

Questo definisce una costante generica, non passa parametri al DB.

Sei sicuro che poi questa costante venga usata?

Bye.
NoS 2 Mar 2017 11:01
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();
}
}



Il 01/03/2017 21.47, Alessandro Pellizzari ha scritto:
> On 01/03/17 18:36, NoS wrote:
>
>> Il charset è definito tra i parametri di connessione come:
>> define('CHARSET', 'utf8');
>
> Questo definisce una costante generica, non passa parametri al DB.
>
> Sei sicuro che poi questa costante venga usata?
>
> Bye.
>
>

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione PHP | Tutti i gruppi | it.comp.www.php | Notizie e discussioni php | Php Mobile | Servizio di consultazione news.