Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Método atualizar não funciona

Todas as funções do banco de dados estudadas até aqui estão funcionando normalmente: inserir e carregar categorias. Porém, a função que atualiza o banco de dados no arquivo Categoria.php não está funcionando quando eu a chamo no arquivo categorias-editar-post.php. Os parâmetros enviados via post, id e nome, funcionam corretamente, inclusive quando eu instancio a classe Categoria e utilizo o var_dump, verifico que o novo parâmetro nome foi instanciado no atributo nome da classe, mas mesmo assim o método atualizar() da classe Categoria não funciona. Segue o código do arquivo categorias-editar-post.php:

<?php
require_once 'classes/Categoria.php';
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

$id = $_POST['id'];
$nome = $_POST['nome'];

$categoria = new Categoria($id);
$categoria->nome = $nome;
var_dump($categoria); //código está aqui para testar se o objeto estava sendo instanciado corretamente
$categoria->atualizar();

header("Location: categorias.php");

Eu tenho certeza absoluta que o mesmo está certo, pois cheguei ao ponto de copiar a query, colar no terminal e depois substituir os atributos concatenados do código. Segue o código do método:

    public function atualizar()
    {
        $query = "UPDATE categorias set nome = '".$this->nome."' where id = ".$this->id;
        $conexao = Conexao::pegarConexao();
        $conexao = exec($query);
    }

Por fim, acompanhando o log do servidor php, verifiquei que toda vez que o arquivo categorias-editar-post.php faz a chamada para o método atualizar() o servidor fornece a seguinte resposta: sh: 1: UPDATE: not found Se alguém souber porque o método não está funcionando, me ajude por favor!

9 respostas

Duas coisas podem ser verificadas.

1 use var_dump ( $query ); para checar se a query está correta.

2 cheque se os nomes dos campos estão em minúsculo no formulário que envia. A propriedade "name" deve ser configurada e não a propriedade "id" nos campos do form.

fiz o var_dump na $query e o resultado foi esse: string(51) "UPDATE categorias set nome = 'Séries' where id = 1" Copiei essa string, joguei no console do mysql e a query funcionou:

mysql> UPDATE categorias set nome = 'Séries' where id = 1;
Query OK, 1 row affected (0,32 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Segue também o código do formulário:

<?php
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
    require_once 'cabecalho.php';
    require_once 'classes/Categoria.php';
    $id = $_GET['id'];
    $categoria = new Categoria($id);
?>
<div class="row">
    <div class="col-md-12">
        <h2>Editar Categoria</h2>
    </div>
</div>
<form action="categorias-edita-post.php" method="post">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="form-group">
                <label for="nome">Nome da Categoria</label>
                <input type="hidden" name="id" value="<?php echo $categoria->id ?>">
                <input type="text" name="nome" value="<?php echo $categoria->nome ?>" class="form-control" placeholder="Nome da Categoria">
            </div>
            <input type="submit" class="btn btn-success btn-block" value="Salvar">
        </div>
    </div>
</form>
<?php require_once 'rodape.php' ?>

Dê um var_dump em $conexao para checar se está tudo ok.

Se ainda assim não funcionar acrescente um ponto-e-vírgula na query:

        $query = "UPDATE categorias set nome = '".$this->nome."' where id = ". $this->id . ";" ;

Por fim dê um var_dump em exec($query);

Olhando o código não percebi erro. Então é bom checar com estes comandos.

Eu tentei uma vez acrescentar o ";" na query e deu um erro fatal. Experimentei o var_dump em exec($query) e a string estava vazia: string(0) "" Segue o código do método como ficou:

    public function atualizar()
    {
        $query = "UPDATE categorias set nome = '".$this->nome."' where id = ".$this->id;
        $conexao = Conexao::pegarConexao();
        $conexao = exec($query);
        $teste = var_dump($conexao);
        return $teste;
    }

Faça deste jeito

public function atualizar()
    {
        $query = "UPDATE categorias set nome = '".$this->nome."' where id = ".$this->id;
    echo '0 ' ; var_dump($query); echo '<br>';

     $conexao = Conexao::pegarConexao();
    echo '1 ' ; var_dump($conexao); echo '<br>';

      $resultado = exec($query);
    echo '1 ' ; var_dump($resultado); echo '<br>';
    exit;

         return 0;
    }

Veja se nas duas linhas o valor está vazio realmente.

solução!

O código deve ser escrito assim:

public function atualizar()
    {
        $query = "UPDATE categorias set nome = '".$this->nome."' where id = ".$this->id;
        $conexao = Conexao::pegarConexao();
        $conexao->exec($query);
    }

Ao invés de ser escrito assim:

public function atualizar()
    {
        $query = "UPDATE categorias set nome = '".$this->nome."' where id = ".$this->id;
        $conexao = Conexao::pegarConexao();
        $conexao = exec($query);
    }

Utilizei esse código e o resultado foi o seguinte:

0 string(50) "UPDATE categorias set nome = 'Animes' where id = 1"
1 object(PDO)#3 (0) { }
1 string(0) ""

Ressalto que o problema está acontecendo apenas com o update, os comandos insert e select funcionam normalmente.

Tente a última sugestão. Alterar a linha do exec.

Funcionou! Meu Deus, como eu não vi isso antes? hahahaha Muito obrigado Gabriel!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software