2
respostas

Buscar resultado em uma tabela antes de salvar em outra

Gostaria de saber como faz pra buscar um dado em uma tabela e depois salvar este dado, juntamente com outros dados via $POST, em outra tabela. A principio coloquei no repositório, junto com o INSERT:

    public function salvar(Carro $carro)
    {
        $sql2 = $pdo->prepare("SELECT * FROM marcas WHERE id=:idMarca ");
        $sql2->bindValue(":idMarca", getId_Marca());
        $sql2->execute();
        while($row2 = $sql2->fetch(PDO::FETCH_ASSOC)){$marca = $row2["marca"];}

        $sql = "INSERT INTO carros (id_marca, marca, modelo, versao) VALUES (?,?,?,?)";
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1, $carro->getId_Marca());
        $statement->bindValue(2, $marca);
        $statement->bindValue(3, $carro->getModelo());
        $statement->bindValue(4, $carro->getVersao);
        $statement->execute();
    }

No error_log aparece:

PHP Fatal error: Uncaught TypeError: Carro::construct(): Argument #2 ($marca) must be of type string, null given, called in /XXX/cadastrar-carro.php on line 13 and defined in /XXX/src/Modelo/Carro.php:10 Stack trace: #0 /XXX/cadastrar-carro.php(13): Carro->construct(NULL, '23', NULL, 'Vectra', 'CD') #1 {main} thrown in /XXX/src/Modelo/Carro.php on line 10**

Não mudei nada em src/Modelo/Carro.php, mantive a mesma estrutura passada no curso. Entendi que o dado não pode ser NULL. Mas como faço para buscar o dado e salvar na outra tabela? Qual a maneira correta de fazer isto?

2 respostas

E aí, Rodrigo!

Primeiro, bora corrigir esse código. Se liga nessa mudança na função salvar:

public function salvar(Carro $carro)
{
    $sql2 = $this->pdo->prepare("SELECT * FROM marcas WHERE id=:idMarca ");
    $sql2->bindValue(":idMarca", $carro->getId_Marca());
    $sql2->execute();
    
    if ($row2 = $sql2->fetch(PDO::FETCH_ASSOC)) {
        $marca = $row2["marca"];

        $sql = "INSERT INTO carros (id_marca, marca, modelo, versao) VALUES (?,?,?,?)";
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1, $carro->getId_Marca());
        $statement->bindValue(2, $marca);
        $statement->bindValue(3, $carro->getModelo());
        $statement->bindValue(4, $carro->getVersao());
        $statement->execute();
    }
}

Agora, a consulta SQL tá pegando o valor da marca e, se a consulta encontrar algo, ele faz o INSERT. Mas ó, ainda tem uma parada que precisa ser ajustada: na linha $statement->bindValue(4, $carro->getVersao);, tá faltando os parênteses no getVersao. Então, bora corrigir isso também: $statement->bindValue(4, $carro->getVersao());.

Faz essas mudanças e vê se resolve o problema do NULL na hora de inserir na outra tabela. Se continuar dando erro, pode mandar mais detalhes que a gente resolve!

Bom dia.. Fiz a alteração citada acima e seguiu alertando o mesmo erro: NULL. A solução foi voltar no modelo (pasta de modelos) e colocar "?" antes da variável marca, do mesmo jeito que tem no id. Resolvido.