Jump to content


Photo

Load Data Infile


  • Faça o login para participar
5 replies to this topic

#1 georgewar

georgewar

    Let's upgrade myself

  • Usuários
  • 169 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro - RJ
  • Interesses:PHP - JavaScript

Posted 09/05/2008, 14:30

Galera, estou fazendo esta query através de um script PHP

(mysql): LOAD DATA LOCAL INFILE 'C:/xampp/htdocs/sistem/upload/controledetarifas/1210353994SQL.csv' INTO TABLE val_tarifas_169 FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES(cod_tipo_saldo, cod_destino, dat_inicio, dat_termino, val_tarifa);

o problema é o seguinte:

quando eu executo o mesmo script com servidor PHP em windows (minha CPU) tá certo,
quando eu executo o mesmo script com servidor PHP em linux (servidor final) dá esse erro:

ERROR 1148: The used command is not allowed with this MySQL version

obs: o banco de dados está em outro computador, ou seja, SO PODE SER UM PROBLEMA DE CONFIGURAÇÃO DO PHP! ??
ou não?

alguma solução?

#2 EternaL

EternaL

    12 Horas

  • Usuários
  • 299 posts
  • Sexo:Masculino
  • Localidade:Blumenau, SC

Posted 09/05/2008, 14:34

Qual a versão do MySQL usada no seu servidor.

Se você ler bem, ali dis que há um comando na sua query, que não pode ser usado nessa versão do MySQL.
Magnum Web - Trazendo o melhor da web para você

Desenvolvimento de websites e sistemas web. Acesse http://www.magnumweb.com.br

#3 GGSP

GGSP

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 09/05/2008, 15:13

ola gerogewar, vc poderia postar o seu codigo inteiro, porque estou tentando a mesma coisa, mas nem no servidor local eu estou conseguindo importar os dados csv...

Obrigado
GGSP

#4 Maykel Esser

Maykel Esser

    Super Veterano

  • Usuários
  • 1536 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR

Posted 09/05/2008, 15:29

esse comando não existe na versão do MYSQL do seu servidor final... porém no seu servidor local existe.

(y)

Se este post lhe ajudou, ajude o fórum também. Use a reputação de mensagens! add.png


#5 georgewar

georgewar

    Let's upgrade myself

  • Usuários
  • 169 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro - RJ
  • Interesses:PHP - JavaScript

Posted 09/05/2008, 18:33

esse comando não existe na versão do MYSQL do seu servidor final... porém no seu servidor local existe.

(y)

como eu havia falado acima, o servidor MYSQL é o mesmo, só muda o servidor PHP
a versão do mysql é a 5.0.37
...

so adicionando: (das configurações do mysql....)
local infile   	 ON
ou seja, na minha opinião erro de conf do PHP, mas onde?

ola gerogewar, vc poderia postar o seu codigo inteiro, porque estou tentando a mesma coisa, mas nem no servidor local eu estou conseguindo importar os dados csv...

Obrigado
GGSP

<?
/**
 * @author G.w.A.r em 28/04/2008
 * @name classe Controledetarifas
 * @desc Provém controle sobre a tabela TLISTA_TARIFAS (constante)
 * @access final (não deverá haver classes filhas)
 */
final class Controledetarifas extends Database{

	/**
	 * @name método __construct
	 * @desc seleciona o banco de dados e a tabela. Define a classe atual como executora!
	 * @param $conexao | define a mesma conexão atual
	 */
	public function __construct($conexao = NULL){
		parent::__construct($conexao);
		$this->setDB($banco=DBBILHETAGEM,TLISTA_TARIFAS);
		$this->setClassName(__CLASS__);
		$this->initFields();
		$this->nCancelado = "(UNIX_TIMESTAMP(A.dat_termino)>UNIX_TIMESTAMP(CURRENT_TIMESTAMP) or A.dat_termino is
		null)";
	}

	/**
	 * @name método getDados
	 * @desc executa uma consulta no banco de dados
	 * @param $where | retorna as condições formatadas
	 */
	public function getInformacoesCT($where){
		$from = $this->getTable()." A ";
		return parent::consulta($fields_str="*",$from ,$where);
	}

	/**
	 * @name método cadastro
	 * @desc cadastra informações na tabela TLISTA_TARIFAS
	 * @param $arraydados | campo -> valor para ser cadastrado
	 */
	public function cadastro($arraydados){
		if(parent::inserir($arraydados))
		return true;
		else
		return false;
	}

	/**
	 * @name método insertTableFromCSV
	 * @desc insere os dados do arquivo CSV na tabela val_tarifas_??
	 * @param $UploadedFileName | nome do arquivo enviado pelo usuário a ser lido
	 * @param $ArrCod_tipo_saldo | array com os tipos de saldos selecionados
	 * @param $dat_inicio | data de inicio selecionado pelo usuário
	 * @param $dat_termino | data de termino selecionado pelo usuário
	 * @param $idtabela  | id databela val_tarifas_??
	 * @param $acao | edição ou cadastro
	 */
	public function createFormatedCSVtoSQL($UploadedFileName, $ArrCod_tipo_saldo, $dat_inicio, $dat_termino, $idtabela, $acao){

		//prepara a conexao para as consultas de tarifas de destino
		parent::setDB(DBBILHETAGEM,TDESTINOS);
		
		//caminho do arquivo
		$filePath = PATH_UPLOAD."/controledetarifas/";
		
		//seta o tempo limite com uma previsão de 50 linhas por segundo!
		$numerodelinhas = count(file($filePath.$UploadedFileName));
		set_time_limit(floor($numerodelinhas/50));

		//ponteiro do arquivo csv
		$handle = fopen($filePath.$UploadedFileName,"r");

		//formata primeira linha do arquivo CSV a ser criado (as colunas)
		$strnewCSVfile = '"cod_tipo_saldo";"cod_destino";"dat_inicio";"dat_termino";"val_tarifa"'."\r\n";
		
		//formata as datas
		function formatadata($datacomhora){
			$data_hora = explode(" ", $datacomhora);
			$pedacosData = explode("/", $data_hora[0]);
			return "{$pedacosData[2]}-{$pedacosData[1]}-{$pedacosData[0]} {$data_hora[1]}";
		}
		$dat_inicioFinal = formatadata($dat_inicio);
		$dat_terminoFinal = empty($dat_termino) ? "" : formatadata($dat_termino);

		//navega em cada linha não importanto o tamanho do arquivo
		while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
			//pula primeira linha (titulo das colunas)
			$i++;
			if($i > 1){
				//formata campos do valor
				$valortarifa = number_format($data[2], 2, ".", "");
				
				//busca o cod_destino para o telefone do CSV enviado
				parent::consultaSQL("SELECT cod_destino FROM ".TDESTINOS." WHERE num_telefone = '{$data[0]}' LIMIT 1");
				$cod_destino = parent::getRegistro();
		
				//se houver cod_destino para este número
				if(!empty($cod_destino)){
					//formata X linhas de acordo com o Nº de cod_tipo_saldo marcados
					foreach($ArrCod_tipo_saldo as $cod_tipo_saldo){
						//começa a formatar linha a ser colocada no novo CSV
						$strnewCSVfile .= '"'.$cod_tipo_saldo.'";"'.$cod_destino['cod_destino'].'";"'.$dat_inicioFinal.'";"'.$dat_terminoFinal.'";"'.$valortarifa.'"'."\r\n";
					}
				}
			}
		}
		
		try{
			//cria novo CSV pronto para inserção no banco de dados
			if(!$ponteiro = fopen($filePath.trim($UploadedFileName,".csv")."SQL.csv","w"))
			throw new Exception();
			//escreve no CSV criado
			if(!fwrite($ponteiro, $strnewCSVfile))
			throw new Exception();
			return true;
		}
		catch(Exception $e){
			//desfaz tudo e retorna false
			parent::setDB(DBBILHETAGEM,TLISTA_TARIFAS);
			parent::excluir("cod_tbl_tarifa = ".$idtabela);
			parent::consultaSQL("DROP TABLE val_tarifas_".$idtabela);
			return false;
		}
	}

	/**
	 * @name método makeTable
	 * @desc cria a tabela "val_tarifas_??"
	 * @param $idtabela | id da tabela TLISTA_TARIFAS		 
	 */
	public function makeTable($idtabela){
		//formata o nome da tabela
		$nometabela = "val_tarifas_".$idtabela;
		//formata o comando SQL
		$parametros = "
		CREATE TABLE {$nometabela} (
		cod_tarifa BIGINT(21) UNSIGNED NOT NULL AUTO_INCREMENT,
		cod_tipo_saldo INTEGER UNSIGNED NOT NULL,
		cod_destino BIGINT UNSIGNED NOT NULL,
		dat_inicio TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
		dat_termino TIMESTAMP NULL,
		val_tarifa FLOAT(12,6) NOT NULL,
		PRIMARY KEY(cod_tarifa),
		INDEX val_tarifas_FKIndex1(cod_destino),
		INDEX val_tarifas_FKIndex2(cod_tipo_saldo),
		FOREIGN KEY (cod_tipo_saldo) REFERENCES ".TTIPOSALDO."(cod_tipo_saldo)
		ON DELETE RESTRICT ON UPDATE CASCADE,
		FOREIGN KEY (cod_destino) REFERENCES ".TDESTINOS."(cod_destino)
		ON DELETE CASCADE ON UPDATE CASCADE
		)
		TYPE=InnoDB;
		";
		//verifica se foi executado com êxito @ true = ok | false = não ok
		//apaga a row inserida em TLISTA_TARIFAS caso haja falhas
		
		if(parent::consultaSql($parametros) !== 0)
		return true;
		else{
			
		parent::excluir("cod_tbl_tarifa = ".$idtabela);
		return false;
		}
	}
	
	/**
	 * @name método insertTarifasFromCSV
	 * @desc insere o conteúdo do CSV gerado pelo método createFormatedCSVtoSQL 
	 * na tabela gerada pelo método makeTable
	 * @param $UploadedFileName | nome do arquivo enviado pelo usuário a ser lido
	 * @param $acao | edição ou cadastro
	 */
	public function insertTarifasFromCSV($UploadedFileName, $idtabela, $acao){
		
		$ignore = ($acao = EDITAR) ? "REPLACE" : "";
		
		//pasta base do arquivo
		$path = explode("includes", __FILE__);
		$filePath = str_replace("\\","/",$path[0]."upload/controledetarifas/");
		
		
		//arquivo SQL
		$arquivoCSVSQL = $filePath.trim($UploadedFileName,".csv")."SQL.csv";
		
		//comando SQL que insere dados a partir de um CSV
		$comandoSQL = "LOAD DATA LOCAL INFILE '$arquivoCSVSQL' $ignore"
						. " INTO TABLE val_tarifas_{$idtabela}"
						. " FIELDS TERMINATED BY ';'"
						. " ENCLOSED BY '\"'"
						. " LINES TERMINATED BY '\\r\\n'"
						. " IGNORE 1 LINES"
						. "(cod_tipo_saldo, cod_destino, dat_inicio, dat_termino, val_tarifa);";

		//executa o codigo
		if(parent::consultaSql($comandoSQL) !== 0){
		//apaga os arquivos
		unlink($filePath.$UploadedFileName);
		unlink($arquivoCSVSQL);
		return true;
		}
		else{
		parent::setDB(DBBILHETAGEM,TLISTA_TARIFAS);
		parent::excluir("cod_tbl_tarifa = ".$idtabela);
		parent::consultaSQL("DROP TABLE val_tarifas_".$idtabela);
		return false;
		}
	}

	/**
	 * @name método cancelar
	 * @desc chama a funcao abstrata "cancelar" requerida
	 * @param $id | id do item a ser cancelado
	 */
	public function cancelar($id){
		$arrDadosTabela['dat_termino'] = date("Y-m-d H:i:s");
		parent::atualizar($arrDadosTabela, " cod_tbl_tarifa = ".$id);
	}

}
?>

divirta-se

#6 georgewar

georgewar

    Let's upgrade myself

  • Usuários
  • 169 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro - RJ
  • Interesses:PHP - JavaScript

Posted 19/05/2008, 17:39

as vezes ajude alguem a solução:
você deve passar um parametro junto à conexão do mysql

Example: $dbh = mysql_connect($server, $user, $pass, false, 128);

128 equivale a local-infile=1 sem precisar recompilar o PHP

fonte: http://dev.mysql.com...data-local.html

Edição feita por: georgewar, 19/05/2008, 17:41.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq