TCPDF - FUNCIONA BEM EM DESENVOLVIMENTO, MAS DÁ ERRO EM PRODUÇÃO

Saudações, pessoal!!!
Estou a desenvolver um sistema scriptcase para gerar relatórios com TCPDF. O sistema está a funcionar perfeitamente em desenvolvimento, mas quando publico, os relatórios estão a gerar erros do tipo:

Atenção
Undefined offset: 0
Atenção
Undefined offset: 0
Atenção
Undefined offset: 0
TCPDF ERROR: Some data has already been output, can’t send PDF file

Atenção
Division by zero
Atenção
Division by zero
Connection failed:Access denied for user ‘root’@‘localhost’ (using password: YES)

Agradeceria se me poder ajudar.

@Belmiro,

Você passa parâmetros para essa aplicação?

Coloca ela em modo debug, publica e testa, tenta identificar a linha do erro.

Undefined offset: 0 <-- isso indica array inválido (array cujo índice não existe)
Division by zero <-- isso indica está realizando um operação onde o divisor está com valor zero
Connection failed:Access denied for user ‘root’@‘localhost’ (using password: YES) <-- isso indica que há uma conexão inválida no seu ambiente de produção (talvez seja a causadora de todo o problema)

O fato de funcionar no ambiente de desenvolvimento e não significa obrigatoriamente funcionar no ambiente de produção, nesse caso parece haver problema de conexão com um banco no ambiente de produção.

Grande Haroldo,
Poderia instruir-me de modo a que eu possa pôr em modo debug?
O que me preocupa é que já tenho um sistema na produção que funciona perfeitamente. Este é o mais recente.

Estou a usar aplicação BLANK.

O fato de utilizar uma blank é uma fato não relatado inicialmente e muito importante.

Em Aplicação/Configuração você coloca em modo debug.

teste todas suas conexões em: http://dominio/sistema/_lib/prod

Grande Haroldo, desculpe-me, mas eu ainda sou crou a detectar bugs. Entrei até ao caminho orientado e vi mais pastas.
Em que pasta é que poderei executar as suas orientações???

SEGUE-SE UM DOS CÓDIGOS QUE GERA O ERRO EM PRODUÇÃO:

////////////////////////////////////////////////////////////////////////////////
// AREA //////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
$this->Db->debug = true;
$m=“SELECT r.mes
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘[Mes]’ AND ano_nota_previa_relatorio=’[Ano]’”;
sc_lookup(rs,$m);
$mes = {rs[0][0]};
$a=“SELECT np.ano_nota_previa_relatorio
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘[Mes]’ AND ano_nota_previa_relatorio=’[Ano]’”;
sc_lookup(rs,$a);
$ano = {rs[0][0]};
$np=“SELECT np.nota_previa_relatorio
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘[Mes]’ AND ano_nota_previa_relatorio=’[Ano]’”;
sc_lookup(rs,$np);
$nota = {rs[0][0]};

sc_include_lib(“tcpdf”);

sc_include_library(“prj”, “casa_transito”, “nota_previa.php”, true, true);
//sc_include_library(“prj”, “css”, “estilo.css”, true, true);

///////////////////////////////////////////////////////////////////////////////////////////////
// DEFINIÇÕES GERAIS DO RELATÓRIO
///////////////////////////////////////////////////////////////////////////////////////////////

// Criar um Novo Documento PDF
$pdf = new MYPDF(‘P’, PDF_UNIT, PDF_PAGE_FORMAT, true, ‘UTF-8’, false);

///////////////////////////////////////////////////////////////////////////////////////////////
// DEFINIÇÕES DA APARENCIA DO RELATÓRIO
///////////////////////////////////////////////////////////////////////////////////////////////

// Conjunto de Informações de Documentos
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor(‘BELMIRO CONSTANTINO’);
$pdf->SetTitle(‘NOTA PRÉVIA DO RELATÓRIO’);
$pdf->SetSubject(‘TCPDF Relatório Imagem’);
$pdf->SetKeywords(‘TCPDF, PDF, exemplo, PDFReport, Imagem’);
// Definições das Informações do Cabeçalho Padrão
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.’ 001’, PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
//$pdf->SetPrintFooter(false);
//$pdf->setFooterData(array(0,64,0), array(0,64,128));

// Definição das Fontes do Header e Footer
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, ‘’, PDF_FONT_SIZE_MAIN));
//$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, ‘’, PDF_FONT_SIZE_DATA));

// Definição das Fontes Monospaced
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// Definição das Margens ESQUERDA, DIREITA E BAIXO
$pdf->SetMargins(18, 40, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
//$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// Definição da Quebra de Pagina Automática
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// Definição da Escala de Imagem
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// Regua de Apoio com espaçamento da grade de 5mm
$pdf->grid = false;

// Definição da Fonte
$pdf->SetFont(‘Times’, ‘’, 12, ‘’, ‘false’);

// Adicionar Pagina
$pdf->AddPage();

$html = <<<EOF

.teste{ text-align: justify !important; } h1{ text-align: center; font-size: 50px; } h2{ text-align: center; font-size: 24px; } p{ font-size: 20px; }

//

$mes







Elaborado

______________________

Data:____/______/_______




Verificado

______________________

Data:____/______/_______




Aprovado

______________________

Data:____/______/_______










1. Nota Prévia: Relatório do Mês de $mes de $ano



$nota

EOF; $pdf->WriteHTML($html);

///////////////////////////////////////////////////////////////////////////////////////////////
// MONTAGEM DO CORPO DO RELATÓRIO
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
// Fecha o Relatório PDF
///////////////////////////////////////////////////////////////////////////////////////////////

$nome_arquivo = $_SESSION[‘scriptcase’][‘NOTA_PREVIA’][‘glo_nm_path_doc’].’/’.‘NOTA_PREVIA.pdf’;
$pdf->Output($nome_arquivo, ‘F’);
$pdf->Output();

Penso que assim fica mais fácil de me ajudar.

veja esse código:

$a=“SELECT np.ano_nota_previa_relatorio
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘[Mes]’ AND ano_nota_previa_relatorio=’[Ano]’”;
sc_lookup(rs,$a);
$ano = {rs[0][0]};

e se o select não estiver retornando nada?
da erro de offset na linha: $ano = {rs[0][0]};

tem que testar suas conexões.
colocar em modo debug

Grande Haroldo, simulei o SELECT ACIMA e retornou o ano. Neste momento, enquanto espero por uma solução, estou a assistir ao seu vídeo de 2016 sobre o ReportPDF.

O problema que apresentei é muito estranho porque testei os selcts na DB e tudo retornou o que eu preciso.
Pôr em modo debug ainda não o fiz porque não sei como o fazer.

Testei com $this->Db->debug = true; na aplicação BLANK e retornou o seguinte:

(pdo-mysql): SELECT r.mes FROM nota_previa_relatorio np INNER JOIN relatorio r ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘Agosto’ AND ano_nota_previa_relatorio=‘2018’
(pdo-mysql): SELECT np.ano_nota_previa_relatorio FROM nota_previa_relatorio np INNER JOIN relatorio r ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘Agosto’ AND ano_nota_previa_relatorio=‘2018’
(pdo-mysql): SELECT np.nota_previa_relatorio FROM nota_previa_relatorio np INNER JOIN relatorio r ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = ‘Agosto’ AND ano_nota_previa_relatorio=‘2018’
TCPDF ERROR: Some data has already been output, can’t send PDF file

Acho que só investigando direto na sua app para tentar descobrir o problema.
No momento não consigo fazer acesso remoto.

Ok, Grande Mestre!
Infelizmente, não pode fazer acesso remoto porque hospedamos numa rede doméstica. Teríamos de criar uma VPN para o efeito. Mas, muito obrigado pela atenção. Agora, vou continuar a assistir ao vídeo de 2016 sobre ReportPDF.
Obrigadão!!!

Olá Belmiro e Haroldo,

Posso dar uma sugestão? Vamos lá: Substitua todo este código abaixo:

$m="SELECT r.mes
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = '[Mes]' AND ano_nota_previa_relatorio='[Ano]'";
sc_lookup(rs,$m);
$mes = {rs[0][0]};
$a="SELECT np.ano_nota_previa_relatorio
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = '[Mes]' AND ano_nota_previa_relatorio='[Ano]'";
sc_lookup(rs,$a);
$ano = {rs[0][0]};
$np="SELECT np.nota_previa_relatorio
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = '[Mes]' AND ano_nota_previa_relatorio='[Ano]'";
sc_lookup(rs,$np);
$nota = {rs[0][0]};

Por:

$sql="SELECT r.mes,np.ano_nota_previa_relatorio,np.nota_previa_relatorio
FROM nota_previa_relatorio np INNER JOIN relatorio r
ON r.idrelatorio = np.mes_nota_previa_relatorio WHERE mes = '[Mes]' AND ano_nota_previa_relatorio='[Ano]'";
sc_lookup(rs,$sql);
$mes = {rs[0][0]};
$ano = {rs[0][1]};
$nota = {rs[0][2]};

Depois disto, dê um echo nas variáveis e no retorno do select, pra ver se o conteúdo está vindo corretamente, desta forma:

echo [Mes].'  -  '.[Ano].'  -  '.$mes.'  -  '.$ano.'  -  '.$nota;

Pois os erros, como muito bem disse o Haroldo, são de variáveis que estão sendo passadas para o TCPDF e que estão zeradas ou vazias.

Tente isto e reporte aqui.

Pois, é Grande Kleyber!
Teste no ambiente de desenvolvimento, funcionou perfeitamente tal como o código anterior. Vou testar no ambiente de produção
e já já darei um feedback.

Saudações homens do Scriptcase!
Segui as orientações do Grande Haroldo e do Grande Kleyber, mas ainda assim continua a dar o mesmo erro.
Será que se eu actualizar o Scriptcase, funcionará perfeitamente?

Fiz uma aplicação mais simples para verificar onde está o problema e percebi que também não funcionou lançando o erro:

Atenção
mysqli::__construct(): (HY000/1045): Access denied for user ‘root’@‘localhost’ (using password: YES)
Atenção
Undefined offset: 0
Atenção
Undefined offset: 0
Atenção
Division by zero
Atenção
Division by zero
Connection failed:Access denied for user ‘root’@‘localhost’ (using password: YES)

Seu erro esta aqui: “Access denied for user ‘root’@‘localhost’ (using password: YES)”

Bom dia Belmiro,

Pelo que entendi os outros erros de Undefined Offset foram resolvidos e só ficou esse que é um problema de bloqueio de acesso do usuário root’@‘localhost’. Basta rever as permissões de acesso desse usuário em produção e o problema estará resolvido.

Foram todas minhas observações iniciais.

Acho que ele não viu esta parte Haroldo.
Ou não entendeu.

Criei um outro utilizador com todos os privilégios, mas nem com isso funcionou.

É algo no seu mysql que não esta permitindo conexão.