Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gabrielfalieri

Erro de insert com arrays

Recommended Posts

Fala Galera do IMasters

Eu estou com um probleminha para fazer um insert com arrays, e não consigo identificar o que está acontecendo

 try
        {
            foreach(self::pegaUltimoID() as $key => $value){
                $id = $value->IDPartner;
            }

            foreach($this->cargoResponsavel as $key => $value){
                $sql = "INSERT INTO $this->prt_partner_responsible VALUES (NULL,:cargo,:nome,:id)";
                $stmt = DB::prepare($sql);
                $stmt->bindParam(":cargo",$this->cargoResponsavel[$key],PDO::PARAM_STR);
                $stmt->bindParam(":nome",$this->nome[$key],PDO::PARAM_STR);
                $stmt->bindParam(":id",$id,PDO::PARAM_INT);
                return $stmt->execute();
            }

        }
        catch(PDOException $ex){
            $this->Caminho = explode("/", $_SERVER['SCRIPT_NAME']);
            $this->arquivo = $this->Caminho[count($this->Caminho)-1];
            $this->arquivoLog = 'log/erros.txt';
            $this->erro =  $ex->getCode();
            $this->mensagem  = $ex->getMessage();
            erro($this->arquivo,$this->arquivoLog,$this->erro,$this->prt_partner,$this->mensagem);
        }

Já fiz uns testes, com esse foreach, que pega as posições certinhas do meu array, porém ele só insere a primeira posição do array.

Exemplo


cargoResposavel = Array ( [0] => Presidente [1] => Diretora Financeira )
nome = Array([0] => Marina [1] => Fernanda)
Nesse caso só insere Presidente e Marina, não o campo de diretora financeira
Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

Correto seria

$sql = "INSERT INTO $this->prt_partner_responsible VALUES (:cargo,:nome,:id)";
$stmt = DB::prepare($sql);

foreach($this->cargoResponsavel as $key => $value){
    
    $stmt->bindParam(":cargo",$this->cargoResponsavel[$key],PDO::PARAM_STR);
    $stmt->bindParam(":nome",$this->nome[$key],PDO::PARAM_STR);
    $stmt->bindParam(":id",$id,PDO::PARAM_INT);
   
}

$stmt->execute();

seus binds dentro do loop e o restante fora e sem return que para a execução!


Compartilhar este post


Link para o post
Compartilhar em outros sites

Vendo seu código que gambiarra é esta?

$this->Caminho = explode("/", $_SERVER['SCRIPT_NAME']);
$this->arquivo = $this->Caminho[count($this->Caminho)-1];
$this->arquivoLog = 'log/erros.txt';
$this->erro = $ex->getCode();
$this->mensagem = $ex->getMessage();
erro($this->arquivo,$this->arquivoLog,$this->erro,$this->prt_partner,$this->mensage)

A Exception retorna tudo isso, até o path do script e linha onde ocorreu o erro, com getFile


catch(PDOException $e){

    //correto é usar a função so para pegar o objeto
    erro($e);

}

e para lançar o erro

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)

$this->pdo-> é sua conexão

Desta forma não sei se da pra testar, pois não sabemos se foi declarada dentro do escopo a PDO::ERRMODE_EXCEPTION

$stmt = DB::prepare($sql);

Compartilhar este post


Link para o post
Compartilhar em outros sites

 try
        {
            foreach(self::pegaUltimoID() as $key => $value){
                $id = $value->IDPartner;
            }
            $sql = "INSERT INTO $this->prt_partner_responsible VALUES (NULL,:cargo,:nome,:id)";
            $stmt = DB::prepare($sql);
            foreach($this->cargoResponsavel as $key => $value){
                echo $sql;

                $stmt->bindParam(":cargo",$this->cargoResponsavel[$key],PDO::PARAM_STR);
                $stmt->bindParam(":nome",$this->nome[$key],PDO::PARAM_STR);
                $stmt->bindParam(":id",$id,PDO::PARAM_INT);

                $stmt->execute();
            }

        }
        catch(PDOException $ex){
            $this->Caminho = explode("/", $_SERVER['SCRIPT_NAME']);
            $this->arquivo = $this->Caminho[count($this->Caminho)-1];
            $this->arquivoLog = 'log/erros.txt';
            $this->erro =  $ex->getCode();
            $this->mensagem  = $ex->getMessage();
            erro($this->arquivo,$this->arquivoLog,$this->erro,$this->prt_partner,$this->mensagem);
        }

Ficou desse jeito

Eu pego essas informações porque eu tenho um log de tudo isso, até salvo no banco de dados.

Preciso isso, regras da empresa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, mas isso poderia fica em um arquivo unico, se voce tiver 10 inserts diferentes, vai copiar e colar? Isso fere o básico dos princípios SOLID

O correto é criar uma classe que captura os erros para pegar e criar o arquivo de log etc

Exemplo:

class ExceptionDatabase extends Exception
{
	
	function __construct(argument)
	{
		# code...
	}
}
catch(PDOException $ex){
    throw new ExceptionDatabase($ex, E_USER_NOTICE);
}

Mas em fim...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.