Vou fazer um artigo no qual recebo várias perguntas: Como gerar arquivos XML no padrão TISS da ANS.  Vou demonstrar usando PHP e API DOM nesta primeira parte e futuramente complementarei com dados a partir de banco de dados MySQL.

O padrão TISS é determinado pela ANS, você poderá consultar outras informações do padrão TISS no site da Agência Nacional de Saúde.

Para seguir, é necessário ter noções básicas da linguagem PHP.

Obs.: Não vou ensinar como desenvolver um sistema com a finalidade de faturamento, apenas o passo a passo da geração do XML no padrão TISS usando o PHP e a biblioteca DOM.

A geração do XML consiste em dados dos pilares: Operadora de Saúde <-> Prestador de Serviços <-> Beneficiários/Segurados,  ou seja, precisamos das informações de credenciamento do prestador de saúde,  dados do prestador e do segurado. Abaixo uma exemplificação dos dados;

Dados da operadora:
Registro ANS: 1111
Versão TISS: 03.03.03

Dados do Prestador:
Código de Credenciamento: 12345
CNPJ: 00.000.000/0000-0 (Fictício)

Dados de faturamento:
Número da remessa/fatura/Lote: 123

Dados do atendimento:
Data e Hora: 03/04/2018 22:15:00
Nome: Fulano de Tal
Carteira: 4444444444444444
Validade da carteira: 31/12/2030
Recém nascido: Não
Tipo de Atendimento: Ambulatorial
Caráter do atendimento: Eletivo
Guia/Senha: 1111/2222

Médico: Dr. Fabiano
CRM: 0000
CBOS:

Código da tabela: 22
Procedimento TUSS: 10101012
Descrição do Procedimento: Consulta em consultório
Valor unitário: 500,00
Valor Total:  500,00

 

<?php
#Definindo as variáveis

#Dados Operadora:
$_XML['versao_tiss']='030303';
$_XML['registro_ans'] = '1111';

#Dados Prestador:
$_XML['codigo_credenciamento'] = '12345';
$_XML['cnpj'] = '0000000000000';
$_XML['prestador'] = 'Hospital ABCD';

#Dados do atendimento e beneficiário
$_XML['data_hora'] = '03/04/2018 22:15:00';
$_XML['rn'] = 'N'; #Não 
$_XML['tipo_atd'] = 'Ambulatorial'; 
$_XML['carater'] = 'E'; #Eletivo 
$_XML['guia'] = '1111'; 
$_XML['senha'] = '2222'; 
$_XML['medico'] = 'Dr. Fabiano'; 
$_XML['crm'] = '0000'; 
$_XML['cbos'] = '';
#Dados do beneficiário
$_XML['nome'] = 'Fulano de Tal';
$_XML['dt_nascimento'] = '01/01/1980';
$_XML['carteira']  = '4444444444444444';
$_XML['validade'] = '31/12/2030';

#Dados da Fatura / Lote
$_XML['fatura_remessa'] = '123';

#Dados do procedimento realizado
$_XML['tabela'] = '22';
$_XML['procedimento_tuss'] = '10101012';
$_XML['descricao_proced'] = 'Consulta em consultório';
$_XML['valor_unitario'] = '500,00';
$_XML['qtde'] = '1';
$_XML['valor_total'] = '500,00';

$_XML['tipoTransacao'] = 'ENVIO_LOTE_GUIAS';
$_XML['sequencialTransacao'] = '6658';
$_XML['dataRegistroTransacao'] = '2018-01-18';
$_XML['horaRegistroTransacao'] = '10:00:00';

$_XML['hash'] = 'calculo do HASH';

//$_XML[''] = ''; // para criar novas variáveis apenas siga o padrão

Após a declaração das variáveis, vamos iniciar a geração da estrutura no nosso arquivo.

 

#versao XML e codificação
$dom = new DOMDocument("1.0", "ISO-8859-1"); 
//também poderia ser UTF-8
 
#remove os espacos em branco
$dom->preserveWhiteSpace = false;

#Realizar a quebra dos blocos do XML por linha
$xml->formatOutput = true;

		//Criação dos elementos do Namespace ans:mensagemTISS
		$xml->createAttributeNS( 'http://www.w3.org/2000/09/xmldsig#', 'ds:attr' );
		$xml->createAttributeNS( 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:attr' );
		$xml->createAttributeNS( 'http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_03_01.xsd', 'schemaLocation:attr' );
		$xml->createAttributeNS( 'http://www.ans.gov.br/padroes/tiss/schemas', 'ans:attr' );
        
        
// Nó / Bloco Principal
// ans:mensagemTISS
$mensagemTISS = $xml->createElement("ans:mensagemTISS");
$xml->appendChild($mensagemTISS);

	/* primeiro bloco */
	// ans:mensagemTISS / ans:cabecalho
	$cabecalho = $xml->createElement("ans:cabecalho");
	$mensagemTISS->appendChild($cabecalho);
	
	
		// ans:mensagemTISS / ans:cabecalho / ans:identificacaoTransacao
		$identificacaoTransacao = $xml->createElement("ans:identificacaoTransacao");
		$cabecalho->appendChild($identificacaoTransacao);
		
				# ans:tipoTransacao
				$tipoTransacao = $xml->createElement("ans:tipoTransacao", $_XML['tipoTransacao']);
				$identificacaoTransacao->appendChild($tipoTransacao);
				
				#sequencialTransacao
				$sequencialTransacao = $xml->createElement("ans:sequencialTransacao", $_XML['sequencialTransacao']);
				$identificacaoTransacao->appendChild($sequencialTransacao);

				#dataRegistroTransacao
				$dataRegistroTransacao = $xml->createElement("ans:dataRegistroTransacao", $_XML['dataRegistroTransacao']);
				$identificacaoTransacao->appendChild($dataRegistroTransacao);

				#horaRegistroTransacao
				$horaRegistroTransacao = $xml->createElement("ans:horaRegistroTransacao", $_XML['horaRegistroTransacao']);
				$identificacaoTransacao->appendChild($horaRegistroTransacao);
			
		
		// ans:mensagemTISS / ans:cabecalho / ans:origem
		$origem = $xml->createElement("ans:origem");
		$cabecalho->appendChild($origem);
		
				// ans:mensagemTISS / ans:cabecalho / ans:origem / identificacaoPrestador
				$identificacaoPrestador = $xml->createElement("ans:identificacaoPrestador", $_XML['cnpj']);
				$origem->appendChild($identificacaoPrestador);
				
		
		// ans:mensagemTISS / ans:cabecalho / ans:destino
		$destino = $xml->createElement("ans:destino");
		$cabecalho->appendChild($destino);
		
				// ans:mensagemTISS / ans:cabecalho / ans:registroANS
				$registroANS = $xml->createElement("ans:registroANS", $_XML['registro_ans']);
				$destino->appendChild($registroANS);
		
		// ans:mensagemTISS / ans:cabecalho / ans:Padrao
		$Padrao = $xml->createElement("ans:Padrao", $_XML['padrao_tiss']);
		$cabecalho->appendChild($Padrao);
	
	
	/* segundo bloco */
	// ans:mensagemTISS / ans:prestadorParaOperadora
	$prestadorParaOperadora = $xml->createElement("ans:prestadorParaOperadora");
	$mensagemTISS->appendChild($prestadorParaOperadora);
	
		// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias
		$loteGuias = $xml->createElement("ans:loteGuias");
		$prestadorParaOperadora->appendChild($loteGuias);		

			// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / numeroLote
			$numeroLote = $xml->createElement("ans:numeroLote", $_XML['lote_remessa']);
			$loteGuias->appendChild($numeroLote);	
 
 			// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / guiasTISS
			$guiasTISS = $xml->createElement("ans:guiasTISS");
			$loteGuias->appendChild($guiasTISS);	
			
	/* terceiro bloco */
	// ans:mensagemTISS / ans:epilogo
	$epilogo = $xml->createElement("ans:epilogo");
	$mensagemTISS->appendChild($epilogo);
	
		// ans:mensagemTISS / ans:epilogo / ans:hash
		$hash = $xml->createElement("ans:hash", $_XML['hash']);
		$epilogo->appendChild($hash);	
		

# Comando para salvar/gerar o arquivo XML TISS
$xml->save("xml_tiss.xml");

# Imprime / Gera o xml em tela
echo $xml->saveXML();
?>

Com o comando acima você terá o seguinte retorno: xml_tiss.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<ans:mensagemTISS xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_03_01.xsd" 
xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
 <ans:cabecalho>
 <ans:identificacaoTransacao>
 <ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
 <ans:sequencialTransacao>6658</ans:sequencialTransacao>
 <ans:dataRegistroTransacao>2018-01-18</ans:dataRegistroTransacao>
 <ans:horaRegistroTransacao>10:00:00</ans:horaRegistroTransacao>
 </ans:identificacaoTransacao>
 <ans:origem>
 <ans:identificacaoPrestador>0000000000000</ans:identificacaoPrestador>
 </ans:origem>
 <ans:destino>
 <ans:registroANS>111111</ans:registroANS>
 </ans:destino>
 <ans:Padrao>03.03.03</ans:Padrao>
 </ans:cabecalho>
 <ans:prestadorParaOperadora>
 <ans:loteGuias>
 <ans:numeroLote>123</ans:numeroLote>
 <ans:guiasTISS/>
 </ans:loteGuias>
 </ans:prestadorParaOperadora>
 <ans:epilogo>
 <ans:hash>calculo do HASH</ans:hash>
 </ans:epilogo>
</ans:mensagemTISS>

 

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

 

Read More →

Hoje vou mostrar como configurar o wamp server e preparar o ambiente de trabalho.

Testes realizados com o WAMP 2.4

WampServer 2.4  – Windows  32 Bits

Apache     : 2.4.4
MySQL      : 5.6.12
PHP          : 5.4.16
PHPMyAdmin : 4.0.4
SqlBuddy   : 1.3.3
XDebug     : 2.2.3

Link para download:

http://sourceforge.net/projects/wampserver/files/WampServer%202/Wampserver%202.4/

Para trabalhar com vhosts temos que adicionar no arquivo hosts os alias com o nome do computador e os sites que você irá trabalhar, segue exemplo abaixo;

C:\Windows\System32\drivers\etc\hosts

127.0.0.1       localhost
127.0.0.1        nome-pc
127.0.0.1        meusite.local
127.0.0.1        meusite.dev

Na sequencia precisamos configurar o Apache para trabalhar com vhosts.

Localizar o arquivo httpd.conf

C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf

Descomentar as linhas abaixo

#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so

#Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-vhosts.conf

#LoadModule rewrite_module modules/mod_rewrite.so
LoadModule rewrite_module modules/mod_rewrite.so

 

Agora iremos editar o arquivo httpd-vhosts.conf, adicionando os alias de domínios que informamos no arquivo hosts.

C:\wamp\bin\apache\Apache2.4.4\conf\extra\httpd-vhosts.conf

Acrescentar as linhas abaixo

<VirtualHost localhost:80>
ServerAdmin mail@mail.com
DocumentRoot “C:/wamp/www”
ServerName localhost
ServerAlias localhost
ErrorLog “logs/localhost-error.log”
CustomLog “logs/localhost-access.log” common
</VirtualHost>

<VirtualHost nome-pc:80>
ServerAdmin mail@mail.com
DocumentRoot “C:/wamp/www”
ServerName nome-pc
ServerAlias nome-pc
ErrorLog “logs/nome-pc-error.log”
CustomLog “logs/nome-pc-access.log” common
</VirtualHost>

 

<VirtualHost meusite.local:80>
ServerAdmin mail@mail.com
DocumentRoot “C:/wamp/www/meusite.local”
ServerName meusite.local
ServerAlias meusite.local
ErrorLog “logs/meusite.local-error.log”
CustomLog “logs/meusite.local-access.log” common
</VirtualHost>

 

<VirtualHost meusite.dev:80>
ServerAdmin mail@mail.com
DocumentRoot “C:/wamp/www/meusite.dev”
ServerName meusite.dev
ServerAlias meusite.dev
ErrorLog “logs/meusite.dev-error.log”
CustomLog “logs/meusite.dev-access.log” common
</VirtualHost>

Após acrescentar os dados,  salvar o arquivo e reiniciar os serviços do wamp server, e acessar os endereços configurados;

http://localhost

wamp-img

http://meusite.dev

http://meusite.local

 

Como instalar Apache, MySQL e PHP (LAMP) no CentOS 6.3
30/09/2012

Neste artigo vou descrever a maneira mais simples e rapida para configurar um servidor LAMP Apache, MySQL e PHP

Instalar o Apache

yum install httpd

instalar MySQL

yum install mysql-server

Iniciar o serviço do MySQL
service mysqld start

mysql_secure_installation

yum install php php-mysql

chkconfig httpd on
chkconfig mysqld on

service http start

Acessar pasta tmp

cd /tmp

1- Download
64 bit
wget http://www.zvps.co.uk/downloads/centos/10-1-0/installer-10-1-0-centos-64.sh.x.tar.gz
32
wget http://www.zvps.co.uk/downloads/centos/10-1-0/installer-10-1-0-centos-32.sh.x.tar.gz

2- Descompactar
64 bit
tar -xf installer-10-1-0-centos-64.sh.x.tar.gz

32 bit
tar -xf installer-10-1-0-centos-32.sh.x.tar.gz

3- permissão
64 bit
chmod +x installer-10-1-0-centos-64.sh.x

32 bit
chmod +x installer-10-1-0-centos-32.sh.x

4-Pré requisitos

yum install ld-linux.so.2 curl

5-Instalando
64 bit
./installer-10-1-0-centos-64.sh.x

32 bit
./installer-10-1-0-centos-32.sh.x

America/Sao_Paulo
server.fabianobento.com.br
y

Após a instalação acess o diretório root, e abra o arquivo passwords.txt para ver os dados de acesso.

Caso perca a senha do

Login to your SSH console or open a console windows if you have physical acces to your server, then type in:
http://docs.zpanelcp.com/?node=43
setzadmin –set new-password

Links:

Informações:http://docs.zpanelcp.com/?node=7
Desinstalar: forums.zpanelcp.com/thread-4648.html
http://www.zpanelcp.com/download/
http://www.zvps.co.uk/zpanelcp/centos-6
http://www.php.net/manual/pt_BR/timezones.america.php

http://www.google.com.br/#biw=1280&bih=852&sclient=psy-ab&q=instalar+zpanel+centos&oq=instalar+zpanel+centos&gs_l=hp.3..0i13i30l3j0i10i30.1043.6089.0.6177.24.24.0.0.0.0.312.5315.2-22j1.23.0…0.0…1c.1.16.psy-ab.BNtvjnemK5Q&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47534661,d.dmg&fp=9034b8c58fa6c127

Arquivo db/conexao.php

/*
arquivo de conexão com o banco
bd/conexao.php
*/
$host = "localhost";
$database = "enquete";
$login_db = "root";
$senha_db = "";
$conexao = mysql_connect ($host, $login_db, $senha_db) or die (mysql_error());
$db = mysql_select_db($database);

arquivo enquete.php


 
= '$data' LIMIT 1"; $limite_enquete = mysql_query("$sql_enquete"); $row_enquete = mysql_num_rows($limite_enquete); if ($row_enquete != 1){ echo "Neste momento, não existe enquete para votação!"; }else { $dados_enquete=mysql_fetch_array($limite_enquete); $cod_enquete = $dados_enquete['CD_ENQUETE']; $DtInicio = $dados_enquete['DT_INICIO']; $arrayinicio = explode('-', $DtInicio); $DtInicio_dta = $arrayinicio[0]; $DtInicio_dtm = $arrayinicio[1]; $DtInicio_dtd = $arrayinicio[2]; $DtFinal = $dados_enquete['DT_FIM']; $arrayfinal = explode('-', $DtFinal); $DtFinal_dta = $arrayfinal[0]; $DtFinal_dtm = $arrayfinal[1]; $DtFinal_dtd = $arrayfinal[2]; $nome_enquete = $dados_enquete['NM_ENQUETE']; echo '
Inicio da enquete:' . $DtInicio_dtd."/".$DtInicio_dtm."/".$DtInicio_dta; echo '
Fim da enquete:' . $DtFinal_dtd."/".$DtFinal_dtm."/".$DtFinal_dta; $pergunta_enquete = $dados_enquete['DS_PERGUNTA']; echo '
' . ucfirst($nome_enquete); echo '
'; echo '
' . ucfirst($pergunta_enquete); echo '
'; $limite_opcoes = mysql_query("SELECT * FROM `enquete_opcoes` WHERE `CD_ENQUETE` = ".$cod_enquete.""); while ($dados_opcao =mysql_fetch_array($limite_opcoes)){ $NR_SEQUENCIA = $dados_opcao['NR_OPCAO']; $DS_OPCAO = $dados_opcao['DS_OPCAO']; echo " $DS_OPCAO
"; } } ?> Resultado parcial

Ficará como a imagem abaixo.

arquivo_enquete

arquivo enquete-salvar-voto.php


require('db/conexao.php');


				$resultado = $_POST['enquete'];

				if($resultado==""){
echo "nenhuma opção foi selecionada.";
				exit;
				}else {

				$data_envio		= date('Y-m-d');
				$hora_envio		= strftime("%H:%M:%S");
				$ip_envio		= getenv('REMOTE_ADDR');

				$cod_enquete = $_POST['cod_enquete'];

				 mysql_query("INSERT INTO  `enquete_logs` (`NR_SEQUENCIA`, `CD_ENQUETE`, `NR_OPCAO`, `DT_ENVIO`,`NR_IP`) VALUES ('NULL',  '$cod_enquete', '$resultado', CURRENT_TIMESTAMP ,  '$ip_envio');");


				echo "obrigado pelo voto!";

				}

Editado em 01/05/2013 19:20h
Desenvolvendo um sistema de enquete (Novo) PHP/MySQL Parte 1 (Planejamento)

A pedido de alguns de visitantes estou reformulando o tutorial antigo de enquete.
O primeiro passo é definirmos a estrutura que iremos trabalhar. Esta estapa é um levantamento das informações que vamos precisar.
Este será um sistema para enquetes com ilimitadas opções, sendo que no tutorial anterior eu havia criado o banco de dados com varias colunas, porém não é o ideal, pois não devemos ter colunas na tabela que não serão utilizadas.

Na segunda parte, estarei fazendo um código mais simplificado pois o foco deste tutorial é trabalhar mais o conceito da enquete.

Abaixo vou colocar o código das tabelas do banco e irei explicar o que será armazenado em cada uma.

Para entender o porque usei algumas siglas nas colunas, sugiro a leitura do Artigo:
Padrões para Nomenclatura em um banco de dados
http://blog.fabianobento.com.br/2011/09/padroes-para-nomenclatura-em-um-banco-de-dados/

Diagrama
diagram_enquete
Começando pela tabela das perguntas.

Precisamos, de um código para a enquete, a data do cadastro para sabermos quando foi cadastrada. Eu coloquei a coluna DT_INICIO, DT_FIM, para configuramos no código fonte quando a enquete será iniciada e encerrada, desta forma não seria necessário acessar o painel de controle para esta tarefa.

CREATE TABLE IF NOT EXISTS `enquete_perguntas` (
  `CD_ENQUETE` int(11) NOT NULL AUTO_INCREMENT COMMENT 'codigo da enquete',
  `DT_CADASTRO` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'data do cadastro',
  `NM_ENQUETE` varchar(150) NOT NULL COMMENT 'nome da enquete',
  `DS_PERGUNTA` varchar(150) NOT NULL COMMENT 'pergunta da enquete',
  `DT_INICIO` date NOT NULL COMMENT 'data inicio que será exibida',
  `DT_FIM` date NOT NULL COMMENT 'data final da exibição no site',
  `IE_SITUACAO` enum('A','I') NOT NULL COMMENT 'situação da enquete, Ativa ou Inativa',
  PRIMARY KEY (`CD_ENQUETE`),
  UNIQUE KEY `DT_INICIO` (`DT_INICIO`),
  UNIQUE KEY `DT_FIM` (`DT_FIM`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Entidade para armazenar as perguntas das enquetes' AUTO_INCREMENT=2 ;

--
-- Extraindo dados da tabela `enquete_perguntas`
--

INSERT INTO `enquete_perguntas` (`CD_ENQUETE`, `DT_CADASTRO`, `NM_ENQUETE`, `DS_PERGUNTA`, `DT_INICIO`, `DT_FIM`, `IE_SITUACAO`) VALUES
(1, '2013-04-25 17:48:15', 'Operadora de Celular', 'Qual sua operadora de celular?', '2013-04-25', '2013-04-30', 'A');

Como estamos fazendo um sistema para ilimitadas opções, precisamos de uma outra tabela para armazenas estes dados.

--
-- Estrutura da tabela `enquete_opcoes`
--

CREATE TABLE IF NOT EXISTS `enquete_opcoes` (
  `NR_OPCAO` int(11) NOT NULL AUTO_INCREMENT COMMENT 'numero da opção',
  `CD_ENQUETE` int(11) NOT NULL COMMENT 'FK codigo da enquete',
  `DS_OPCAO` varchar(150) NOT NULL COMMENT 'descrição da opção',
  `QT_VOTO` int(11) NOT NULL DEFAULT '0' COMMENT 'quantidade de votos',
  PRIMARY KEY (`NR_OPCAO`),
  KEY `FK_enquete_opcoes` (`CD_ENQUETE`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Entidade para armazenar as opções das enquetes' AUTO_INCREMENT=7 ;

--
-- Extraindo dados da tabela `enquete_opcoes`
--

INSERT INTO `enquete_opcoes` (`NR_OPCAO`, `CD_ENQUETE`, `DS_OPCAO`, `QT_VOTO`) VALUES
(1, 1, 'Claro', 0),
(2, 1, 'Tim', 0),
(3, 1, 'Vivo', 0),
(4, 1, 'Oi', 0),
(5, 1, 'Não tenho celular.', 0),
(6, 1, 'Outra operadora', 0);

Tabela para armazenar os comentários das enquetes.

--
-- Estrutura da tabela `enquete_comentarios`
--

CREATE TABLE IF NOT EXISTS `enquete_comentarios` (
  `NR_SEQUENCIA` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Numero sequencial',
  `CD_ENQUETE` int(11) NOT NULL COMMENT 'FK codigo da enquete',
  `DT_ENVIO` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data que o comentário foi enviado',
  `NR_IP` varchar(20) NOT NULL COMMENT 'numero de IP da pessoa que enviou',
  `NM_PESSOA` varchar(30) NOT NULL COMMENT 'nome da pessoa',
  `DS_EMAIL` varchar(60) NOT NULL COMMENT 'email da pessoa',
  `DS_COMENTARIO` tinytext NOT NULL COMMENT 'comentario sobre a enquete',
  `IE_SITUACAO` enum('A','P','R') NOT NULL COMMENT 'situação, Ativo, Bloqueado, Pendente de aprovação',
  PRIMARY KEY (`NR_SEQUENCIA`),
  KEY `FK_enquete_comentarios` (`CD_ENQUETE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Entidade para armazenar os comentários' AUTO_INCREMENT=1 ;

Esta tabela é uma das mais importantes, pois estaremos armazenando os logs de tudo o que acontecer com nossa enquete como; quem votou, quando, IP, e caso algum engraçadinho tente negativar sua enquete você poderá analisar os logs para identificar se houve alguma tentativa de burlar a enquete.

--
-- Estrutura da tabela `enquete_logs`
--

CREATE TABLE IF NOT EXISTS `enquete_logs` (
  `NR_SEQUENCIA` int(11) NOT NULL AUTO_INCREMENT,
  `CD_ENQUETE` int(11) NOT NULL,
  `NR_OPCAO` int(11) NOT NULL,
  `DT_ENVIO` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `NR_IP` varchar(20) NOT NULL,
  PRIMARY KEY (`NR_SEQUENCIA`),
  KEY `NR_OPCAO` (`NR_OPCAO`),
  KEY `CD_ENQUETE` (`CD_ENQUETE`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Entidade para armazenar os LOGs' AUTO_INCREMENT=19 ;

--
-- Extraindo dados da tabela `enquete_logs`
--
INSERT INTO `enquete_logs` (`NR_SEQUENCIA`, `CD_ENQUETE`, `NR_OPCAO`, `DT_ENVIO`, `NR_IP`) VALUES
(6, 1, 4, '2013-04-30 03:26:58', '127.0.0.1'),
(7, 1, 1, '2013-04-30 03:27:01', '127.0.0.1');

Relacionamentos entre as tabelas

--
-- Restrições para a tabela `enquete_comentarios`
--
ALTER TABLE `enquete_comentarios`
  ADD CONSTRAINT `FK_enquete_comentarios` FOREIGN KEY (`CD_ENQUETE`) REFERENCES `enquete_perguntas` (`CD_ENQUETE`);

--
-- Restrições para a tabela `enquete_logs`
--
ALTER TABLE `enquete_logs`
  ADD CONSTRAINT `FK_enquete_logs` FOREIGN KEY (`NR_OPCAO`) REFERENCES `enquete_opcoes` (`NR_OPCAO`);

--
-- Restrições para a tabela `enquete_opcoes`
--
ALTER TABLE `enquete_opcoes`
  ADD CONSTRAINT `FK_enquete_opcoes` FOREIGN KEY (`CD_ENQUETE`) REFERENCES `enquete_perguntas` (`CD_ENQUETE`);

PHP – Upload de arquivos

Para upload maiores de 2MB, localizar e editar o arquivo php.ini.

http://php.net/file-uploads
file_uploads = On

Diretório temporário para upload de arquivos HTTP (vai usar o padrão do sistema, se não especificado).
http://php.net/upload-tmp-dir
upload_tmp_dir = “e :/ wamp / tmp”

O tamanho máximo permitido para arquivos enviados.
http://php.net/upload-max-filesize
upload_max_filesize = 2M

Tamanho máximo de dados POST que o PHP irá aceitar.
http://php.net/post-max-size
post_max_size = 8M

Configurando conexão com PHP + Oracle usando CentOS 6.3 / Red Hat 6.3

Neste artigo vou descrever a maneira mais simples e rapida para configurar o PHP para suporte com Oracle.

Antes de iniciar é necessário ter alguns pacotes básicos instalados;

1
# yum install gcc gcc-c++ autoconf libaio

Instalar o servidor web Apache
O comando abaixo instala o servidor web apache.

1
# yum -y install httpd

Configure para iniciar junto co o boot
Agora configuramos o apache para iniciar junto com o boot.

1
# chkconfig httpd on

Instalar o PHP
Instalando o PHP

1
# yum -y install php php-devel php-pear

Para instalar todas as bibliotecas do PHP – esta etapa não é obrigatoria
O comando abaixo instala todas as extensões disponíveis para o PHP

1
# yum -y install php*

Configurar o SELINUX
Agora vamos desabilitar SELINUX para não interferir no servidor httpd

1
2
3
/etc/sysconfig/selinux
 
# SELINUX=disabled

Instalar o Oracle client
Agora precisamos baixar o client do oracle no site Oracle.com é necessário fazer um cadastro rápido e gratuito.
Lembrando que você deve baixar de acordo com a arquitetura i686 ou x64

O comando abaixo instala os pacotes RPM.
x86_64
oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm

1
2
# rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm

i686/i386
oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm
oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm

1
2
# rpm -ivh oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm

Agora é necessário setar a variável D_LIBRARY_PATH para o caminho da instalação do oracle client, que será carregado durante a Instalação do OCI8

1
2
# export LD_LIBRARY_PATH=/usr/lib/oracle/
# export LD_LIBRARY_PATH=/usr/lib64/oracle/

PHP – Instalação das extensões PECL
http://php.net/manual/pt_BR/install.pecl.php

Instalar o OCI – http://pecl.php.net/package/oci8

1
# pecl install oci8

Quando for solicitado o caminho do oracle_home, pressione enter caso tenha usado o comando export LD_LIBRARY_PATH apontando para o caminho do oracle client ou informar o caminho da instalação
Lembrando que tem diferença entre as plataformas i686 e x64(de acordo com a versão de plataforma e client do oracle usados)
Para suporte
http://php.net/manual/pt_BR/install.pecl.php

Editar o arquivo php.ini

1
# /etc/php.ini

Acrescentar a linha

1
# extension=oci8.so

reiniciar o host

1
# reboot

após reiniciar crie um arquivo phpinfo.php

1
<!--?php phpinfo(); ?-->

Se tudo ocorreu bem deverá aparecer o modulo OCI conforme a imagem abaixo

Problemas comuns

1
2
3
4
5
6
7
8
9
10
When running the CLI version of PHP from the command line, you may receive errors like the following:
[root@myserver /root]$ php -v
PHP Warning: Module 'pcre' already loaded in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/spl.so' - /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/spl.so: Undefined symbol "pcre_exec" in Unknown on line 0
 PHP Warning: Module 'SimpleXML' already loaded in Unknown on line 0
PHP Warning: Module 'session' already loaded in Unknown on line 0
PHP Warning: Module 'exif' already loaded in Unknown on line 0
PHP 5.2.3 (cli) (built: Jun 14 2007 15:29:17)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

Como resolver?
-Verifique se desabilitou o SELINUX após a configuração é necessário reiniciar o host.