Acentuação em banco de dados / PHP x Harbour

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Acabei de ter uma ideia. Vc cria um exemplo simples e tenta reproduzir seu erro. Crie um prg com a mesma codificação que costuma usar. Nesse prg faça um loop simples em uma tabela MySQL. O ideal é que essa tabela seja a única em um banco de testes, não precisa ter muitas linhas. Mas o conteúdo precisa ter acentos. Feito isso nos mande o arquivo prg e o arquivo sql contendo a criação do banco (create table) e os inserts. O conteúdo mostrado deve reproduzir seus erros. Só assim a gente pode te ajudar mesmo, sem soluções mágicas ou balas de prata.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Outra coisa. Se quiser incluir um a arquivo PHP reproduzindo o erro tb seria bom.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Acentuação em banco de dados / PHP x Harbour

Mensagem por cjp »

Gostei da ideia de mudar tudo pro utf8. Se isso funcionar bem, me disponho a ter esse trabalho.
Mas pra começar a fazer isso, preciso de algumas informações, por favor:
1) O Notepad++ serve para isso? Como já uso ele há muito tempo, seria bom poder continuar com ele;
2) Caso positivo, é só selecionar Encode in UTF-8, como no anexo?
3) Daí é só escrever o .prg e o .php nesse Encode? Vc falou que tem que selecionar hb_cdpselect("utf8"). Mesmo escrevendo nesse Encode vai precisar disso?
4) Na tabela é só mudar o Collate da tabela para UTF-8?

Vou fazer o teste que vc sugeriu e postar daqui a pouco.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Acentuação em banco de dados / PHP x Harbour

Mensagem por cjp »

Fiz um teste bem simples que demonstra o problema:

1) criei uma tabela com collation utf-8:

Código: Selecionar todos

CREATE TABLE `teste_acento` (
	`teste1` CHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;
2) criei um .prg com Encode UTF-8 no Harbour:

Código: Selecionar todos

function main
         local cTeste :=space(50)
		 private us :="I"
		 
		 cls
		 @ 5,5 say "Teste:"get cTeste
		 read
		 
		 exqado("insert into teste_acento(teste1) values('"+cTeste+"')",3)
return .t.
3) criei um .php com UTF-8:

Código: Selecionar todos

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <title>Testando acentuação</title>
</head>
<body style="color: rgb(0, 0, 0); background-color: rgb(255, 204, 153);"
 alink="#000099" link="#000099" vlink="#990099">
 <form action="testeacentuacao2.php" method="post"> <input type="hidden">

 <left>
 <table align="left" border="0" cellpadding="0" cellspacing="0"
 width="49%" style='height:40px;'>
   <font size="38">
  <tbody>
 <BR>
   <tr>
   <font size="38">
    <label>Digite teste:</label>
    <input style="font-size:130px" name="teste">
   </tr>
    <td> <input style="font-size:130px" name="submit" value=" Enviar " type="submit">
 <BR>
    <input style="font-size:130px" name="reset" value=" Limpar " type="reset"></td>
   </tr>
  </tbody>
 </table>
 </left>
   <BR>
   <BR>
  
</form>
</body>
</html>[code]


<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="Tony Araujo & Jeferson Josias ">
<title>Incluindo teste</title>

<!-- Bootstrap core CSS -->
<link href="/site/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/site/css/style.css" rel="stylesheet">
</head>
<body>

<?php


include("conexao.php");

$test= $_POST['teste'];

echo "<font face='arial' color='red' size='26'>";


$sql="INSERT INTO teste_acento (teste1) values ('".$test."')";

exqsqlking($sql);

echo "<font size='38'>";


?>

<div class="px-1 py-1 my-1 text-center">
<div class="col-lg-6 mx-auto">
<div class="row gap-1 justify-content-center">

<?php

echo '<a href="testeacentuacao.php" class="btn btn-primary btn-lg col-5 col-xs-5 col-sm-5 col-md-5 col-lg-5 col-xl-5 align-self-center d-flex flex-column justify-content-center align-items-center line-8">Retornar</a>';


?>

</body>
</html>[/code]

Veja o resultado do teste no anexo: o primeiro registro foi feito pelo Harbour, a acentuação ficou correta; o segundo registro foi feito pelo PHP, a acentuação ficou muito errada.

Aproveito para anexar o arquivo do post anterior, que havia esquecido de anexar.
Anexos
Notepad.png
resultado.png
resultado.png (8.93 KiB) Exibido 17831 vezes
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Acentuação em banco de dados / PHP x Harbour

Mensagem por JoséQuintas »

Conclusão óbvia: se PHP salvou errado, tem que olhar PHP.

Harbour não tem que mexer em nada, nem no banco de dados, senão vai estragar o que está funcionando.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Olá, pensei que tivesse desistido.

Vou verificar o que vc postou mas talvez só amanhã mesmo. Vc poderia compactar os seus arquivos do projeto de exemplo? Preciso ter certeza de que estão em utf8. Menos o sql. Só o PHP e prg.

Se quiser postar o sql pode colocar no zip, mas eu quero ter certeza de que o PHP e o prg estão no formato utf8 mesmo.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Acentuação em banco de dados / PHP x Harbour

Mensagem por JoséQuintas »

SEM AS SENHAS.
Você já fez isso uma vez, e o acesso daqui é público, todo mundo pode ver, não apenas os usuários cadastrados no fórum, é todo mundo mesmo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Esse Head do HTML está no formato antigo.

Código: Selecionar todos

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
Substitua ele pelo html5

Código: Selecionar todos

<!DOCTYPE html>
Dentro do Head coloque a TAG meta abaixo:

Código: Selecionar todos

<meta charset="UTF-8">
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Um pequeno exemplo

Código: Selecionar todos

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title of the document</title>
</head>
<Body>
Seu código
</Body>
</html>
Conclusão: em documentos HTML vc precisa informar no cabeçalho qual o tipo de documento que está sendo enviado para o navegador.

Quando eu sugeri utf8 eu quis dizer que é o padrão mundial e que ele da menos problema. Mas nada impede de vc usar outros padrões de código.

O mais importante é vc entender como funciona e não seguir utf8 só porque é uma tendência. Vc usa o código que achar melhor de acordo com a sua realidade. Sistemas antigos não precisam migrar para utf8, basta fazer as conversões na hora de mandar.

Então temos, no caso do utf8:

1. Todos os Códigos digitados em editor de texto usando o padrão utf8
2. Código HTML , além do item 1,devem ter o utf8 definido no header
3. Banco de dados utf8
4. Harbour com hb_cdpselect("utf8") no início
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Acentuação em banco de dados / PHP x Harbour

Mensagem por cjp »

Desisti não. É que às vezes a correria de trabalho aqui não me permite dar sequência logo.
Não tenho conhecimento suficiente para escolher nada; o que me sugerirem que funcione, está ótimo.
Fiz a modificação no php que vc sugeriu, mas ainda assim não funcionou.
Estou postando no anexo o .prg, o .php e o .sql. Agradeço toda ajuda nisto, já faz tempo que estou tentando resolver este problema.
Anexos
php.zip
(1.32 KiB) Baixado 259 vezes
teste_acentuacao.zip
(334 Bytes) Baixado 292 vezes
teste.zip
(846 Bytes) Baixado 286 vezes
Inacio de Carvalho Neto
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Deu esse erro

Código: Selecionar todos

Fatal error: Uncaught Error: Call to undefined function exqsqlking()
Tem tb um arquivo conexao.php que não veio.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

De qualquer modo eu retirei as chamadas que não vieram e apenas imprimi o sql e deu certo :

Código: Selecionar todos


//include("conexao.php");  //<------- Comentei aqui

$test= $_POST['teste'];

echo "<font face='arial' color='red' size='26'>";

  
$sql="INSERT INTO teste_acento (teste1) values ('".$test."')";
echo $sql; <---------------------- Imprimiu corretamente
   
//exqsqlking($sql); <----- E aqui
   
Eu digitei a string "áéíóúçÃ" e ele imprimiu corretamente:

Código: Selecionar todos

INSERT INTO teste_acento (teste1) values ('áéíóúçÃ')
Então até aqui não vi erro algum. Pode ser nessas funções que não vieram.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Achei esse link aqui que creio que é a resposta.

https://stackoverflow.com/questions/462 ... -php-mysql

Segundo o link o problema é na função do PHP que faz a conexão. Essa função que vc usa é antiga demais, e vc precisa informar que está usando utf-8

Código: Selecionar todos

$conn = mysql_connect($server, $username, $password);
mysql_set_charset("UTF8", $conn);
Uma curiosidade que talvez ajude. A função abaixo retorna o encode que a sua conexão utiliza :

Código: Selecionar todos

echo mysql_client_encoding($conn);
Ela pode ser útil caso vc precise mandar strings em outros formatos como ISO. Vc usa essa função em tempo de desenvolvimento para ver se está ok.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação em banco de dados / PHP x Harbour

Mensagem por Vlademiro »

Como eu sei que vc usa mysql_connect() ?

Fiz uma busca no google pela função exqsqlking() e o google me retornou esse link abaixo com uma postagem sua onde vc mostra o fonte dela

https://pctoledo.org/forum/viewto ... 28&t=19382

Se vc não mudou nada nos últimos anos então deve colocar a função mysql_set_charset. Faça as alterações que eu coloquei no post anterior e testa.

Se não der certo coloca o resto do fonte para eu ver aqui amanhã.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Acentuação em banco de dados / PHP x Harbour

Mensagem por cjp »

Acho que vc realmente matou a charada!
Acresci a linha mysql_set_charset("UTF8", $conn); na exqsqlking, e o teste já funcionou.
Testei também em uma outra página que já tinha e que também dava problema, agora funcionou bem.
Ainda não testei em todas as páginas, mas parece que isso resolveu totalmente e facilmente o problema.
Muito obrigado.
Inacio de Carvalho Neto
Responder