Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problema com refatoração do código

Senhores, boa tarde, tendo em vista exercitar o que venho aprendendo, no curso de php, resolvi fazer alguns formulários, e como já era de se esperar diversos problemas estão surgindo. Com base no conhecimento adquirido no módulo de PDO resolvi refatorar um função de meu pequeno projeto, mas infelizmente não obtive êxito. O erro abaixo ocorre

PDOException Object
(
    [message:protected] => SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
    [string:Exception:private] => 
    [code:protected] => HY093
    [file:protected] => C:\xampp\htdocs\UO-BA\class\Servidor.php
    [line:protected] => 94
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [file] => C:\xampp\htdocs\UO-BA\class\Servidor.php
                    [line] => 94
                    [function] => execute
                    [class] => PDOStatement
                    [type] => ->
                    [args] => Array
                        (
                        )

                )

            [1] => Array
                (
                    [file] => C:\xampp\htdocs\UO-BA\adiciona-servidor.php
                    [line] => 18
                    [function] => inserir
                    [class] => Servidor
                    [type] => ->
                    [args] => Array
                        (
                        )

                )

        )

    [previous:Exception:private] => 
    [errorInfo] => Array
        (
            [0] => HY093
            [1] => 0
        )

)

Função que está funcionando corretamente

function insereServidor (Servidor $servidor) {
    $query = "INSERT INTO servidores (hostname,ip,rede,localizacao,observacao) VALUES ('{$servidor->getHostname()}','{$servidor->getIp()}','{$servidor->getRede()->getId()}','{$servidor->getLocalizacao()->getId()}','{$servidor->getObservacao()}')";

    $cadastrar = mysqli_query($this->conexao,$query);

    $id_servidor = mysqli_insert_id($this->conexao);

    foreach ($servidor->getFuncao() as $id_funcao) {
        $query = "INSERT INTO servidor_funcao(cod_servidor,cod_funcao) values($id_servidor,$id_funcao)";
        mysqli_query($this->conexao,$query);
    } 

    foreach ($servidor->getInterface() as $id_interface) {
        $query = "INSERT INTO servidor_interface(cod_servidor,cod_interface) values($id_servidor,$id_interface)";
        mysqli_query($this->conexao,$query);
    } 


    return $cadastrar;

}

Função refatorada que está apresentando erro. Acredito que seja no foreach.



public function inserir()

    {

        $query = "INSERT INTO servidores(hostname, ip, rede, localizacao, observacao) VALUES (:hostname, :ip, :rede, :localizacao, :observacao)";
        $conexao = Conexao::pegarConexao();
        $stmt = $conexao->prepare($query);
        $stmt->bindValue(':hostname', $this->hostname);
        $stmt->bindValue(':ip',$this->ip);
        $stmt->bindValue(':rede',$this->rede);
        $stmt->bindValue(':localizacao',$this->localizacao);
        $stmt->bindValue(':observacao',$this->observacao);
        $stmt->execute();

        $id_servidor = $conexao->lastInsertId();

        foreach ($this->funcao as  $id_funcao) 
        {
            $query = "INSERT INTO servidor_funcao(cod_servidor,cod_funcao) VALUES (:id_servidor, :id_funcao)";
            $conexao = Conexao::pegarConexao();
            $stmt->bindValue(':id_servidor',$id_servidor);
            $stmt->bindValue(':id_funcao',$id_funcao); // linha 94
            $stmt->execute();
        }


        foreach ($this->interface as  $id_interface) 
        {
            $query = "INSERT INTO servidor_interface(cod_servidor,cod_interface) VALUES (:id_servidor, :id_interface)";
            $conexao = Conexao::pegarConexao();
            $stmt->bindValue(':id_servidor',$id_servidor);
            $stmt->bindValue(':id_interface',$id_interface);
            $stmt->execute();
        }
    }
1 resposta
solução!

Olá, Gerson.

Você se esqueceu de dar o prepare da sua segunda query.

...
$query = "INSERT INTO servidor_funcao(cod_servidor,cod_funcao) VALUES (:id_servidor, :id_funcao)";
$conexao = Conexao::pegarConexao();
$stmt->bindValue(':id_servidor',$id_servidor);
...

Esta variável $stm ainda tem o SQLStatement da query de cima que dá insert em servidores.

Outra coisa que seria legal você fazer, é dar o prepare fora do foreach, já que só um dos dois parâmetros muda. Assim:


.
.
.
$id_servidor = $conexao->lastInsertId();
$query = "INSERT INTO servidor_funcao(cod_servidor,cod_funcao) VALUES (:id_servidor, :id_funcao)";
$stmt = $conexao->prepare($query);
$stmt->bindValue(':id_servidor',$id_servidor);

foreach ($this->funcao as  $id_funcao) 
{
    $stmt->bindValue(':id_funcao',$id_funcao); // linha 94
    $stmt->execute();
}
.
.
.

Vê se isso esclarece... Abraços e bons estudos!