Database non estrae correttamente caratteri accettati

  • Creatore Discussione Creatore Discussione Shyson
  • Data di inizio Data di inizio

Shyson

Utente Attivo
19 Ago 2012
1.179
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

  • Schermata 04-2456761 alle 04.36.46.png
    Schermata 04-2456761 alle 04.36.46.png
    14,5 KB · Visite: 347
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.
 
quando lo stampi a video mettici htmlspecialchars($link["visite"]);
Così vorrai dire
PHP:
".htmlspecialchars($link["pagina"])."
non stampa niente a video, tutto vuoto. La pagina è in utf8, il db in utf8_general_c. La tabella ed il campo sono in latin_swedish_ci
 
Ultima modifica:
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().
 
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:
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:
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
 
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)
 
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()
 
Questa è la codifica che ho ora, inserendo in SQL questo:
PHP:
 SHOW VARIABLES LIKE ‘character\_set\_%’;

mi da questo
 
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.
 
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.

Dove lo metto questo? $mysqli->set_charset("utf8mb4");
 
Ora è così, ma nel db stampa sempre caratteri strani, a video giusto. Non ho ancora inserito questo $mysqli->set_charset("utf8mb4");

 
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.
 
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.
 

Discussioni simili