Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

carlos romeu

php mysql collation - Acentos não são salvos corretamente.

Recommended Posts

Olá pessoal, estou com problema para salvar os acentos corretamente no banco de dados mysql.

 

Segue o trecho de código que estou utilizando pra testes:

<?php
 
$dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME) or die('Não conectou');
$query = "INSERT INTO TESTE (nome) VALUES ('visão')";
$data = mysqli_query($dbc, $query) or die ('Não inseriu');
 
?>

 

Não estou usando html, apenas rodando o trecho de código acima pra inserir no banco a palavra VISÃO numa tabela de teste.

No entanto, ao mandar pro banco de dados ele não salva a palavra visão, ele substitui o ã por outros caracteres.

Como deve ser salvo: visão.

Como é salvado: visão.[/size]

 

Quando executo o select no workbench a palavra é mostrada assim visão.

No entando se faço o seguinte no código php o script roda sem problema:

 

<?php
 
$dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME) or die('Não conectou');
$query = "INSERT INTO TESTE (nome) VALUES ('visão')";
$data = mysqli_query($dbc, $query) or die ('Não inseriu');
 
//ele acha os dados, mesmo o banco não salvando os acentos (WHERE funciona)
$query = " SELECT * FROM TESTE WHERE nome = 'visão' ";
 
$data = mysqli_query($dbc, $query);
 
$result = mysqli_fetch_array($data);
 
//ele exibe a palavra visão corretamente
echo $result['nome];
 
 
?>

Pelo que constatei ele sava errado no banco, mas qualquer operação no script funciona corretamente.

*** esse mesmo select com a o WHERE = 'visão' executado no workbench não funciona (ELE NÃO ENCONTRA DOS DADOS)

 

Informações:

collation default do schema é utf-8 general ci, assim como da tabela.

 

Alguém tem alguma sugestão de como posso resolver isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja charset do html está em utf8 também, colocar no header da sua página o código abaixo.

Caso dê certo, padroniza seu banco com seu código

<?php header ('Content-type: text/html; charset=UTF-8'); ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta.

Estou iniciando o estudo com php e mysql e estou passando por esses erros iniciais, ja pesquisei bastante sobre esse erro e ja vi varias sugestoes.

Essa que você passou ja havia tentado e não funcionou.

Resolvi iniciar tudo do zero e compartilhar os passos, alguém encherga algum erro? ou falta fazer algo a mais para que o banco e aplicação fiquem padronizadas em utf-8?

 

1 - Criação do schema no mysql.

CREATE SCHEMA `testedb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2 - Criação da tabela de teste.

CREATE TABLE `testedb`.`TESTETABLE` (
  `cod` INT NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL,
  PRIMARY KEY (`cod`));

3 - código da página php de testes.

<?php
header('Content-Type: text/html; charset=UTF-8');
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', 'justdoit');
define('DBNAME', 'testedb');
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <?php
        $dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME)
                or die('Não conectou ao banco');
        $query = "INSERT INTO TESTETABLE (nome) VALUES ('visão')";
        $data = mysqli_query($dbc, $query)
                or die('Não executou inserção');
        $query = "select * from TESTETABLE WHERE nome = 'visão'";
        $data = mysqli_query($dbc, $query) or die('não executou select');
 
        $result = mysqli_fetch_array($data);
 
        echo $result['nome'];
        ?>
 
    </body>
</html>
4- Resultados:

No banco ele salvou visão; (tinha que salvar visão).

 

 

 

grato pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu faço essa modificação no código utilizando utf8_decode para gravar a palavra 'visão'. E utilizando utf8_encode para mostrar a palavra visão a aplicação faz o que eu quero. Ela salva no banco 'visão' corretamente e mostra corretamente.

mas não existe um modo de fazer com que tudo opere em utf8 sem precisar ficar utilizando funções?

 

<?php
header('Content-Type: text/html; charset=UTF-8');
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', 'justdoit');
define('DBNAME', 'testedb');
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <?php
        $dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME)
                or die('Não conectou ao banco');
        $valor = 'visão';
        $valor = utf8_decode($valor);
        $query = "INSERT INTO TESTETABLE (nome) VALUES ('visão')";
        $data = mysqli_query($dbc, $query)
                or die('Não executou inserção');
        $query = "select * from TESTETABLE WHERE nome = 'visão'";
        $data = mysqli_query($dbc, $query) or die('não executou select');
 
        $result = mysqli_fetch_array($data);
 
        echo utf8_encode($result['nome']);
        ?>
 
    </body>
</html>
Bom, se para salvar corretamente eu tenho que usar utf8_decode.

O manual do php diz o seguinte:

Esta função decodifica data, assumido ser codificada em UTF-8, para ISO-8859-1.

 

E na minha tabela o dado é mostrado corretamente, isso significa que minha tabela ta com collation ISO-8859-1? Mas no ato da criação eu defini utf8.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema parece ser na codificação do script ou conexão!

Para conexões com mysqli

//Orientado
$mysqli->set_charset("utf8");

//procedural
mysqli_set_charset($conn,"utf8");

http://php.net/manual/pt_BR/mysqli.set-charset.php

codificação no script

 

uiV1zFH.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema parece ser na codificação do script ou conexão!

 

 

Para conexões com mysqli

//Orientado
mysqli_set_charset($this->mysqli,"utf8");

//procedural
mysqli_set_charset($conn,"utf8");
codificação no script

 

uiV1zFH.png

 

Muito obrigado. Era a conexão!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.