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

query ignorando substituindo campo na hora de gravar no mysql

Ao fazer um INSERT no banco de dados o valor da primeira coluna "titulo" é substituido pelo valor de descrição e os outros na sequencia também são substituidos pela coluna posterior. O que pode estar acontecendo?

new-post.php

<?php
require_once '../autoload.php';
use App\src\Posts;

if ($_SERVER['REQUEST_METHOD'] === 'POST'){
    $titulo = $_POST['titulo'];
    $descricao = $_POST['descricao'];
    $conteudo = $_POST['conteudo'];
    $imagemDestaque = $_POST['imagemDestaque'];
    $status = $_POST['status'];
    $categoria = $_POST['categoria'];

    $publicar = new Posts($titulo, $descricao, $conteudo, $imagemDestaque, $status, $categoria);
    $publicar->insertPost();
}

$teste =  "titulo = " . $titulo . ", descrição: " . $descricao . ", conteudo: " . $conteudo . ", imagemDestaque: " .
    $imagemDestaque . ", status: " . $status . ", categoria: " . $categoria;
print_r($teste);
?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>New Post</title>
    <link rel="stylesheet" href="style/reset.css">
    <link rel="stylesheet" href="style/formstyle.css">
</head>
<body>
    <div class="container">           
            <form method="post" action="new-post.php">
                <fieldset>
                    <legend>Inserir Post</legend>
                    <label for="titulo">Titulo:</label>
                    <input type="text" name="titulo" id="titulo">
                    <label for="descricao">Descrição:</label>
                    <input type="text" name="descricao" id="descricao">
                    <label for="conteudo">Conteudo:</label>
                    <textarea name="conteudo" id="conteudo"></textarea>
                    <label for="categoria">Categoria:</label>
                    <input type="text" name="categoria" id="categoria">
                    <label for="imagemDestaque">Imagem destaque:</label>
                    <input type="text" name="imagemDestaque" id="imagemDestaque">
                    <label for="status">Status:</label><br>
                    <input type="radio"  value="r" name = "status" selected>Rascunho.
                    <br>
                    <input type="radio"  value="a" name = "status">Publico.
                    <br>
                    <button type="submit" value="Enviar">Enviar</button>
                </fieldset>    
            </form>
            </div>
</body>
</html>

Posts.php

<?php
namespace App\src;
use PDO;

class Posts
{
    private $id;
    private $titulo;
    private $descricao;
    private $conteudo;
    private $imagemDestaque;
    private $status;
    private $categoria;
    private $data;

    public function __construct( $id = false, $titulo = false, $descricao = false, $conteudo = false, $imagemDestaque = false,
                                 $status = false, $categoria = false, $data = false)
    {
        $this->id = $id;
        $this->titulo = $titulo;
        $this->descricao = $descricao;
        $this->conteudo = $conteudo;
        $this->imagemDestaque = $imagemDestaque;
        $this->status = $status;
        $this->categoria = $categoria;
        $this->data = $data;
    }
    public function insertPost(){
        $query = "INSERT INTO tb_posts (titulo, descricao, conteudo, imagemdestaque, status, categoria)
VALUES (:titulo, :descricao, :conteudo, :imagemDestaque, :status, :categoria)";
        $connect = Connection::takeConnection();
        $result = $connect->prepare($query);
        $result->bindValue(':titulo', $this->titulo);
        $result->bindValue(':descricao',  $this->descricao);
        $result->bindValue(':conteudo',  $this->conteudo);
        $result->bindValue(':imagemDestaque',  $this->imagemDestaque);
        $result->bindValue(':status',  $this->status);
        $result->bindValue(':categoria',  $this->categoria);
        $result->execute();
    }
}
6 respostas

Olá Marcos,

O erro deve ser a ordem dos parâmetros no construtor:

# Parâmetros construtor:
($id, $titulo, $descricao, $conteudo, $imagemDestaque, $status, $categoria, $data)
# Parâmetros passados:
($titulo, $descricao, $conteudo, $imagemDestaque, $status, $categoria)

O primeiro parâmetro do construtor é $id mas o primeiro parâmetro passado é o $titulo, então o valor de título vai ser salvo no $this->id, o valor de descrição será salvo no $this->titulo e assim por diante. Isso porque os parâmetros vão ser recebidos pela ordem.

O que você pode fazer é passar o valor do id como false para seguir a ordem definida no construtor:

$publicar = new Posts(false, $titulo, $descricao, $conteudo, $imagemDestaque, $status, $categoria);

então caso eu precise usar nas outras funções apenas a $categoria terei que declarar as demais como false? não dá pra ser mais prático e declarar apenas a que vou usar?

solução!

Isso mesmo, como é seguido a ordem, todos os parâmetros antes de $categoria deverão ser passados, mas qualquer parâmetro com um valor padrão depois de $categoria pode ser ignorado.

Exemplo:

// Passando apenas $categoria
$publicar = new Posts(false, false, false, false, false, $categoria);

// Passando apenas $titulo
$publicar = new Posts(false, $titulo);

Um jeito de simplificar a passagem de apenas um item (categoria por exemplo) seria criar setters para todos os itens:

// Setter para categoria
public function setCategoria($categoria)
{
    $this->categoria = $categoria;
}

Com isso você poderia fazer assim para utilizar apenas $categoria:

$publicar = new Posts();
$publicar->setCategoria($categoria);
$publicar->insertPost();

então eu só não utilizarei um 'set' quando for passar vários parâmetros pois aí utilizarei o constructor?

Isso mesmo, fazendo como você falou acima seria como eu faria, mas fica totalmente de acordo com a sua preferência para cada caso.

No final isso é apenas questão de organização do código. Não importa qual você escolha, utilizando apenas o construtor ou utilizando os setters vai funcionar. Então você pode escolher baseado no qual você considera que vai deixar o seu código mais organizado e mais fácil de entender.

valeu obrigado pela ajuda.. se der por favor dê uma olhada na minha dúvida nesse outro post: https://cursos.alura.com.br/forum/topico-erro-ao-ler-exibir-dados-html-armazenados-no-bd-mysql-97379