Ir para conteúdo

POWERED BY:

Arquivado

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

Deleu

Inserir Array PHP no banco MySQL

Recommended Posts

Pessoal, existe alguma função automatizada de inserção de um Array inteiro na base de dados? Para ser mais claro com o que quero, segue a função:

 

/**
 * __errorLog
 * Insere informações de erros no Array errorLog.
 *
 * @param	String	$error		Mensagem de erro
 * @param	int	$errno		Número do erro
 * @param	String	$errorline	Linha deste arquivo que chamou a função __errorLog
 * @param	String	$errortype	Tipo de erro [user | mysql | php]
 * @param	String	$errorquery	Query de erro, usando quando type = mysql
 *
 */
 private function __errorLog($error, $errno, $errorline, $errortype='', $errorquery=''){
	 $errorLog		 	=	array();
	 $errorLog['isError']		=	true;
	 $errorLog['Msg']		=	$error;
	 $errorLog['No']		=	$errno;
	 $errorLog['Type']		=	$errortype;
	 $errorLog['Line']		=	$errorline;
	 $errorLog['Query']		=	$errorquery;		 
	 $this->errorLog[]		=	$errorLog;
 }//Fim __errorLog

 

 

Daí, o que eu quero seria +/- assim:

INSERT INTO errorlog VALUES {$errorlog};

As colunas no banco seriam exatamente as colunas do array, possibilitando essa "automatização".

Enfim, tem jeito ou preciso inserir na mão dado a dado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi, mas você não poderia criar um laço de repetição e executálo enquanto tiver dados no array?

ex:

$array = array("registro1","registro2","registro3"....);

for($c = 0; $c < $array.length; $c++){
   mysql_qeury("INSERT INTO tabela (campo) VALUES ('".$array[$c]."')");
}

 

Não sei se é isso que quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, você não entendeu, acho que expressei errado. Isso aí seria facilmente resolvido com um foreach.

A questão é a seguinte: Eu não quero informar ao banco quais são as colunas, ex:

 

A Síntaxe INSERT:

INSERT INTO {table} (`col1`, `col2`,..., `coln`) VALUES ('val1', 'val2', ... , 'valn');

 

Eu não quero ter que usar isso, uma vez que o array possui como index o mesmo nome das colunas. Quero saber se existe alguma forma de o MySQL obter este array e saber que as informações no index "Msg" vão na coluna Msg e que as informações na index "Query" vão na coluna Query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aparentemente não há soluções práticas dentro do MySQL ou do PHP.

Desenvolvi um Script Rápido para resolver meu problema:

 

	$index = array_keys($errorLog);
	$query = "INSERT INTO errorlog(";
	foreach($index as $key){
		$query .= $key.", ";
	}
	$query = substr($query, 0, -2);
	$query .= ") VALUES (";		

	foreach($errorLog as $el){
		$query .= "'$el', ";
	}
	$query = substr($query, 0, -2);			
	$query .= ");";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem maneiras mais organizadas de se fazer.

<?php

function quebra_galho($nome_da_tabela, $array) // Um nome bem explicativo...
{
   $chaves = implode(', ', array_keys($array));
   $valores = implode(', ', array_map(function ($valor) { return "'$valor'"; }, array_values($array)));
   return sprintf("INSERT INTO $nome_da_tabela (%s) VALUES (%s)", $chaves, $valores);
}

// E só para testar:
echo quebra_galho('log_de_erro', array('Erro' => true, 'Msg' => "Deu m&rd@!!", 'Line' => 80));
// Resultado => INSERT INTO log_de_erro (Erro, Msg, Line) VALUES ('1', 'Deu m&rd@!!', '80')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos Francisco sua solução apesar de funcional pressupõe que cada item desse array entrará numa coluna específica o que, num contexto mais amplo (de um Painel Administrativo por exemplo), seria, de fato, o melhor.

 

Mas pelo que o Deleu postou, dá a entender que vai tudo num campo só e, para isso, use serialize() para gravare unserialize() para ler.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas pelo que o Deleu postou, dá a entender que vai tudo num campo só e, para isso, use serialize() para gravare unserialize() para ler.

 

Bem, ele disse:

As colunas no banco seriam exatamente as colunas do array, possibilitando essa "automatização".

 

De fato a "solução" só vai servir pra isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem maneiras mais organizadas de se fazer.

Entendi, em partes, algumas coisas que você fez aí e, se entendi bem, me interessei, mas está dando erro na segunda linha da função.

$valores = implode(', ', array_map(function ($valor) { return "'$valor'"; }, array_values($array)));

Imagino que seja por ter uma function recebendo $valor, mas esta function não tem nome.

 

Carlos Francisco sua solução apesar de funcional pressupõe que cada item desse array entrará numa coluna específica o que, num contexto mais amplo (de um Painel Administrativo por exemplo), seria, de fato, o melhor.Mas pelo que o Deleu postou, dá a entender que vai tudo num campo só e, para isso, use serialize() para gravare unserialize() para ler.

Então, na realidade não era exatamente isso, talvez eu me expressei pior do que eu pensava.

O que eu preciso é o seguinte: Imagine que uma dada tabela possui colunas:

id | Msg | No | Type | Line | Query

E eu tenho um Array com essas exatas Index. O que eu queria era uma função que, quando eu entregasse o Array, ele soubesse aonde colocar cada valor. Supomos que um dia eu adicione nessa tabela a coluna:

errorTime | algumaCoisa

Daí, tudo que eu precisaria seria preencher o Array PHP com estes exatos indexes, ele já automaticamente adicionaria essas informações na tabela sem eu ter que alterar uma linha de código na Query executada. Vocês podem ver que a minha solução (script postado acima) eu passo o Array por dois foreach, um pra pegar cada index e outro para pegar cada valor. Como index = coluna, tudo que eu preciso para montar a Query são os indexes.

 

 

Ps.: Desculpa a demora, mas é que esse Tópico tá assinado no meu Email de serviço e não trabalho desde quarta passada ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Deleu eu acredito que $this->errorLog deva ser seu valor final então, porque fazer um array bi-dimensional?

Não poderia ser $this->errorLog = $errorLog; ?

Pois se fosse desta maneira bastaria usar um implode()

Fiz algumas modificações na sua função para poder usar o implode() mas existem diversas maneiras de se fazer oque você quer.

 

private function __errorLog($error, $errno, $errorline, $errortype='', $errorquery=''){
                $errorLog                      =       array();
                $errorLog['isError']           =       NULL;
                $errorLog['Msg']               =       '\''.$error.'\'';
                $errorLog['No']                =       $errno;
                $errorLog['Type']              =       '\''.$errortype.'\'';
                $errorLog['Line']              =       $errorline;
                $errorLog['Query']             =       '\''.$errorquery.'\'';             
                $this->errorLog                =       $errorLog;
}

$sql = 'INSERT INTO errorlog VALUES ('.implode(',',$this->errorLog).')';
$query = mysql_query($sql) or die(mysql_error());

Acredito que desta forma funcione normalmente se seu ID for auto_increment e os campos numéricos forem INT.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É array bi-dimensional porque existe a possibilidade de múltiplos erros durante a execução da classe. Mas para isso, nada que um foreach não resolva.

Mas então, sua solução quase resolveu por completo meu problema. Sei que o chato disso daí é que eu sempre vou ter que preencher todos os valores por causa que a quantidade de colunas e a quantidade de dados terão que ser compatíveis. Mas ok, aceito isso.

Mas com isso daí, vou precisar de soluções cabulosas para problemas simples: Strings e aspas. Quando ocorre erro de Síntaxe no MySQL, ele retorna uma mensagem de erro e usa apóstrofo nela. Daí, quando eu for tentar gravar a String de erro, vou ter um erro. (Intrigante, não?)

 

No mais, a sua solução foi a que eu mais me interessei, já que a do Carlos tá me informando erro de Sintax no PHP. Só preciso de um jeito de conciliar a inserção de Strings e o uso da função addslashes().

 


public function insertError(){
	foreach($this->errorLog as $error){
		$sql = 'INSERT INTO errorlog VALUES ('.implode(',',$error).')';
		$sql = addslashes($sql);
		$query = $this->mysqli->query($sql);
		if($this->mysqli->error){
			//die('<br><br>'.$this->mysqli->error . " <br> " . $sql);
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim amigo Deleu:

 

       public function insertError(){
               foreach($this->errorLog as $error){
                       $errors = array_map('addslashes',$error);
                       $sql = 'INSERT INTO errorlog VALUES ('.implode(',',$errors).')';
                       $query = $this->mysqli->query($sql);
                       if($this->mysqli->error){
                               //die('<br><br>'.$this->mysqli->error . " <br> " . $sql);
                       }
               }
       }

ou coloque o addslashes na outra função:

 

private function __errorLog($error, $errno, $errorline, $errortype='', $errorquery=''){
                $errorLog                      =       array();
                $errorLog['isError']           =       NULL;
                $errorLog['Msg']               =       '\''.addslashes($error).'\'';
                $errorLog['No']                =       $errno;
                $errorLog['Type']              =       '\''.addslashes($errortype).'\'';
                $errorLog['Line']              =       $errorline;
                $errorLog['Query']             =       '\''.addslashes($errorquery).'\'';             
                $this->errorLog[]              =       $errorLog;
}

Como disse antes existem varias maneiras de se fazer oque você quer, mas se for apenas para funcionar acredito que sirva.

 

Abraços.

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.