Deleu 0 Denunciar post Postado Abril 19, 2011 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
Luiz Henrique 1 Denunciar post Postado Abril 19, 2011 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
Deleu 0 Denunciar post Postado Abril 19, 2011 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
Deleu 0 Denunciar post Postado Abril 20, 2011 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
criatividade zero 17 Denunciar post Postado Abril 20, 2011 pq nao grava em forma de string? passa a array para string determinando um 'separador', depois quando for listar o conteudo, basta dar um explode Compartilhar este post Link para o post Compartilhar em outros sites
Carlos Francisco Pinheiro 0 Denunciar post Postado Abril 21, 2011 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
Bruno Augusto 417 Denunciar post Postado Abril 21, 2011 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
Carlos Francisco Pinheiro 0 Denunciar post Postado Abril 21, 2011 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
Bruno Augusto 417 Denunciar post Postado Abril 21, 2011 :blush: Opa! Foi mal, li rápido demais. Compartilhar este post Link para o post Compartilhar em outros sites
Deleu 0 Denunciar post Postado Abril 25, 2011 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
Periscuelo 20 Denunciar post Postado Abril 25, 2011 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
Deleu 0 Denunciar post Postado Abril 25, 2011 É 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
Periscuelo 20 Denunciar post Postado Abril 25, 2011 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