robsonvleite / datalayer

The data layer is a persistent abstraction component of your database that PDO (O data layer é um componente para abstração de persistência no seu banco de dados que usa PDO com prepared statements)
https://www.upinside.com.br
MIT License
144 stars 53 forks source link

Método update não retorna false em caso de erro/exception. #46

Closed KaueMoura closed 2 years ago

KaueMoura commented 2 years ago

Eu estava fazendo um teste com uma coluna nova em minha tabela de cliente no banco de dados. Mas depois deletei esta coluna do banco e executei o método save/update. Claro que daria erro pois agora ao fazer update estou tentando atualizar um campo que não existe mais. Mas o problema aqui é o comportamento do método save/update que não retornou corretamente o erro.

Ao executar o update o método simplesmente deveria retornar false, mas não ocorreu. Então analisando o código o problema é que ao fazer o update não é verificado se ele deu erro para retornar false, segue o trecho do código.

codigo_datalayer_update

Efetuei um ajuste mas queria confirmar se seria o correto, segue abaixo.

ajuste_codigo_datalayer

helisoncruz commented 2 years ago

@KaueMoura também percebi esse comportamento hoje pelo mesmo motivo de alteração de campos em uma tabela. Na ela valida o ID no caso do UPDATE ele sempre vai existir, pois passamos ele para realizar o próprio UPDATE, então mesmo com erro o retorno vai ser sempre true, pois o ID vai existir independente se foi alterado ou não. Vou tentar fazer um pull request disso, não sei se é a melhor solução mas server para ter uma ideia.

/** Update */
if (!empty($this->data->$primary)) {
    $id = $this->data->$primary;
    if(!$this->update($this->safe(), "{$this->primary} = :id", "id={$id}")) {
        return false;
    }
}
robsonvleite commented 2 years ago

@KaueMoura também percebi esse comportamento hoje pelo mesmo motivo de alteração de campos em uma tabela. Na ela valida o ID no caso do UPDATE ele sempre vai existir, pois passamos ele para realizar o próprio UPDATE, então mesmo com erro o retorno vai ser sempre true, pois o ID vai existir independente se foi alterado ou não. Vou tentar fazer um pull request disso, não sei se é a melhor solução mas server para ter uma ideia.

/** Update */
if (!empty($this->data->$primary)) {
    $id = $this->data->$primary;
    if(!$this->update($this->safe(), "{$this->primary} = :id", "id={$id}")) {
        return false;
    }
}

Pull aceito. Grato :)