Inserimento caratteri speciali nel DB

  • Creatore Discussione Creatore Discussione LaKanka
  • Data di inizio Data di inizio

LaKanka

Utente Attivo
29 Ago 2008
166
0
0
Ciao a tutti, ho un problema con la parola "attività"....
Nella mia pagina php ho:
PHP:
header('Content-Type: text/html; charset=utf-8');
$tipo="attività";
$query = "INSERT INTO oggetto (zona,descrizione,tipo,id_registrato,registrato) VALUES ( "
		.sql_string(trim($zona)).","
		.sql_string(trim($descrizione)).","
		.sql_string(trim($tipo)).","
		.sql_string(trim($cid)).","
		.sql_string(trim($registrato))." )";
$row_set = mysql_query($query, $conn) or die("Errore nella query di inserimento: " . mysql_error());

Nel mio DB ho impostato MySQL charset: UTF-8 Unicode (utf8)
All'interno ho la tab "oggetti" i quali campi sono tutti settati latin1_swedish_ci, ma questo non mi ha mai dato problemi con il DB che avevo una volta... ho anche cambiato server, ma sinceramente le ho provate tutte e non riesco a capire quale sia il problema...
ho provato a settare il campo "tipo" invece che latin1_swedish_ci a UTF-8 ma non è cambiato nulla:
la "à" la salva come "Ã". :incazz:

Qualcuno sa dirmi dove sbaglio?
 
Ho fatto delle prove sia col charset UTF-8 Unicode che col latin1_swedish_ci e sul DB me lo salva correttamente con la a accentata.
 
Se salvo il campo utilizzando una classe che ho creato per avere delle select già fatte, solo da richiamare, funziona perfettamente...
ESEMPIO
Ho la classe tipo.class.php:
PHP:
<?php
class tipo {
	var $result = array();
	var $id = null;
	var $tipo = null;
	function tipo() {
	$array = array('bene','licenza','attività');
		foreach ($array as $element) {
			$obj = new stdClass();
			$obj->id = 	$element;
			$obj->tipo = $element;
			$this->result[] = $obj;
		}
	}
	function load($id) {
		$this->id = $id;
		$this->tipo = $id;	
	}
	function getAll() {
		return $this->result;
	}
	function selectList() {
		return FrancescaHTML :: selectList($this->getAll(), 'tipo', ' id="tipo" class="ptesto" style="width:80%" onChange="submitform()"', 'id', 'tipo', $this->id, "Qualsiasi");
	}
}
?>
Poi nel form della pag inserisci_nuovo.php ho il richiamo alla tendina "tipo":
PHP:
<?php
echo '<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />'
$tipoObj = new tipo();
$tipoObj->load($_REQUEST['tipo']);
echo $tipoObj->selectList();
?>
Nel file di esecuzione faccio semplicemente:
PHP:
$query = "INSERT INTO oggetto (zona,descrizione,tipo,id_registrato,registrato) VALUES ( " 
.sql_string(trim($_POST['zona'])) .", "
.sql_string(trim($_POST['tipo'])) .", "
.sql_numeric(trim($_POST['id_registrato'])) .", "
.sql_string(trim($registrato)) . ")";
$row_set = mysql_query($query, $conn) or die("Errore nella query di inserimento: " . mysql_error());

Così il campo attività mi viene inserito perfettamente nel DB....
forse perchè gli passo il campo tipo in $_POST???

prova anche con

charset=iso-8859-1

Già provato.... nessun miglioramento...:dipser:
 
L'ho sempre utilizzata per salvare le stringhe nel mio DB come sql_numeric...
Se ho come campo della mia tabella un INT allora utilizzerò sql_numeric, così se provo ad inserire $valore='ciao' mi da come risultato errore e non mi fa la query di insert....
Io lo utilizzo come controllo aggiuntivo...
 
Dimenticavo:
PHP:
// Funzione per la formattazione delle stringhe dal WEB a MySQL.
function sql_string($value)
// Restituisce la stringa formattata per la lettura da parte di SQL.
// Parametri:
// - $value     :stringa da formattare.
  {
  $result = false;
  
  // Sostituzione dell'eventuale apice con la sequenza "\'" 
  // e concatenazione apici agli estremi.
  $result = "'" .$value. "'"; 
  
  // Assegnazione del risultato della funzione.
  return $result;
  }
  

// Funzione per la formattazione dei numeri dal WEB a MySQL.
function sql_numeric($value)
// Restituisce il numero formattato per la lettura da parte di SQL.
// Parametri:
// - $value     :numero da formattare.
  {
  $result = false;
  
  // Assegnazione valore zero in caso di variabile non settata.
  if (isset($value) == false) {$value = 0;};

  // Assegnazione valore zero in caso di variabile uguale a stringa vuota.
  if ($value == '') {$value = 0;};
  
  // Sostituzione dell'eventuale virgola con il punto.
  $result = str_replace(",", ".", $value); 
  
  // Assegnazione del risultato della funzione.
  return $result;
  }
  

// Funzione per la formattazione delle date dal WEB a MySQL.
function sql_date($value, $extract = 'none')
// Restituisce la data formattata per la lettura da parte di SQL.
// Parametri:
// - $value     :data da formattare;
// - $extract   :specifica l'eventuale porzione da estrarre.
  {
  $result = false;
  
  // Estrazione dell'anno.
  $year = substr($value, - 4);
  
  // Estrazione del mese.
  $month = substr($value, 3, 2);
  
  // Estrazione del giorno.
  $day = substr($value, 0, 2);
  
  // Restituzione porzioni data se richiesto dal parametro $extract.
  switch ($extract)
    {case 'year':
       return $year;
     case 'month':
       return $month; 
     case 'day':
       return $day; 
    };
      
  // Composizione data nel formato yyyymmdd.
  $result = $year.$month.$day; 
    
  // Deallocazione variabili.
  unset($year);
  unset($month);
  unset($day);
  
  // Assegnazione del risultato della funzione.
  return $result;
  }
 
ciao, la mia eventuale ca....a quotidiana.
hai provato, oltre il trim a dargli htmlspecialcars()
dovrebbe trasformarti à in &agrave; e quando lo leggi a video dovrebbe risultare di nuovo à (io come detto uso charset=iso-8859-1 e non ho provato con gli altri)
 
Ho messo l'header a charset=iso-8859-1 e ho aggiunto
PHP:
.sql_string(trim(htmlspecialchars($tipo))).","

Niente da fare nel mio DB trovo nel campo tipo "attività "....
 
Nella pagina visualizza.php ho
HTML:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
PHP:
$query= "select * from oggetti";
$result = mysql_query($query) or die(mysql_error());
while ($oggetto = mysql_fetch_object($result)) { 
echo $oggetto->tipo.'<br>'; }

Visualizzo:
attivitÃ
attivitÃ
attivitÃ
attivitÃ
attivitÃ
 
Comunque è stranissimo, io ho fatto varie prove sia con i charset che con le modalità di inserimento e nel DB trovo sempre "attività". Facciamo un passetto indietro, sistema operativo installato e versione di MySql.
 
ciao
io intendevo che tu andassi dentro la tabella con myadmin per per vedere cosa viene inserito esattamente.
fai una piccola prova
prova ad inserire attivit&agrave;
verifica anche il codice asci del carattere
 
ciao
ho fatto questa stupidissima prova

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento senza titolo</title>
</head>

<body>
<?php
$carattere1="attività";
$carattere2="attivit&agrave;";
echo "1) senza htmlsp: ".$carattere1."<br>";
echo "1) con htmlsp: ".htmlspecialchars($carattere1)."<br>";
echo "2) senza htmlsp: ".$carattere2."<br>";
echo "2) con htmlsp: ".htmlspecialchars($carattere2)."<br>";
?>
<p>iso-8859-1
UTF-8 Unicode </p>
<p>&agrave;
</p>
</body>
</html>

con questo risultata a monitor

1) senza htmlsp: attività
1) con htmlsp: attività
2) senza htmlsp: attività
2) con htmlsp: attivit&agrave;

iso-8859-1 UTF-8 Unicode

à

mentre mettendo UTF

1) senza htmlsp: attivit�
1) con htmlsp: attivit�
2) senza htmlsp: attività
2) con htmlsp: attivit&agrave;
 
Facciamo un passetto indietro, sistema operativo installato e versione di MySql.
sono d'accordo con satifal.
però quello che non ho ancora capito:

nel campo del db si trova à oppure Ã?
perche se nel campo trovo à al posto di à è un errore di immissione o viene trsaformato qualcosa e satifal ha molte ragioni

se nel campo invece trovo à e con echo visualizzo Ã, non dipende, secondo me, da php o mysql ma in qualche punto c'è un
<meta http-equiv="Content-Type" content="text/html; charset=??????"> che non viene intrepretato o interpretato male.
per quello dicevo di estrarre dal db e verificare
$carattere valore estratto da db
echo "asci : ".ord($carattere[7]);

se risulta asci : 224 nel campo ho à ed è un errore di visualizzazione
se invece asci : 195 è evidente che l'errore è nell'immissione
 
In effetti il dubbio di borgo è lecito. Mi era sembrato di capire che nel DB (quindi tramite phpMyAdmin, MySQL Query Browser oppure altro client) tu vedessi effettivamente "attivitÃ", ma rileggendo i post precedenti mi sorge qualche dubbio. Puoi confermare che nel DB (ma senza recuperare i dati tramite PHP) il valore inserito è effettivamente sbagliato?
 
Facciamo un passetto indietro, sistema operativo installato e versione di MySql.

Windows XP
MySQL client version: 5.0.51

io intendevo che tu andassi dentro la tabella con myadmin per per vedere cosa viene inserito esattamente.

attivitÃ
è il primo posto che vado a controllare dopo una prova di inserimento...:p

prova ad inserire attivit&agrave;

Viene inserito questo:
attivit&agrave;

Forse sto dimenticando qualcosa.....

Il fatto che, utilizzando la classe "tipo", passavo il valore con $_post prima di salvarlo cambia qualcosa???

Mi sembra una cosa impossibile:dipser:
 
perche se nel campo trovo à al posto di à è un errore di immissione o viene trsaformato qualcosa

Se fosse un errore di immissione dei dati allora non mi spiego perchè inserendo il valore scritto all'interno della classe tipo (scritto semplicemente attività) lo salva correttamente....:hammer:
 

Discussioni simili