Página 2 de 3

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

Enviado: 02 Mai 2023 20:59
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.

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

Enviado: 02 Mai 2023 21:00
por Vlademiro
Outra coisa. Se quiser incluir um a arquivo PHP reproduzindo o erro tb seria bom.

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

Enviado: 08 Mai 2023 22:38
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.

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

Enviado: 09 Mai 2023 00:04
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.

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

Enviado: 09 Mai 2023 10:29
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.

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

Enviado: 09 Mai 2023 18:52
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.

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

Enviado: 09 Mai 2023 20:28
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.

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

Enviado: 09 Mai 2023 22:26
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">

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

Enviado: 09 Mai 2023 22:29
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

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

Enviado: 10 Mai 2023 00:01
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.

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

Enviado: 10 Mai 2023 22:24
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.

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

Enviado: 10 Mai 2023 22:31
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.

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

Enviado: 10 Mai 2023 22:44
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.

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

Enviado: 10 Mai 2023 22:50
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ã.

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

Enviado: 12 Mai 2023 23:26
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.