Commit 619cec4108b062393133ad1703ff6407fd441721

Authored by Lucas D'Avila
1 parent 707f53bb
Exists in master

Alterado CoreExt/DataMapper para executar consultas preparadas

Showing 1 changed file with 75 additions and 6 deletions   Show diff stats
ieducar/lib/CoreExt/DataMapper.php
... ... @@ -201,6 +201,17 @@ abstract class CoreExt_DataMapper
201 201 }
202 202  
203 203 /**
  204 + * Retorna o nome do recurso, isto é o nome da tabela sem '_',
  205 + * Ex: transporte_aluno => transporte aluno.
  206 + *
  207 + * @return string
  208 + */
  209 + public function resourceName()
  210 + {
  211 + return strtolower(str_replace('_', ' ', $this->_tableName));
  212 + }
  213 +
  214 + /**
204 215 * Retorna os nomes das colunas da tabela em um array, de acordo com o array
205 216 * de dados associativo $data.
206 217 *
... ... @@ -266,6 +277,7 @@ abstract class CoreExt_DataMapper
266 277  
267 278 /**
268 279 * Retorna uma query SQL de recuperação de todos os registros de uma tabela.
  280 + *
269 281 * @param array $data
270 282 * @param array $where
271 283 * @param array $orderBy
... ... @@ -281,7 +293,20 @@ abstract class CoreExt_DataMapper
281 293 if (0 < count($whereArg)) {
282 294 foreach ($whereArg as $key => $value) {
283 295 $whereName = $this->_getTableColumn($key);
284   - $where[] = sprintf("%s = '%s'", $whereName, $value);
  296 +
  297 + preg_match('/[<,=,>]/', $value, $matches);
  298 + $hasComparisonSign = ! empty($matches);
  299 +
  300 + // Caso $value contenha <, > ou =, ex: '> $1', não adiciona sinal de igual.
  301 + if($hasComparisonSign)
  302 + $where[] = sprintf("%s %s", $whereName, $value);
  303 +
  304 + // Caso $value contenha parametros para consulta preparada ($1, $2...), não adiciona $value entre aspas.
  305 + elseif(strpos($value, '$') > -1)
  306 + $where[] = sprintf("%s = %s", $whereName, $value);
  307 +
  308 + else
  309 + $where[] = sprintf("%s = '%s'", $whereName, $value);
285 310 }
286 311 }
287 312 else {
... ... @@ -450,7 +475,8 @@ abstract class CoreExt_DataMapper
450 475 if ($instance instanceof CoreExt_Entity) {
451 476 foreach ($this->_primaryKey as $pk) {
452 477 $whereName = $this->_getTableColumn($pk);
453   - $where[] = sprintf("%s = '%d'", $whereName, $instance->get($pk));
  478 + //$where[] = sprintf("%s = '%d'", $whereName, $instance->get($pk)); estoura o decimal. valor 9801762824 retornando 1211828232
  479 + $where[] = sprintf("%s = '%s'", $whereName, $instance->get($pk));
454 480 }
455 481 }
456 482 elseif (is_numeric($instance)) {
... ... @@ -473,15 +499,16 @@ abstract class CoreExt_DataMapper
473 499 * @param array $columns Atributos a serem carregados. O atributo id é sempre carregado.
474 500 * @param array $where
475 501 * @param array $orderBy
  502 + * @param array $addColumnIdIfNotSet Se true, adiciona a coluna 'id' caso não esteja definido no array $columns
476 503 * @return array
477 504 * @todo Problema potencial com busca em registros com compount key. Testar.
478 505 */
479   - public function findAll(array $columns = array(), array $where = array(), array $orderBy = array())
  506 + public function findAll(array $columns = array(), array $where = array(), array $orderBy = array(), $addColumnIdIfNotSet = true)
480 507 {
481 508 // Inverte chave valor, permitindo array simples como array('nome')
482 509 if (0 < count($columns)) {
483 510 $columns = array_flip($columns);
484   - if (!isset($columns['id'])) {
  511 + if (!isset($columns['id']) && $addColumnIdIfNotSet) {
485 512 $columns['id'] = TRUE;
486 513 }
487 514 }
... ... @@ -502,6 +529,48 @@ abstract class CoreExt_DataMapper
502 529 return $list;
503 530 }
504 531  
  532 +
  533 + /**
  534 + * Retorna todos os registros como objetos CoreExt_Entity retornados pela
  535 + * query de _getFindAllStatment() (usando consulta preparada, util para evitar sql injection).
  536 + *
  537 + * @param array $columns Atributos a serem carregados. O atributo id é sempre carregado.
  538 + * @param array $where Condicoes preparadas ex: array('arg1 = $1', 'arg2 = $2');
  539 + * @param array $params Valor das condiçoes ($1, $2 ...) ex: array('1', '3');
  540 + * @param array $orderBy
  541 + * @param array $addColumnIdIfNotSet Se true, adiciona a coluna 'id' caso não esteja definido no array $columns
  542 + * @return array
  543 + * @todo
  544 + */
  545 + public function findAllUsingPreparedQuery(array $columns = array(), array $where = array(), array $params = array(), array $orderBy = array(), $addColumnIdIfNotSet = true) {
  546 + $list = array();
  547 +
  548 + // Inverte chave valor, permitindo array simples como array('nome')
  549 + if (0 < count($columns)) {
  550 + $columns = array_flip($columns);
  551 + if (!isset($columns['id']) && $addColumnIdIfNotSet) {
  552 + $columns['id'] = TRUE;
  553 + }
  554 + }
  555 +
  556 + // Reseta o locale para o default (en_US)
  557 + $this->getLocale()->resetLocale();
  558 +
  559 + $sql = $this->_getFindAllStatment($columns, $where, $orderBy);
  560 +
  561 + if ($this->_getDbAdapter()->execPreparedQuery($sql, $params) != false) {
  562 + // Retorna o locale para o usado no restante da aplicação
  563 + $this->getLocale()->setLocale();
  564 +
  565 + while ($this->_getDbAdapter()->ProximoRegistro()) {
  566 + $list[] = $this->_createEntityObject($this->_getDbAdapter()->Tupla());
  567 + }
  568 + }
  569 +
  570 + return $list;
  571 + }
  572 +
  573 +
505 574 /**
506 575 * Retorna um registro que tenha como identificador (chave única ou composta)
507 576 * o valor dado por $pkey.
... ... @@ -591,7 +660,7 @@ abstract class CoreExt_DataMapper
591 660 */
592 661 public function delete($instance)
593 662 {
594   - return $this->_getDbAdapter()->Consulta($this->_getDeleteStatment($instance));
  663 + return $this->_getDbAdapter()->Consulta($this->_getDeleteStatment($instance));
595 664 }
596 665  
597 666 /**
... ... @@ -686,4 +755,4 @@ abstract class CoreExt_DataMapper
686 755 }
687 756 return $this->_locale;
688 757 }
689   -}
690 758 \ No newline at end of file
  759 +}
... ...