php - conexion - Problema de carácter PDO utf-8
set charset utf 8 php pdo (6)
Actualmente estoy trabajando en un proyecto, y en lugar de utilizar consultas regulares de MySQL, pensé que seguiría adelante y aprendería a usar PDO.
Tengo una tabla llamada concursantes, tanto la base de datos, la tabla y todas las columnas están en utf-8. Tengo diez entradas en la tabla de concursantes, y su columna "nombre" contiene caracteres como åäö.
Ahora, cuando obtengo una entrada de la base de datos y var_dump el nombre, obtengo un buen resultado, una cadena con todos los caracteres especiales intactos. Pero lo que tengo que hacer es dividir la cadena por caracteres, para obtenerlos en una matriz que luego mezclaré.
Por ejemplo, tengo esta cadena: Test ÅÄÖ Tåän
Y cuando ejecuto str_split obtengo cada carácter en su propia clave en una matriz. El único problema es que todos los caracteres especiales se muestran así: , lo que significa que la matriz será así:
Array
(
[0] => T
[1] => e
[2] => s
[3] => t
[4] =>
[5] => �
[6] => �
[7] => �
[8] => �
[9] => �
[10] => �
[11] =>
[12] => T
[13] => �
[14] => �
[15] => �
[16] => �
[17] => n
)
Como puede ver, no solo arruina los caracteres, sino que también los duplica en el proceso str_split. He intentado varias formas de dividir la cadena, pero todas tienen el mismo problema. Cuando imprimo la cadena antes de la división, muestra los caracteres especiales muy bien.
Este es mi código dbConn.php:
// Requiere archivo de configuración: require_once (''config.inc.php'');
// Start PDO connection:
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf-8", $dbUser, $dbPass);
$dbHandle -> exec("SET CHARACTER SET utf8");
// Set error reporting:
$dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
Y este es el código que utilizo para obtener de la base de datos y el bucle:
// Require files:
require_once(''dbConn.php'');
// Get random artist:
$artist = $dbHandle->query("SELECT * FROM ".ARTIST_TABLE." WHERE id = 11 ORDER BY RAND() LIMIT 1");
$artist->setFetchMode(PDO::FETCH_OBJ);
$artist = $artist->fetch();
var_dump($artist->name);
// Split name:
$artistChars = str_split($artist->name);
Me estoy conectando con utf-8, mi archivo php es utf-8 sin BOM y ningún otro personaje especial en esta página comparte este problema. ¿Qué podría estar mal o qué estoy haciendo mal?
Gracias de antemano // Jonathan
PROBLEMAS Y SOLUCIONES UTF-8 por FUNCIONES PHP
1. Cómo guardar los fletadores UTF-8 (cadena matemática, caracteres especiales como 92 ÷ 8 ÷ 2 =?)?
Ans. $ string = utf8_encode (''92 ÷ 8 ÷ 2 =? '');
2. ¿Cómo imprimir UTF-8 Charterers From Database?
Ans. echo utf8_decode ($ string);
Nota: Si no desea hacer esto mediante el uso de codificación / decodificación, puede hacerlo a través de.
1. si estás usando mysqli_query () entonces
$conn = mysqli_connect(''localhost'',''db_username'',''password'',''your_database_name'');
mysqli_set_charset($conn,"utf8");
2.Si está usando PDO, entonces
class Database extends PDO{
function __construct() {
parent::__construct("mysql:host=localhost;dbname=your_db_name","gurutslz_root","Your_db_password",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ''utf8''"));
}
}
$conn=new Database();
La función str_split
divide por byte, no por carácter. Necesitarás mb_split
.
Tenga en cuenta que se informa que la declaración utf8 utilizada en su cadena de conexión no funciona. En los comentarios en php.net, frecuentemente veo esta alternativa:
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ''utf8''"));
este trabajo para mí ... espero que sea útil.
asegúrese de que la base de datos, apache y cada configuración estén en utf8.
OBJETO DOP
$dsn = ''mysql:host='' . Config::read(''db.host'') . '';dbname='' . config::read(''db.basename'') .'';charset=utf8''. '';port='' . Config::read(''db.port'') .'';connect_timeout=15'';
$user = Config::read(''db.user'');
$password = Config::read(''db.password'');
$this->dbh = new PDO($dsn, $user, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ''utf8''"));
$this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
funciona si no se usa otra función como str_word_count.
USANDO str_word_count necesitas usar utf8_decode (utf8_encode) ..
function cortar($str)
{
if (20>$count=str_word_count($str)) {
return $str;
}
else
{
$array = str_word_count($str,1,''.,-0123456789()+=?¿!"<>*ñÑáéíóúÁÉÍÓÚ@|/%$#¡'');
$s='''';
$c=0;
foreach ($array as $e) {
if (20>$c) {
if (19>$c) {
$s.=$e.'' '';
}
else
{
$s.=$e;
}
}
$c+=1;
}
return utf8_decode(utf8_encode($s));
}
}
función vuelve cadena con 20 palabras.
UTF-8 usando DOP
problemas al escribir caracteres internacionales (incluso chinos y tailandes) en la base de datos
puede haber más formas de hacer que esto funcione. No soy un experto, solo un fanático de la tecnología, interesado en comprender todo esto. En Linux y Windows he configurado algunos CMS (content-managing-systems), usando una muestra del siguiente sitio web:
'' http://www.elated.com/articles/cms-in-an-afternoon-php-mysql ''
La muestra está usando PDO para inserción, actualización y eliminación.
Me tomó algunas horas encontrar una solución. Todo lo que hice, siempre concluí las diferencias entre los datos en mis formularios y en los de phpmyadmin / heidi -views
Seguí las pistas de: '' https://mathiasbynens.be/notes/mysql-utf8mb4 '' pero todavía no había éxito
En mi estructura de CMS hay un archivo ''Config.php'': después de leer esta página web cambié la línea
define( ''DB_DSN'', ''mysql:host=localhost;dbname=mythings);
a
define( ''DB_DSN'', ''mysql:host=localhost;dbname=mythings;charset=utf8'');
Ahora todo funciona bien.