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 | +} |