Commit 619cec4108b062393133ad1703ff6407fd441721
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,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 | * Retorna os nomes das colunas da tabela em um array, de acordo com o array | 215 | * Retorna os nomes das colunas da tabela em um array, de acordo com o array |
| 205 | * de dados associativo $data. | 216 | * de dados associativo $data. |
| 206 | * | 217 | * |
| @@ -266,6 +277,7 @@ abstract class CoreExt_DataMapper | @@ -266,6 +277,7 @@ abstract class CoreExt_DataMapper | ||
| 266 | 277 | ||
| 267 | /** | 278 | /** |
| 268 | * Retorna uma query SQL de recuperação de todos os registros de uma tabela. | 279 | * Retorna uma query SQL de recuperação de todos os registros de uma tabela. |
| 280 | + * | ||
| 269 | * @param array $data | 281 | * @param array $data |
| 270 | * @param array $where | 282 | * @param array $where |
| 271 | * @param array $orderBy | 283 | * @param array $orderBy |
| @@ -281,7 +293,20 @@ abstract class CoreExt_DataMapper | @@ -281,7 +293,20 @@ abstract class CoreExt_DataMapper | ||
| 281 | if (0 < count($whereArg)) { | 293 | if (0 < count($whereArg)) { |
| 282 | foreach ($whereArg as $key => $value) { | 294 | foreach ($whereArg as $key => $value) { |
| 283 | $whereName = $this->_getTableColumn($key); | 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 | else { | 312 | else { |
| @@ -450,7 +475,8 @@ abstract class CoreExt_DataMapper | @@ -450,7 +475,8 @@ abstract class CoreExt_DataMapper | ||
| 450 | if ($instance instanceof CoreExt_Entity) { | 475 | if ($instance instanceof CoreExt_Entity) { |
| 451 | foreach ($this->_primaryKey as $pk) { | 476 | foreach ($this->_primaryKey as $pk) { |
| 452 | $whereName = $this->_getTableColumn($pk); | 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 | elseif (is_numeric($instance)) { | 482 | elseif (is_numeric($instance)) { |
| @@ -473,15 +499,16 @@ abstract class CoreExt_DataMapper | @@ -473,15 +499,16 @@ abstract class CoreExt_DataMapper | ||
| 473 | * @param array $columns Atributos a serem carregados. O atributo id é sempre carregado. | 499 | * @param array $columns Atributos a serem carregados. O atributo id é sempre carregado. |
| 474 | * @param array $where | 500 | * @param array $where |
| 475 | * @param array $orderBy | 501 | * @param array $orderBy |
| 502 | + * @param array $addColumnIdIfNotSet Se true, adiciona a coluna 'id' caso não esteja definido no array $columns | ||
| 476 | * @return array | 503 | * @return array |
| 477 | * @todo Problema potencial com busca em registros com compount key. Testar. | 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 | // Inverte chave valor, permitindo array simples como array('nome') | 508 | // Inverte chave valor, permitindo array simples como array('nome') |
| 482 | if (0 < count($columns)) { | 509 | if (0 < count($columns)) { |
| 483 | $columns = array_flip($columns); | 510 | $columns = array_flip($columns); |
| 484 | - if (!isset($columns['id'])) { | 511 | + if (!isset($columns['id']) && $addColumnIdIfNotSet) { |
| 485 | $columns['id'] = TRUE; | 512 | $columns['id'] = TRUE; |
| 486 | } | 513 | } |
| 487 | } | 514 | } |
| @@ -502,6 +529,48 @@ abstract class CoreExt_DataMapper | @@ -502,6 +529,48 @@ abstract class CoreExt_DataMapper | ||
| 502 | return $list; | 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 | * Retorna um registro que tenha como identificador (chave única ou composta) | 575 | * Retorna um registro que tenha como identificador (chave única ou composta) |
| 507 | * o valor dado por $pkey. | 576 | * o valor dado por $pkey. |
| @@ -591,7 +660,7 @@ abstract class CoreExt_DataMapper | @@ -591,7 +660,7 @@ abstract class CoreExt_DataMapper | ||
| 591 | */ | 660 | */ |
| 592 | public function delete($instance) | 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,4 +755,4 @@ abstract class CoreExt_DataMapper | ||
| 686 | } | 755 | } |
| 687 | return $this->_locale; | 756 | return $this->_locale; |
| 688 | } | 757 | } |
| 689 | -} | ||
| 690 | \ No newline at end of file | 758 | \ No newline at end of file |
| 759 | +} |