Database non estrae correttamente caratteri accettati

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Quando estraggo i dati da una tabella, le lettere accentate appaiono col classico punto di domanda.
Questa è la parte di codice: $link['pagina']
PHP:
function piu_visitate($n) {
$mysqli = new mysqli("localhost", "root", "pwd", "gruppoalveo");  
   $pag_viste = $mysqli->query("SELECT * FROM visitate ORDER BY visite DESC LIMIT 0,$n");
  if ($pag_viste->num_rows > 0) {
    echo "<ol class=\"formol\"'piu_visitate'>";
    while ($link = $pag_viste->fetch_array(MYSQLI_ASSOC)) {  
    echo "<div style=\"margin-bottom:-10px; font-size:10px; color:#c4c4c4;\">".$link["visite"]." volte</div>";  
    echo "<li><a class=\"visti\" href='".$link['url']."'>".$link['pagina']."</a></li>";
    }
  echo "</ol>";
  }
}
 

Allegati

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Quando estraggo i dati da una tabella, le lettere accentate appaiono col classico punto di domanda.
Questa è la parte di codice: $link['pagina']
PHP:
function piu_visitate($n) {
$mysqli = new mysqli("localhost", "root", "pwd", "gruppoalveo");  
   $pag_viste = $mysqli->query("SELECT * FROM visitate ORDER BY visite DESC LIMIT 0,$n");
  if ($pag_viste->num_rows > 0) {
    echo "<ol class=\"formol\"'piu_visitate'>";
    while ($link = $pag_viste->fetch_array(MYSQLI_ASSOC)) {  
    echo "<div style=\"margin-bottom:-10px; font-size:10px; color:#c4c4c4;\">".$link["visite"]." volte</div>";  
    echo "<li><a class=\"visti\" href='".$link['url']."'>".$link['pagina']."</a></li>";
    }
  echo "</ol>";
  }
}
Praticamente lo faccio entrare nel db in formato Octal, es: Cos\'\350 ALVEO? e nel db si stampa giusto: Cos'è ALVEO?, ma lo estrae col simbolo interrogativo.
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Database e tabelle sul db, per essere correttamente impostate per utf-8, devono avere il set su utf8mb4.
Detto questo, prova con un utf8_encode() al posto di htmlspecialchars().
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Database e tabelle sul db, per essere correttamente impostate per utf-8, devono avere il set su utf8mb4.
Detto questo, prova con un utf8_encode() al posto di htmlspecialchars().
Se metto come dici tu, scrive nel db il carattere strano, però a video stampa giusto. Praticamente è il contrario.

Perciò il problema è l'inserimento nel db. questo è il codice

PHP:
<?php
//Mette i dati nel DB e aumenta il contatore ad ogni visita
function contatore($title) { 
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php
  $continua = false; 
  if (isset($_SERVER['HTTP_REFERER']) != "") {
  $from = parse_url($_SERVER['HTTP_REFERER']);
  $from = $from['host'];
}
else {
  $from = "";
} 
   $whitelist = array( 
/*Qui scrivi l'url del sito in modo che quando l'utente vi arriva DA TERZI, anche se digita con le pagine, il contatore non sale.
Se poi è nel mio sito e ci clicca su, ovviamente il contatore del db sale*/
"localhost" //Scrivi gli url senza http:// 
  ); 
  foreach ($whitelist as $sito) { 
    if ($from == $sito) $continua = true; 
  } 
  if ($continua) { 
    $mysqli = new mysqli("localhost", "root", "pwd", "gruppoalveo");   
    $url = $_SERVER['PHP_SELF']; 
    $esiste = $mysqli->query ("SELECT * FROM visitate WHERE url='$url'"); 
    $title=utf8_encode($link["pagina"]);
    if ($esiste->num_rows == 0) { 
      $mysqli->query ("INSERT INTO visitate VALUES ('$title', '$url', 1)"); 
    } 
    else { 
      $old = $esiste->fetch_array(MYSQLI_ASSOC);   
      $visite = $old['visite'] + 1; 
      $mysqli->query("UPDATE visitate SET pagina='$title', visite=$visite WHERE url='$url'"); 
    } 
  } 
}   
 }
 
Ultima modifica:

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Pardon, l'utf8_encode usalo in fase di estrapolazione dei dati e non di inserimento.
Comunque non è strano: la tua tabella non è utf8, se ci entra dentro un dato multibyte lo leggerai "strano" ma una volta estratto e posto in un contesto dove il character set è quello appropriato (la tua pagina con encoding utf-8) torni a vederlo normale.

Dovresti convertire il collation della tabella sul tipo che ti ho suggerito e probabilmente questa operazione renderà inutile l'uso della funzione che ti ho suggerito.
 
Ultima modifica:

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Pardon, l'utf8_encode usalo in fase di estrapolazione dei dati e non di inserimento.
Comunque non è strano: la tua tabella non è utf8, se ci entra dentro un dato multibyte lo leggerai "strano" ma una volta estratto e posto in un contesto dove il character set è quello appropriato (la tua pagina con encoding utf-8) torni a vederlo normale.

Dovresti convertire il collation della tabella sul tipo che ti ho suggerito e probabilmente questa operazione renderà inutile l'uso della funzione che ti ho suggerito.
Ti ho appena risposto al post #8
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Il problema è che infili un dato utf-8 in una tabella non utf-8: è normale che non lo visualizzi bene.
Hai provato a modificare il collation della tabella ? (se lo fai, elimina la funzione utf8_encode che dovrebbe diventare superflua)
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Il problema è che infili un dato utf-8 in una tabella non utf-8: è normale che non lo visualizzi bene.
Hai provato a modificare il collation della tabella ? (se lo fai, elimina la funzione utf8_encode che dovrebbe diventare superflua)
Adesso è così:

Localhost: utf8_general_c
tabella e records: latin_swedish_c

Nel db scrive caratteri strani, es: Perché s'invecchia?

ma a video scrive giusto. Ho tolto il tuo codice utf8_encode()
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Sarebbe buona cosa impostare la codifica anche al client che si collega, questo lo puoi fare dall'oggetto mysqli:
PHP:
$mysqli->set_charset("utf8mb4");
Per il resto, forse i dati nella tabella sono rimasti memorizzati con la precedente codifica, prova con dei nuovi record.
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Il pezzo di codice subito dopo aver aperto la connessione al db.
Quanto alla questione che nel db lo vedi strano, intendi che tramite il PHPMyAdmin lo vedi strano? Perché mi viene in mente che se il dato lo visualizzi giusto nella pagina significa che nel database il dato grezzo è salvato correttamente.
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Il pezzo di codice subito dopo aver aperto la connessione al db.
Quanto alla questione che nel db lo vedi strano, intendi che tramite il PHPMyAdmin lo vedi strano? Perché mi viene in mente che se il dato lo visualizzi giusto nella pagina significa che nel database il dato grezzo è salvato correttamente.
Appunto, è questo il mistero: nel db lo salva con i caratteri accentati-strani, ma nel sito scrive giusto.