Problem with accentuation in the return of PHP to Data Tables

Asked

Viewed 330 times

0

Hello. I am performing a query to the database, with php and mysql, and return the result of this query to Datatables (in the form of JSON) which lists this result in a table in my HTML.

The problem is I’m having trouble with accentuation when listing the result in HTML.

I’ve tried everything to format this data and I couldn’t. What makes it more difficult is that I do not have access to the return of this data in Javascript, because it is done automatically with the Data Tables library.

Could someone help me.

Follow the code below:

<?php

session_start();
require_once("../../conexao/conexao-com-banco.php");

$departamento_usuario_logado = $_SESSION["departamento-usuario"];
$usuario_logado = $_SESSION["nome"];
$administrador = $_SESSION["administrador"];
$supervisor = $_SESSION["supervisor"];


//Receber a requisão da pesquisa 
$requestData = $_REQUEST;

$empresa_origem = !empty($_POST["empresa_origem"]) ? filter_input(INPUT_POST, 'empresa_origem', FILTER_SANITIZE_STRING) : "";
$departamento = !empty($_POST["departamento"]) ? filter_input(INPUT_POST, 'departamento', FILTER_SANITIZE_STRING) : "";
$funcionario = !empty($_POST["responsavel"]) ? filter_input(INPUT_POST, 'responsavel', FILTER_SANITIZE_STRING) : "";
$cod_empresa = !empty($_POST["cod"]) ? filter_input(INPUT_POST, 'cod', FILTER_SANITIZE_STRING) : "";
$empresa = !empty($_POST["empresa"]) ? filter_input(INPUT_POST, 'empresa', FILTER_SANITIZE_STRING) : "";
$atividade = !empty($_POST["atividade"]) ? filter_input(INPUT_POST, 'atividade', FILTER_SANITIZE_STRING) : "";
$data_inicio = !empty($_POST["data_inicio"]) ? filter_input(INPUT_POST, 'data_inicio', FILTER_SANITIZE_STRING) : "";
$data_fim = !empty($_POST["data_fim"]) ? filter_input(INPUT_POST, 'data_fim', FILTER_SANITIZE_STRING) : "";


//Indice da coluna na tabela visualizar resultado => nome da coluna no banco de dados
$columns = array( 
	0 => 'responsavel',
	1 => 'empresas',
	2 =>'tipo_atividade', 
	3 => 'dt_vencimento',
	4 => 'enviado_por',
	5 => 'data_upload',
	6 => 'codigo'
);


if($data_inicio == "" || $data_fim == "")
{
	$query = "";	
}
else
{
	$query = " AND a.dt_vencimento BETWEEN '$data_inicio' AND '$data_fim'" ;
}

//Obtendo registros de número total sem qualquer pesquisa
$contadorderegistros ="

SELECT
a.tipo_atividade,a.dt_vencimento, b.enviado_por, b.data_upload, b.codigo
FROM
tbl_atividades AS a
INNER JOIN 
tbl_arquivos AS b
ON
a.codigo = b.codigo_atividade
WHERE
a.departamento like '%$departamento%' AND a.responsavel like '%$funcionario%' AND a.cod like '%$cod_empresa%' AND a.empresas like '%$empresa%' AND a.tipo_atividade like '%$atividade%' AND a.empresa_origem like '%$empresa_origem%' '$query'";
 


/*
if(!empty($classificacao))
	$contadorderegistros.= " and classificacao = '$classificacao'";
if(!empty($descricao))
	$contadorderegistros.= " and descricao = '$descricao'";
*/

$resultado_arquiv = mysqli_query($conecta, $contadorderegistros);
$qnt_linhas = mysqli_num_rows($resultado_arquiv);


//Obter os dados a serem apresentados
$dadosparapreenchimento = "
SELECT
a.responsavel,a.empresas,a.tipo_atividade,a.dt_vencimento,b.enviado_por, b.data_upload, b.codigo
FROM
tbl_atividades AS a
INNER JOIN 
tbl_arquivos AS b
ON
a.codigo = b.codigo_atividade 
WHERE
a.departamento like '%$departamento%' AND a.responsavel like '%$funcionario%' AND a.cod like '%$cod_empresa%' AND a.empresas like '%$empresa%' AND a.tipo_atividade like '%$atividade%' AND a.empresa_origem like '%$empresa_origem%' '$query'";

//echo $contadorderegistros;

//echo $dadosparapreenchimento;

if( !empty($requestData['search']['value']) ) {   // se houver um parâmetro de pesquisa, $requestData['search']['value'] contém o parâmetro de pesquisa
    $dadosparapreenchimento.=" and a.responsavel LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or a.empresas LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or a.tipo_atividade LIKE '%".$requestData['search']['value']."%' ";
	$dadosparapreenchimento.=" or a.dt_vencimento LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or b.enviado_por LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or b.data_upload LIKE '%".$requestData['search']['value']."%'";

	}


$resultado_arquivos = mysqli_query($conecta, $dadosparapreenchimento);
$totalFiltered = mysqli_num_rows($resultado_arquivos);

//Ordenar o resultado
$dadosparapreenchimento .= " ORDER BY ". $columns[$requestData['order'][0]['column']]."   ".$requestData['order'][0]['dir']."  LIMIT ".$requestData['start']." ,".$requestData['length']."   ";

//ACIMA, COMENTAMOS PARA COLOCAR O ORDER BY COM O NOSSO CRITÉRIO, QUE É A DATA DE UPLOAD (QUE ESTÁ NA QUERY ABAIXO)
//$dadosparapreenchimento .= " ORDER BY b.data_upload desc" . " LIMIT ".$requestData['start']." ,".$requestData['length']." " ;


$resultado_arquivos = mysqli_query($conecta, $dadosparapreenchimento);


// Ler e criar o array de dados
$dados = array();
while( $row_arquivo = mysqli_fetch_array($resultado_arquivos) ) {  
	$dado = array(); 
	$dado[] = utf8_encode($row_arquivo["responsavel"]);
	$dado[] =  utf8_encode(substr($row_arquivo["empresas"],0,40));
	$dado[] =  utf8_encode($row_arquivo["tipo_atividade"]);
	$dado[] =  date("m-Y", strtotime($row_arquivo["dt_vencimento"]));  //Importante usar o utf8 em campos que vão conter acento pois dara erro no JSON
	$dado[] = utf8_encode($row_arquivo["enviado_por"]);
	$dado[] = date("d-m-Y", strtotime($row_arquivo["data_upload"]));
	$dado[] = "<a class='btn btn-sm btn-primary' target='_blank' href=exibir-arquivo.php?codigo=" . $row_arquivo['codigo'] . "><i class='fas fa-cloud-download-alt'></i></a>";
	$dados[] = $dado;
}

//Cria o array de informações a serem retornadas para o Javascript
$json_data = array(
	"draw" => intval( $requestData['draw'] ),//para cada requisição é enviado um número como parâmetro
	"recordsTotal" => intval( $qnt_linhas ),  //Quantidade de registros que há no banco de dados
	"recordsFiltered" => intval( $totalFiltered ), //Total de registros quando houver pesquisa
	"data" => $dados   //Array de dados completo dos dados retornados da tabela 
);




echo json_encode($json_data);  //enviar dados como formato json

?>

HTML OUTPUT

inserir a descrição da imagem aqui

1 answer

0


Solved. I couldn’t understand why, but using utf8_encode() embracing utf8_decode(), which embraces the data coming from the database, worked.

If anyone knows why it worked, just comment here.

Look at the changed part of the code:

<?php

  // Ler e criar o array de dados
$dados = array();
while( $row_arquivo = mysqli_fetch_array($resultado_arquivos) ) {  
	$dado = array(); 
	$dado[] = utf8_encode(utf8_decode($row_arquivo["departamento"]));   //Importante usar o utf8 em campos que vão conter acento pois dara erro no JSON
	$dado[] = utf8_encode(utf8_decode($row_arquivo["cod"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["empresas"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["tributacao"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["responsavel"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["tipo_atividade"]));
	$dados[] = $dado;
}

?>

  • There is something very wrong, because it makes no sense to use ut8_decode and then utf8_encode again, I recommend you read this https://answall.com/a/43205/3635, working with Codecs has to be very careful and do step by step and set up the charset at all and save the files. php and . js, if any, with the right codec.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.