Commit 75b15c35f879ac842a9cd6876f054dac0ed79f1a

Authored by Lucas D'Avila
1 parent b4b5131c
Exists in master

Adicionado suporte a queries preparadas (usado evitar sql injection), adicionado…

… try para pegar erros redirecionamento para /modules/Error
Showing 1 changed file with 54 additions and 72 deletions   Show diff stats
ieducar/intranet/include/clsBancoPgSql.inc.php
... ... @@ -32,6 +32,8 @@ require_once 'clsConfigItajai.inc.php';
32 32 require_once 'include/clsCronometro.inc.php';
33 33 require_once 'include/clsEmail.inc.php';
34 34  
  35 +require_once 'modules/Error/Mailers/NotificationMailer.php';
  36 +
35 37 /**
36 38 * clsBancoSQL_ abstract class.
37 39 *
... ... @@ -148,11 +150,6 @@ abstract class clsBancoSQL_
148 150 /**
149 151 * @var bool
150 152 */
151   - var $showReportarErro = TRUE;
152   -
153   - /**
154   - * @var bool
155   - */
156 153 var $executandoEcho = FALSE;
157 154  
158 155 /**
... ... @@ -362,16 +359,10 @@ abstract class clsBancoSQL_
362 359 // Verifica se o link de conexão está inativo e conecta
363 360 if (0 == $this->bLink_ID) {
364 361 $this->FraseConexao();
365   -
366   - if ($this->bDepurar) {
367   - printf("<br>Depurar: Frase de Conex&atilde;o : %s<br>\n", $this->strFraseConexao);
368   - }
369   -
370 362 $this->bLink_ID = pg_connect($this->strFraseConexao);
371 363  
372   - if (!$this->bLink_ID) {
373   - $this->Interrompe("Link inv&aacute;lido, conex&atilde;o falhou!");
374   - }
  364 + if (! $this->bLink_ID)
  365 + $this->Interrompe("N&atilde;o foi possivel conectar ao banco de dados");
375 366 }
376 367 }
377 368  
... ... @@ -447,23 +438,17 @@ abstract class clsBancoSQL_
447 438  
448 439 if (!$this->bConsulta_ID) {
449 440 if ($this->getThrowException()) {
450   - $message = $this->bErro_no ? "($this->bErro_no) " . $this->strErro :
451   - pg_last_error($this->bLink_ID);
  441 + $message = $this->bErro_no ? "($this->bErro_no) " . $this->strErro :
  442 + pg_last_error($this->bLink_ID);
452 443  
453 444 $message .= PHP_EOL . $this->strStringSQL;
454 445  
455 446 throw new Exception($message);
456 447 }
457   - else {
  448 + else
  449 + {
458 450 $erroMsg = "SQL invalido: {$this->strStringSQL}<br>\n";
459   - die($erroMsg);
460   -
461   - if ($this->transactionBlock) {
462   - // Nada.
463   - }
464   -
465   - $this->Interrompe($erroMsg);
466   - return FALSE;
  451 + throw new Exception("Erro ao executar uma ação no banco de dados: $erroMsg");
467 452 }
468 453 }
469 454  
... ... @@ -810,58 +795,55 @@ abstract class clsBancoSQL_
810 795 * @param string $msg
811 796 * @param bool $getError
812 797 */
813   - function Interrompe($msg, $getError = FALSE)
  798 + function Interrompe($appErrorMsg, $getError = FALSE)
814 799 {
815   - if ($getError) {
816   - $this->strErro = pg_result_error($this->bConsulta_ID);
817   - $this->bErro_no = ($this->strErro == '') ? FALSE : TRUE;
818   - }
  800 + $lastError = error_get_last();
819 801  
820   - $erro1 = substr(md5('1erro'), 0, 10);
821   - $erro2 = substr(md5('2erro'), 0, 10);
  802 + @session_start();
  803 + $_SESSION['last_php_error_message'] = $lastError['message'];
  804 + $_SESSION['last_php_error_line'] = $lastError['line'];
  805 + $_SESSION['last_php_error_file'] = $lastError['file'];
  806 + @session_write_close();
822 807  
823   - function show($data, $func = 'var_dump') {
824   - ob_start();
825   - $func($data);
826   - $output = ob_get_contents();
827   - ob_end_clean();
828   - return $output;
829   - }
  808 + $pgErrorMsg = $getError ? pg_result_error($this->bConsulta_ID) : '';
  809 + NotificationMailer::unexpectedDataBaseError($appErrorMsg, $pgErrorMsg, $this->strStringSQL);
  810 +
  811 + die("<script>document.location.href = '/module/Error/unexpected';</script>");
  812 + }
  813 +
  814 +
  815 + /**
  816 + * Executa uma consulta SQL preparada ver: http://php.net/manual/en/function.pg-prepare.php
  817 + * ex: $db->execPreparedQuery("select * from portal.funcionario where matricula = $1 and senha = $2", array('admin', '123'))
  818 + *
  819 + * @param string $name nome da consulta
  820 + * @param string $query sql para ser preparado
  821 + * @param array $params parametros para consulta
  822 + *
  823 + * @return bool|resource FALSE em caso de erro ou o identificador da consulta
  824 + * em caso de sucesso.
  825 + */
  826 + public function execPreparedQuery($query, $params = array()) {
  827 + try {
  828 + $errorMsgs = '';
  829 + $this->Conecta();
  830 + $dbConn = $this->bLink_ID;
  831 +
  832 + if (! is_array($params))
  833 + $params = array($params);
  834 +
  835 + $this->bConsulta_ID = @pg_query_params($dbConn, $query, $params);
  836 + $resultError = @pg_result_error($this->bConsulta_ID);
  837 + $errorMsgs .= trim($resultError) != '' ? $resultError : @pg_last_error($this->bConsulta_ID);
830 838  
831   - @session_start();
832   - $_SESSION['vars_session'] = show($_SESSION);
833   - $_SESSION['vars_post'] = show($_POST);
834   - $_SESSION['vars_get'] = show($_GET);
835   - $_SESSION['vars_cookie'] = show($_COOKIE);
836   - $_SESSION['vars_erro1'] = $msg;
837   - $_SESSION['vars_erro2'] = $this->strErro;
838   - $_SESSION['vars_server'] = show($_SERVER);
839   - $id_pessoa = $_SESSION['id_pessoa'];
840   -
841   - session_write_close();
842   -
843   - if ($this->showReportarErro) {
844   - $array_idpes_erro_total = array();
845   - $array_idpes_erro_total[4910] = TRUE;
846   - $array_idpes_erro_total[2151] = TRUE;
847   - $array_idpes_erro_total[8194] = TRUE;
848   - $array_idpes_erro_total[7470] = TRUE;
849   - $array_idpes_erro_total[4637] = TRUE;
850   - $array_idpes_erro_total[4702] = TRUE;
851   - $array_idpes_erro_total[1801] = TRUE;
852   -
853   - if (! $array_idpes_erro_total[$id_pessoa]) {
854   - die( "<script>document.location.href = 'erro_banco.php';</script>" );
855 839 }
856   - else {
857   - printf("</td></tr></table><b>Erro de Banco de Dados:</b> %s<br><br>\n", $msg);
858   - printf("<b>SQL:</b> %s<br><br>\n", $this->strStringSQL );
859   - printf("<b>Erro do PgSQL </b>: %s (%s)<br><br>\n", $this->bErro_no, $this->strErro);
860   - die("Sessão Interrompida.");
  840 + catch(Exception $e) {
  841 + $errorMsgs .= "Exception: " . $e->getMessage();
861 842 }
862   - }
863   - else {
864   - die($this->strErro . "\n");
865   - }
  843 +
  844 + if ($this->bConsulta_ID == false || trim($errorMsgs) != '')
  845 + throw new Exception("Erro ao preparar consulta ($query) no banco de dados: $errorMsgs");
  846 +
  847 + return $this->bConsulta_ID;
866 848 }
867   -}
868 849 \ No newline at end of file
  850 +}
... ...