Criando um Validador TISS usando PHP

Neste posto irei ensinar como criar um validador TISS de arquivos XML  no padrão TISS da ANS, usando o PHP e banco de dados MySQL. Com o validador será possível validar os arquivos TISS e arquivos do monitoramento TISS.

Obs.: Vou escrever um passo a passo, mas é necessário ter noções básicas da linguagem PHP e banco MySQL.

Vou dividir o post nas seguintes etapas;

1ª Etapa -Criar o formulário HTML para envio do arquivo e seleção da versão

2ª Etapa – Verificar a estrutura do arquivo (que é a comparação com o arquivo XSD da ANS)

3ª Etapa – Validação dos dados do arquivo conforme a codificação da TUSS (Apenas para arquivos TISS)

4ª Etapa – Disponibilização dos arquivos para download e dica de instalação

E é claro, você poderá personalizar conforme a sua necessidade.

Antes de começarmos baixe os arquivos do padrão TISS no site da ANS, usando o link http://www.ans.gov.br/prestadores/tiss-troca-de-informacao-de-saude-suplementar, conforme os prints abaixo, ou clique aqui para baixar o último arquivo disponível (Componente de Comunicação 03.03.03)

Obs.: baixe todas as versões que queira utilizar no seu validador.

Usaremos também o arquivo bootstrap.min.css do Bootstrap (framework web CSS/JavaScript), baixe também neste link (https://getbootstrap.com) (deixarei no final todos os arquivos para download)

Iniciando o projeto crie a estrutura de pastas abaixo.

As pastas devem ser criadas no seu servidor httpd(Apache/IIS), dentro do diretório (www).

-validador-tiss (pasta principal)
–css
–xml (diretório para upload dos arquivos xml enviados)
–tiss (diretório com os arquivos baixados no site da ANS para validação TISS)
–tiss/03_03_03
–tiss/03_03_01
–tiss/03_02_02
–tiss/03_02_01
–tiss/03_02_00

1ª Etapa

Agora vamos criar nosso formulário para envio do arquivo e salvar com o nome index.php

Arquivo index.php

Observe que action do formulário aponta para (validar_arquivo.php), e temos um select para as versões dos XML.

 

<head>
<meta charset=”UTF-8″>
<title>Validador TISS</title>
<link rel=”stylesheet” href=”css/bootstrap.min.css“>
</head>

<body>

<div class=”container”>

<h1 >Validador TISS</h1>
<a class=”btn btn-lg ” href=”#seu-site” role=”button”>Validador de arquivos XML no padrão TISS</a>
<br>
<form id=”upload” name=”upload” enctype=”multipart/form-data” method=”post” action=”validar_arquivo.php“>

<div class=”form-group”>
<label for=”versao” class=”control-label”>Selecione a versão:</label>

<select name=”versao” class=”form-control”>
<option value=”tissV3_03_03.xsd” selected>TISS – 03.03.03</option>
<option value=”tissV3_03_02.xsd” >TISS – 03.03.02</option>
<option value=”tissV3_03_01.xsd” >TISS – 03.03.01</option>
<option value=”tissV3_03_00.xsd” >TISS – 03.03.00</option>
<option value=”tissV3_02_02.xsd” >TISS – 03.02.02</option>
<option value=”tissV3_02_01.xsd” >TISS – 03.02.01</option>
<option value=”tissV3_02_00.xsd” >TISS – 03.02.00</option>
<option value=”tissMonitoramentoV3_03_03“>Monitoramento TISS – 03.03.03</option>
<option value=”tissMonitoramentoV3_03_02“>Monitoramento TISS – 03.03.02</option>
<option value=”tissMonitoramentoV3_03_01“>Monitoramento TISS – 03.03.01</option>
<option value=”tissMonitoramentoV3_03_00“>Monitoramento TISS – 03.03.00</option>
<option value=”tissMonitoramentoV3_02_02“>Monitoramento TISS – 03.02.02</option>
<option value=”tissMonitoramentoV3_02_01“>Monitoramento TISS – 03.02.01</option>
<option value=”tissMonitoramentoV3_02_00“>Monitoramento TISS – 03.02.00</option>

</select>
</label>
</div>

<div class=”form-group”>
<label for=”arquivo_xml” class=”control-label”>Selecione o arquivo (XML) para validação</label>
<input id=”arquivo_xml” name=”arquivo_xml” type=”file” class=”form-control-file” placeholder=”Selecione o arquivo XML para validaçaõ…” />
</div>

<button type=”submit” class=”btn btn-primary”>Validar Arquivo</button>
</form>

</div>
</body>

A página ficará com o layout abaixo;

Agora copie todos os arquivos que baixou no site da ANS e coloque dentro da pasta (tiss), ficando da seguinte forma:

tiss/03_03_03
tiss/03_03_02
tiss/03_03_01
tiss/03_03_00
tiss/03_02_02
tiss/03_02_01
tiss/03_02_00

 

2ª Etapa

Crie um arquivo com o nome function_erros_xml.php

<?php
function display_xml_error($error, $xml)
{
    //$return  = $xml[$error->line - 1] . "\n";
    //$return .= str_repeat('-', $error->column) . "^\n";
  
    $return  = $xml[$error->line - 1] . "";
    //$return .= str_repeat('-', $error->column) . "";
	$return .= str_repeat('', $error->column) . "";
	
    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "Warning $error->code: ";
            break;
         case LIBXML_ERR_ERROR:
            $return .= "Error $error->code: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "Fatal Error $error->code: ";
            break;
    }

    $return .= trim($error->message) .
               "
  Linha: $error->line" .
               "
  Coluna: $error->column";

   // if ($error->file) {
   //     $return .= "
  Arquivo: $error->file";
   // }

    //return "$return\n\n-----\n\n";
	return "$return";
}

Nesta etapa vamos criar o arquivo para receber os dados do formulário, que será responsável pelo upload do arquivo, leitura e comparação com o XSD(arquivo copiado acima do site da ANS)

Arquivo validar_arquivo.php

vamos criar a estrutura HTML básica do nosso arquivo.

 

Validador TISS

Validador de arquivos XML no padrão TISS

 

 

Com o código acima teremos o seguinte layout

Verificamos se foi realizado envio do formulário e obtendo a versão selecionada usando um IF

<?php
/**
* Validador TISS
*
* Validador de arquivos XML no padrão TISS
*
* @author Fabiano Bento <eu@fabianobento.com.br>
* @link http://fabianobento.com.br/
*
* @version 1.1
*/


global $_VT;

$_VT['diretorio_tiss'] = 'tiss/'; //diretorio dos arquivos XSD
$_VT['diretorio_upload'] = "xml/"; //diretório para salvarmos os arquivos enviados
$_VT['ds_arquivo'] = date('Y-m-d-H-i-s'); //variavel para cocatermos ao nome do arquivo

if( (isset($_POST['versao'])) && ( $_FILES['arquivo_xml']['name'] != '') ) {

//Declaramos as variáveis enviadas pelo método POST

$versao_arquivo = $_POST['versao'];
$nome_arquivo = basename($_FILES['arquivo_xml']['name']);
 

//Agora criamos um CASE para verificar, validar a escolha de versão e pegarmos o diretório dos arquivos XSD da TISS.

switch ($versao_arquivo) {

//TISS - 03.03.03
case "tissV3_03_03.xsd":
$versao_arquivo_txt = 'TISS 3.03.03';
$versao = '03_03_03/tissV3_03_03.xsd'; 
break;

//TISS - 03.03.01
case "tissV3_03_01.xsd":
$versao_arquivo_txt = 'TISS 3.03.01';
$versao = '03_03_01/tissV3_03_01.xsd'; 
break;
//TISS - 03.02.02
case "tissV3_02_02.xsd":
$versao_arquivo_txt = 'TISS 3.02.02';
$versao = '03_02_02/tissV3_02_02.xsd'; 
break;

//TISS - 03.02.01
case "tissV3_02_01.xsd":
$versao_arquivo_txt = 'TISS 3.02.01';
$versao = '03_02_01/tissV3_02_01.xsd'; 
break;

//TISS - 03.02.00
case "tissV3_02_00.xsd":
$versao_arquivo_txt = 'TISS 3.02.00';
$versao = '03_02_00/tissV3_02_00.xsd';
break;

}


//agora faremos o upload do arquivo para o diretório (xml)
$uploadfile = $_VT['diretorio_upload'] . $_VT['ds_arquivo'] . '_' . basename($_FILES['arquivo_xml']['name']);

//copia o arquivo do computador para o servidor
if(!move_uploaded_file($_FILES['arquivo_xml']['tmp_name'], $uploadfile)){

		echo "falha ao carregar arquivo!";
      }else {
                echo "Arquivo enviado com sucesso.  Iniciando análise..."; 
echo "Versão Selecionada: ". $versao_arquivo_txt ." Arquivo: ". $nome_arquivo.""; }

 

Após o upload do arquivo fazemos a comparação com o XSD usando a classe DomDocument

Nesta etapa vamos analisar se o arquivo XML enviado está de acordo com a estrutura do XSD. Pegamos a versão selecionada no formulário, o arquivo no diretório onde foi feito o upload e a comparação. Em seguida armazenamos todos os erros (se houver) em uma variável. E como resultado se o arquivo está de acordo o padrão ou não e quais erros encontrados.

O código abaixo deverá ser incluído abaixo do comentário “aqui vai o código da validação da estrutura”

libxml_use_internal_errors(true);

/* Cria um novo objeto da classe DomDocument */
$objDom = new DomDocument();

/* Carrega o arquivo XML */
$objDom->load($uploadfile);

/* Tenta validar os dados utilizando o arquivo XSD */

// seleciona a versao correspondente
$versao_tiss = $_VT['diretorio_tiss'] . $versao;
if (!$objDom->schemaValidate($versao_tiss)) { 

/**
* Se não foi possível validar, capturamos
* todos os erros em um array
*/
$arrayAllErrors = libxml_get_errors();

/**/
$xmlstr = $objDom->load($uploadfile);
$doc = simplexml_load_string($xmlstr);
$xml = explode("\n", $xmlstr);

require_once('function_erros_xml.php');

if (!$doc) {
$errors = libxml_get_errors();

echo "Arquivo inválido:  O arquivo não segue a estrutura definida pela ANS.";
 echo "

 

3ª Etapa

Esta etapa não é obrigatória, mas é a cereja do bolo, digo validador =), pois através desta parte podemos fazer a validação dos dados contidos dentro de cada TAG do XML, ou seja, se os códigos de procedimentos e tabelas estão seguindo o padrão TUSS determinado pela ANS.

Utilizaremos o banco de dados MySQL, pois precisamos armazenar os dados da codificação TUSS. Para criar e configurar o banco você pode usar qualquer programa, segue alguns; MySQL WorkBench, MySQL Front, PHPMyAdmin(Na hospedagem do site).

Vou dividir esta etapa nas seguintes partes(A, B, C, D, E, F);

A-Criação do banco de dados
B-Tabelas do banco
C-Importando os dados para as tabelas
D-Criando as rotinas no banco (functions / procedures)
E-Conexão com o banco de dados MySQL
F-Alteração no arquivo validar_arquivo.php para fazer a leitura dos dados

Vamos começar!

Não vou ficar detalhando(explicando) cada comando SQL, basicamente iremos criar as tabelas conforme a estrutura de representação da ANS/TUSS.

A – Criação do banco de dados

1
CREATE DATABASE validador

B – Criação das tabelas que serão utilizadas

Observe que junto defini o atributo cd_termo como chave para indexação dos dados, assim temos otimização na leitura/busca.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--
-- Estrutura da tabela `tabela_18_diaria_taxa_gase`
--
 
CREATE TABLE IF NOT EXISTS `tabela_18_diaria_taxa_gase` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DS_TERMO_DETALHADO` text,
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_19_opme`
--
 
CREATE TABLE IF NOT EXISTS `tabela_19_opme` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(4000) NOT NULL,
`DS_REF_FABRICANTE` VARCHAR(4000) DEFAULT NULL,
`DS_FABRICANTE` VARCHAR(4000),
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_20_medicamento`
--
 
CREATE TABLE IF NOT EXISTS `tabela_20_medicamento` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DS_APRESENTACAO` text,
`DS_LABORATORIO` text,
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_22_procedimentos`
--
 
CREATE TABLE IF NOT EXISTS `tabela_22_procedimentos` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DS_TERMO_DETALHADO` text NOT NULL,
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`),
KEY `CD_TERMO_2` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_24_cbo`
--
 
CREATE TABLE IF NOT EXISTS `tabela_24_cbo` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`NR_SEQ_VERSAO_TISS` INT(11) NOT NULL,
`CD_TERMO` VARCHAR(20) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DT_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=144 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tiss_versao`
--
 
CREATE TABLE IF NOT EXISTS `tiss_versao` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_VERSAO` VARCHAR(20) NOT NULL,
`CD_VERSAO_MASCARA` VARCHAR(40) NOT NULL,
`DT_VERSAO` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
 
--
-- Extraindo dados da tabela `tiss_versao`
--
 
INSERT INTO `tiss_versao` (`NR_SEQUENCIA`, `CD_VERSAO`, `CD_VERSAO_MASCARA`, `DT_VERSAO`) VALUES
(1, '030200', '03.02.00', '2016-01-26'),
(2, '030201', '03.02.01', '2016-02-10'),
(3, '030202', '03.02.02', '2016-05-01'),
(4, '030300', '03.03.00', '2016-06-01'),
(5, '030301', '03.03.01', '2016-10-01'),
(6, '030302', '03.03.02', '2017-04-10'),
(7, '030303', '03.03.03', '2018-01-01');

C – Importando os dados para as tabelas

Baixe os arquivos para importar os dados nas tabelas. Para iniciar o download, clique sobre os nomes de cada tabela.

-> tabela_18_diaria_taxa_gase

-> tabela_19_opme

-> tabela_20_medicamento

-> tabela_22_procedimentos

-> tabela_24_cbo

-> tiss_versao

Execute/importe os arquivos utilizando seu programa de gerenciamento de banco de dados recomendo o( WorkBench) é rápido e gera bons logs, se for instalar junto com seu site, utilize o PHPmyAdmin para importar(pois também é eficiente e rápido(se for online).

Dica: Caso esteja utilizando algum pacote de instalação como o Wampserver, Easyphp, entre outros, será necessário ajustar a configuração do MySQL para importar grandes arquivos SQL. Encontre no diretório de instalação dos arquivos;

MySQL -> my.ini

max_allowed_packet = 512M (ou 1024M)
read_buffer_size = 1024K (ou 2048K)

PHP -> php.ini

max_input_time = 1800 (ou 2600)
memory_limit = 128M (ou 256M)

(D) Criação da View e Function MySQL para consulta

Vamos criar uma function para fazer a consulta e comparação se determinado código do procedimento/material/medicamento/opme, existe nas tabelas da TUSS/TISS, lembrando que vamos comparar de acordo a tabela do arquivo (5 brasíndice, simpro, 00 própria)

Como temos várias tabelas separadas, Procedimentos, taxas, materiais, medicamentos vamos criar uma VIEW para unir e facilitar a consuta.

DROP VIEW IF EXISTS `tabela_tiss_tuss`$$

CREATE  VIEW `tabela_tiss_tuss` AS

SELECT 22 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_22_procedimento` `a`

UNION ALL

SELECT 18 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_18_diaria_taxa_gase` `a`

UNION ALL

SELECT 19 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_19_opme` `a`

UNION ALL

SELECT 5 AS `05`,`a`.`NUM_TISS` AS `num_tiss`,CONCAT(`a`.`MED_DESC`,`a`.`APR_DESC`) AS `ds_item` FROM `tabela_brasindice` `a`$$

DELIMITER ;

Criação da Function – O objetivo da function é verificar se o procedimento, taxa, mat/med existe na tabela indicada.

DELIMITER $$

USE `validador`$$

DROP FUNCTION IF EXISTS `obter_se_item_existe`$$

CREATE DEFINER=`validador`@`%` FUNCTION `obter_se_item_existe`(
st_tipo_item_e CHAR(3),
cd_tabela_e INT(11),
cd_item_e INT(11)

) RETURNS VARCHAR(50) CHARSET latin1
DETERMINISTIC
BEGIN

DECLARE st_item_existe_r VARCHAR(150);

IF (cd_tabela_e IS NOT NULL) THEN

IF (cd_item_e IS NOT NULL) THEN

SELECT
IFNULL(MAX(p.cd_termo),0),
INTO st_item_existe_r
FROM tabela_tiss_tuss p
WHERE p.cd_termo = cd_item_e
AND p.cd_tabela = cd_tabela_e
;
END IF;
END IF;

RETURN st_item_existe_r;

END$$

DELIMITER ;

(E) – Conexão com o banco de dados

Agora vamos criar o arquivo de conexão com o banco de dados, para consultar os dados importados, será um arquivo bem simples.

conectadb.inc.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
 
//chamaremos a classe de "conexão"
 
class conexao {
 
//declaração das variáveis e informações de conexão com o banco
 
var $host_mysql = "localhost"; // Nome ou IP do Servidor
var $user_mysql = "root"; // Usuário do Servidor MySQL
var $senha_mysql = ""; // Senha do Usuário MySQL
var $db_mysql = "validador"; // Nome do seu Banco de Dados
 
 
 function conecta(){
        $this->link = @mysql_connect($this->host,$this->user,$this->senha);
    // Conecta ao Banco de Dados
        if(!$this->link){
      // Caso ocorra um erro, exibe uma mensagem com o erro
            print "Ocorreu um Erro na conexão MySQL:";
      print "<b>".mysql_error()."</b>";
      die();
        }elseif(!mysql_select_db($this->dbase,$this->link)){
      // Seleciona o banco após a conexão
      // Caso ocorra um erro, exibe uma mensagem com o erro
            print "Ocorreu um Erro em selecionar o Banco:";
      print "<b>".mysql_error()."</b>";
      die();
        }
    }
 
   function sql_query($query){
        $this->conecta();
        $this->query = $query;
  if($this->resultado = mysql_query($this->query)){
            $this->desconecta();
            return $this->resultado;
        }else{
      // Caso ocorra um erro, exibe uma mensagem com o Erro
            print "Ocorreu um erro ao executar a Query MySQL: <b>ERRO INTERNO</b>"; //$query
      print "<br><br>";
      print "Erro no MySQL: <b>".mysql_error()."</b>";
      die();
            $this->desconecta();
        }        
    }
 function desconecta(){
        return mysql_close($this->link);
    }
}

(F)Alteração no arquivo validar_arquivo.php 

Agora vamos fazer as alterações em nosso arquivo chamado “validar_arquivo.php”, com a chamada da conexão com o banco  e comparação.

 

 

4ª Etapa –  Download dos arquivos e instalação

Estou deixando este link para download de um RAR com os arquivos deste artigo.

Clique aqui para Baixar todos os arquivos

 

Você pode fazer a instalação do Validador TISS em qualquer computador rede local, usando o (Apache, PHP, MySQL), para facilitar a instalação e configuração utilize os famosos pacotes que já são pré configurado.

Obs.: Usando sua rede local, instale apenas em 1 computador e acesse a partir do navegador (ip local) http://192.168.1.xxx/validador

Ou instale junto ao site da sua empresa (criando o diretório chamado (validador) http://seu-site.com/validador

Windows (Qualquer versão)WAMP, EASY PHP, XAMMP,

Linux – CentOS/RedHat (Instale os pacotes usando o comando #yum -y install httpd php php-mysql mysqld mysql-server

 

 

8 Thoughts on “Criando um Validador TISS usando PHP

  1. Franklin Silva on 3 de abril de 2018 at 17:12 said:

    Fabiano, muito bom o seu artigo, porém ainda falta alguns trechos de código, por exemplo não foi informado o arquivo: function_erros_xml.php e também a alteração a ser feita no arquivo: validar_arquivo.php

    pode passar o restante do código?

  2. Franklin on 5 de abril de 2018 at 11:48 said:

    Muito bom Fabiano.

    Faltando agora apenas o validar_arquivo.php da etapa 3 (F).

  3. Ótimo artigo Fabiano, parabéns!!!

    Poderia passar o link dos Arquivos por favor Amigo?

    Iria me ajudar muito… Desde já agradeço!

  4. Bom dia Bento, ótimo tutorial.

    Alguns links de download não estão funcionando.

    Abcs

  5. Os links para downloads foram corrigidos.

  6. João Marcos on 23 de agosto de 2018 at 21:56 said:

    Boa noite Bento, Parabéns pelo seu trabalho!
    Você pode me enviar o projeto completo do validador que está rodando no seu site?

    Não conseguir implementar a totalidade do tutorial porque não localizei a Alteração no arquivo validar_arquivo.php.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Post Navigation