Jump to content
Rafacharkman

Duvida sobre download automático em PHP

Recommended Posts

Alguém sabe me dizer como que eu faço para o PHP solicitar um download automaticamente dentro de um loop? tentei usar o header() juntamente com o readfile() porém não estou conseguindo pois o 1ª download trava o loop. (algo como aqueles gerenciadores de download do MEGA ou se possível zippar e baixar)

 

 

Share this post


Link to post
Share on other sites

Download dentro de loop não vai funcionar. Você deve usar a opção de zippar e baixar tudo no final.

 

Segue trecho do meu código para fazer download em zip de uma pasta (na qual deve gravar os arquivos antes).

Está dentro de classe, é só tirar os private e os $this-> se não usar classes no seu código.

//PASSE O CAMINHO DA PASTA COM OS ARQUIVOS E O CAMINHO DO ZIP A SER CRIADO.

        private function addzip($source, $destination)
        {
            $files_to_zip = glob($source . '/*');
            $this->create_zip($files_to_zip, $destination);
        }


private function create_zip($files = array(), $dest = '', $overwrite = false)
        {
            if(file_exists($dest) && !$overwrite)
            {
                return false;
            }
            if(($files))
            {
                $zip = new ZipArchive();
                if($zip->open($dest, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true)
                {
                    return false;
                }
                foreach($files as $file)
                {
                    $zip->addFile($file, basename($file));
                }
                $zip->close();
                return file_exists($dest);
            }
            else
            {
                return false;
            }
        }

 

COMO USEI PARA GERAR O ZIP E BAIXAR, APÓS TER A PASTA COM OS ARQUIVOS;


 

$this->addzip(APP.DS.'webroot'.DS.'nfes'.DS.'zip_'.$cnpj.str_replace('-', '', $in.$fi), APP.DS.'webroot'.DS.'nfes'.DS.'zip_'.$cnpj.str_replace('-', '', $in.$fi).'.zip');


header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"zip_".$cnpj.str_replace('-', '', $in.$fi).".zip\"");
echo readfile(APP.DS.'webroot'.DS.'nfes'.DS.'zip_'.$cnpj.str_replace('-', '', $in.$fi).'.zip');

 

Share this post


Link to post
Share on other sites

Vlw robson o/
Só que me veio outra duvida, como eu faço por exemplo para adicionar um arquivo que esteja armazenado em uma string? (no caso uma imagem que esteja em texto no banco de dados ou vindo de um link externo)
file_get_contents() já é o suficiente? como faço? Tentei aqui mas não funcionou, parece que ele só lê diretórios =/

 

@EDIT 

Consegui resolver, vou deixar aqui abaixo para quem quiser consultar

<?php
//cria a função ziparchive(). 
$zip = new ziparchive();		

//Caso o arquivo exista somente o acessa, caso não exista cria o arquivo
if(file_exists('./zipfile.zip')) {
		$zip->open('./zipfile.zip'); 
	} else { 
		$zip->open('./zipfile.zip', ziparchive::CREATE);
	}

//Se o arquivo estiver no diretório ou computador...
$zip->addFile('./img.jpg', $newName);

//se o arquivo estiver contido em uma string...
$img = file_get_contents('https://...');
$zip->addFromString('imagem.jpg',$img);

//fecha a solicitação '$zip->open'
$zip->close();

//caso queira enviar uma solicitação de download ao cliente, checa se o arquivo foi criado e faz download
//NOTA: as vezes dependendo do tamanho do arquivo, pode demorar ao mesmo concluir e o criar
//NOTA2: unlink() exclui o arquivo criado do servidor
if(file_exists('./zipfile.zip')){
  header('Content-Type: application/zip');
  header('Content-Disposition: attachment; filename="zipfile.zip"');

  readfile('./zipfile.zip');
  unlink('./zipfile.zip');
}

 

Share this post


Link to post
Share on other sites

Apareceu um novo problema kk'
o ziparchive() retornou um erro quando o tamanho do arquivo passou de 256MB, tem como converter ele para algo como ziparchive64()? To pesquisando porém não encontro nada a respeito... falam que o limite vai até 4GB mas não sei como fazer isso...

 

@EDIT 

eu descobri oque era, na verdade era a memória que ficou cheia pelo uso do addFromString()

Citar

Caso você ainda queira usar o PHP ZipArchive , existem algumas coisas que você pode fazer para evitar certas limitações do servidor / sistema operacional:

  • Memória Embora possa parecer óbvio no seu caso, tenho visto muitos exemplos de como usar o ZipArchive que usam addFromString para adicionar um novo arquivo ao arquivo. NÃO! Isso irá alocar memória para abrir o arquivo e armazenar seu conteúdo nele, o que fará com que você fique sem memória rapidamente, use addFile . Certifique-se também de liberar toda a memória de que não precisa.

  • Tempo de execução Aumenta o tempo máximo de execução do seu script, seja pelo php.ini ou com ini_set (por exemplo, ini_set('max_execution_time', 600);para ter um tempo máximo de execução de 10min)

  • Identificadores de arquivos Alguns sistemas operacionais têm limites quanto ao número de arquivos abertos que podem causar problemas, pois o PHP só adiciona os arquivos ao arquivo zip depois de fechar o arquivo zip. Para evitar problemas com o número de arquivos abertos basta fechar e reabrir o arquivo zip a cada arquivo x (por exemplo, a cada 1000), isso forçará o PHP a compactar e adicionar os arquivos já atribuídos ao arquivo.

  • Tamanho do arquivo Pode haver algumas limitações de tamanho de arquivo do sistema operacional, um arquivo maior também significa que o PHP precisa de mais memória para gerenciá-lo, então eu pessoalmente prefiro usar um tamanho de arquivo máximo após o qual eu apenas abro um novo arquivo zip usando um número de índice . Se o tamanho exato do arquivo não é importante para você, você pode apenas contar o tamanho dos arquivos que vão para o arquivo e depois mudar depois de atingir um certo limite, ou você pode fechar o arquivo todos os arquivos x e verificar seu tamanho no disco para decida se deseja iniciar um novo arquivo ou não (lembre-se, os arquivos só são compactados depois de fechar o arquivo)


Eu pessoalmente gosto de limitar o tamanho do arquivo colocando o tamanho dos arquivos no arquivo e aplicando um fator de compressão provável para ver quando o tamanho máximo do arquivo provavelmente será atingido (arquivos jpg ~ 0.9, arquivos zip = 1, arquivos de texto ~ 0.10, ...) e, em seguida, mude para o próximo volume.

 

Referência: StackOverflow

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By asacap1000
      Galera já não sei mais onde procurar, estou configurando o processo de login com certificação digital porém não consigo ler o retorno. No site da Certisign explica em java e .Net mas utilizo em minha aplicação da intranet tudo em PHP como eu teria que fazer. Segue exemplo que eles fornecem em .Net
       
      <form action="https://autenticador.certisign.com.br/CertisignLogin/certificado/login" method="get"> <input type="hidden" value="209" id="id" name="id"> <input type="hidden" value="CHAVE CRIPTOGRAFICA INICIAL" id="nome" name="nome"> <input type="hidden" value="http://www.seusite.com.br/suaAplicacao/retorno" id="retorno" name="retorno"> <div> <input type="image" src="images/ico-certisign_30x30.png" alt="Submit" id="btnLoginCertisign"> </div> </form> O de cima envia até aí tudo bem
       
      Abaixo o retorno que é o que não consigo fazer em PHP
       
      string retorno = Request["cb"]; string encryptionKey = "<conteúdo da chave criptográfica descarregada na etapa 2>"; retorno = CryptoLogin.Instance.DecryptText(retorno,encryptionKey);</conteúdo> A variável retorno deverá mostrar as informações como o exemplo aaixo.
       
      CertificadoBean: { emissor: Certisign Autoridade Certificadora TESTE, nome: "PROPRIETARIO DO CERTIFICADO DE TESTE", cpf: "001.002.003-44", cnpj: "", OAB: "", validade: "2015-05-27 20:59:59", emissao: "2014-05-27 21:00:00", email: "proprietario.teste@certisign.com.br", certificadoBase64: "MIIFmDCCBICgAwI...... BAQUFADCCARAx" }  
    • By Camilavip
      Queria saber como fazer esse select e quando eu trazer um estado ele já puxa as cidades contidos nele, e ao escolher a cidade ele trazer os bairros. Consegui pela internet mas só com estados e cidades. no caso em 2 níveis, e eu precisaria em 3, faço pelo mysqli
       
      Em estados no banco está assim
      CREATE TABLE `estados` ( `id_estado` int(10) NOT NULL, `estado` varchar(30) NOT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1; -- -- Extraindo dados da tabela `estados` -- INSERT INTO `estados` (`id_estado`, `estado`) VALUES (1, 'Rio de Janeiro'), (2, 'Minas Gerais'); Cidades
      CREATE TABLE `cidades` ( `id_cidade` int(10) NOT NULL, `id_estado` int(10) NOT NULL, `cidade` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Extraindo dados da tabela `cidades` -- INSERT INTO `cidades` (`id_cidade`, `id_estado`, `cidade`) VALUES (1, 1, 'Rio de Janeiro'), (2, 2, 'Belo Horizonte'); E bairros
      CREATE TABLE `bairros` ( `id_bairro` int(10) NOT NULL, `id_cidade` int(10) NOT NULL, `bairro` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Extraindo dados da tabela `bairros` -- INSERT INTO `bairros` (`id_bairro`, `id_cidade`, `bairro`) VALUES (1, 1, 'Centro'), (2, 1, 'Tijuca'), (3, 1, 'Leblon'), (4, 2, 'Pampulha');  
    • By danilo759
      Estou com uma dúvida, em uma tabelinha é cadastrado a data em uma coluna e a hora em outra coluna, então para "juntar" podemos usar CONCAT() no SELECT. Tudo certo...
       
      SELECT id, CONCAT(data_ini, ' ', hora_ini) as inicio FROM tabela

      Retorna como esperado:

       

      Minha dúvida é, se eu quiser exibir o horário de término para ficar assim como seria a consulta? Lembrando que não existe as colunas data_final e horario_final.

      2020-09-13 03:00:00 2020-09-13 04:00:00
      2020-09-13 04:00:00 2020-09-13 05:00:00
      2020-09-13 05:00:00 ....
    • By Alex Oliveira Dos Santos
      Boa tarde, após pesquisar muito e passar 2 dias tentando resolver estou aqui pedindo um super help.
      Estou utilizando a classe NfePhp mas ao gerar o xml, o mesmo amontoa os nós xml "det" tudo um dentro do outro, e eu não faço ideia do porque e como corrigir, por postar o arquivo que monto e o xml gerado, além de uma imagem ilustrativa do problema:
       
       
       
      <?php /** * Created by Alex O. Santos. * Date: 30/09/2019 * Time: 10:29 */ //namespace Classes; //use NFePHP\NFe\Make; use NFePHP\NFe; use NFePHP\NFe\Make; use NFePHP\NFe\Tools; use NFePHP\Common\Certificate; //use stdClass; class GerarNFE { private $config; private $tools; public function __construct($config) { $this->config = $config; $configJson = json_encode($config);//adicionado novo 29-06-2020 $certificadoDigital = file_get_contents("asasasasa.pfx"); $password = '123456'; $this->tools = new Tools($configJson, Certificate::readPfx($certificadoDigital, $password)); //$xmlAssinado = $tools->signNFe($xml); } public function GerarNFE(){ //cria a nota vazia $nfe = new Make(); /** INF NFE **/ $std = new \stdClass(); $std->versao = '4.00'; //versão do layout //$std->Id = 'NFe35150271780456000160550010000000021800700082'; //se o Id de 44 digitos não for passado será gerado automaticamente $std->pk_nItem = null; //deixe essa variavel sempre como NULL $nfe->taginfNFe($std); /** IDE **/ $std = new \stdClass(); $std->cUF = 42;//codigo uf ibge $std->cNF = rand(11111111, 99999999);// 80070008 aleatorio $std->natOp = 'Venda de mercadoria adquirida ou recebida de terceiros';//natureza de operação $std->indPag = 0; //NÃO EXISTE MAIS NA VERSÃO 4.00 $std->mod = 55; $std->serie = 1; $std->nNF = 2;//numero da nota $std->dhEmi = date("Y-m-d\TH:i:sP");//2015-02-19T13:48:00-02:00 $std->dhSaiEnt = date("Y-m-d\TH:i:sP");//estava null $std->tpNF = 1;//entrada ou saida $std->idDest = 1;//dentro ou fora do estado *** 1=Operação interna, 2=Operação interestadual, 3=Operação com exterior $std->cMunFG = 4204608;//criciuma conforme ibge $std->tpImp = 1;//2=paisagem ou 1=retrato $std->tpEmis = 1;//normal ou contingencia $std->cDV = 3;//digito verificador $std->tpAmb = 2;//1 = Produção[É o ambiente designado para documentos com valor fiscal]. 2= Homologação[É o ambiente de testes]. $std->finNFe = 1;//complementar ou normal ou ajuste $std->indFinal = 1;//se é consumidor final ou nao $std->indPres = 1;//nao esta presente presencial ou nao $std->procEmi = 0;//sempre zero aplicativo contribuite(erp) $std->verProc = '1.0.0';//versão do erp $std->dhCont = null;//data e hora que entrou em contingencia $std->xJust = null;//justificativa se entrou em contingencia $nfe->tagide($std); /** EMITENTE **/ $std = new \stdClass(); $std->xNome = "NET BIBLIAS COMERCIO DE ARTIGOS EVANGELICOS LTDA-ME";//razão social $std->xFant = "NET BIBLIAS COMERCIO DE ARTIGOS EVANGELICOS LTDA-ME";//nome fantasia $std->IE = "258591137";//obrigatório $std->IEST = ""; $std->IM = "";//OPCIONAL $std->CNAE = "";//OPCIONAL $std->CRT = "1";//regime tributário? $std->CNPJ = "16604805000184"; //indicar apenas um CNPJ ou CPF $std->CPF = ""; $nfe->tagemit($std); /** ENDEREÇO EMITENTE **/ $std = new \stdClass(); $std->xLgr = "Rua Carlos Otaviano Seara"; $std->nro = "349"; $std->xCpl = "";//nao é mais necessário $std->xBairro = "Nossa Senhora da Salete"; $std->cMun = "4204608"; $std->xMun = "Criciúma"; $std->UF = "SC"; $std->CEP = "88813410"; $std->cPais = "1058"; $std->xPais = "Brasil"; $std->fone = "48999689698"; $nfe->tagenderEmit($std); /** DESTINATÁRIO **/ $std = new \stdClass(); $std->xNome = "Alex Olivera Santos"; $std->indIEDest = "2";//1=tem ie 2=nao tem ie @@@Luiz esta como 9 $std->IE = ""; $std->ISUF = "";//manaus $std->IM = "";//inscricao municipal obrigatorio $std->email = "alexsc2011@gmail.com"; $std->CNPJ = ""; //indicar apenas um CNPJ ou CPF ou idEstrangeiro $std->CPF = "04587351911"; $std->idEstrangeiro = null;///acho que é passaporte ou null $nfe->tagdest($std); /** ENDEREÇO DESTINATÁRIO **/ $std = new \stdClass(); $std->xLgr = "Rua Roberto Burlemax"; $std->nro = "118"; $std->xCpl = ""; $std->xBairro = "Ceará"; $std->cMun = "4204608"; $std->xMun = "Criciúma"; $std->UF = "SC"; $std->CEP = "88815092"; $std->cPais = "1058"; $std->xPais = "Brasil"; $std->fone = "62994430218"; $nfe->tagenderDest($std); //inicio foreach de produtos /** PRODUTOS **/ $std = new \stdClass(); $std->item = 1; //item da NFe //contador com count++ incrementando a cada passada, começar com 1 $std->cProd = "4634";// $std->cEAN = "SEM GTIN";//codigo de barras caixa (obrigatório?) $std->xProd = "OLEO DE UNcaO 60 ML";//interrno sistema $std->NCM = "15122990";// $std->cBenef = ""; //incluido no layout 4.00 $std->EXTIPI = ""; $std->CFOP = "6102";//codigo da saida se é saida se é entrada pra outro estado etc $std->uCom = "UND";// $std->qCom = "2.0000";//quantidade??? $std->vUnCom = "6.9900000000";//valor do produto???? $std->cEANTrib = "SEM GTIN";//codigo de barras item separado $std->uTrib = "UND";// $std->qTrib = "1.0000";//quantidade $std->vUnTrib = "13.98";// anterior $std->vUnTrib = "13.9800000000" $aa = $std->qTrib; $bb = $std->vUnTrib; $teste = $aa * $bb; $std->vProd = $teste;//"13.98";// $std->vFrete = "47.66";// $std->vSeg = ""; $std->vDesc = ""; $std->vOutro = ""; $std->indTot = 1;//integrar item ao resultado da nota (padrão) $nfe->tagprod($std); /** IMPOSTO **/ $std = new \stdClass(); $std->item = 1; //item da NFe mesmo id de cima do produto $std->vTotTrib = 4.00;//pegar do ibpt api total de imposto do produto? $nfe->tagimposto($std); /** ICMS **/ $std = new \stdClass(); $std->item = 1; //item da NFe $std->orig = 0;//0=nacional 1=importado $std->CST = "00"; //faltou igualar luiz??? CSOSN <CSOSN>103</CSOSN> $std->modBC = 0; //return $std->vProd;// TESTE XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX $std->vBC = $teste; $std->pICMS = "18.00";//percentual de imposto $std->vICMS = $std->vBC * $std->pICMS / 100;//valor base icns $nfe->tagICMS($std); // aqui só vai montar se for interstadual $std = new \stdClass(); $std->item = 1; //item da NFe seguir o mesmo do produto for $std->vBCUFDest = 13.98;//valor unitário precoBase ??? $std->vBCFCPUFDest = 0.00; $std->pFCPUFDest = 0.0000; $std->pICMSUFDest = 18.0000;//18 é padrao pra todos??? $std->pICMSInter = 7.00;//estava 12.00 $std->pICMSInterPart = 100.0000; $std->vFCPUFDest = 0.00; $std->vICMSUFDest = 0.00; $std->vICMSUFRemet = 0.00; $nfe->tagICMSUFDest($std); // fim aqui só monta se for interstadual $std = new \stdClass(); $std->item = 1; $std->cEnq = '999'; $std->CST = '50'; $std->vIPI = 0; $std->vBC = 0; $std->pIPI = 0; $nfe->tagIPI($std); /** PIS **/ $std = new \stdClass(); $std->item = 1; //item da NFe $std->CST = '01';// $std->vBC = $teste;// nota luiz esta 0.00 ??? $std->pPIS = "0.0000";// $std->vPIS = $std->vBC * ($std->pPIS / 100);// ou shekinah "0.00" ??? ;u padrão $std->vProd $std->qBCProd = null; $std->vAliqProd = null; $nfe->tagPIS($std); $std = new \stdClass(); $std->item = 1; $std->vCOFINS = 0; $std->vBC = 0; $std->pCOFINS = 0; $nfe->tagCOFINSST($std); /** COFINS **/ $std = new \stdClass(); $std->item = 1; //item da NFe $std->CST = '01';//estava 50 $std->vBC = 0.00;// $teste; para o caso de apenas um item, senao somar tudo, valor pago pelo cliente Luiz esta 0.00 ??? $std->pCOFINS = 0.0000; $std->vCOFINS = 0.00;//$std->vBC * ($std->pCOFINS / 100) estava assim $std->qBCProd = null; $std->vAliqProd = null; $nfe->tagCOFINS($std); /** IPI **/ // fim monta o foreach de cada produto //inicio foreach de produtos /** PRODUTOS **/ $std = new \stdClass(); $std->item = 2; //item da NFe //contador com count++ incrementando a cada passada, começar com 1 $std->cProd = "4634";// $std->cEAN = "SEM GTIN";//codigo de barras caixa (obrigatório?) $std->xProd = "OLEO DE UNcaO 60 ML";//interrno sistema $std->NCM = "15122990";// $std->cBenef = ""; //incluido no layout 4.00 $std->EXTIPI = ""; $std->CFOP = "6102";//codigo da saida se é saida se é entrada pra outro estado etc $std->uCom = "UND";// $std->qCom = "2.0000";//quantidade??? $std->vUnCom = "6.9900000000";//valor do produto???? $std->cEANTrib = "SEM GTIN";//codigo de barras item separado $std->uTrib = "UND";// $std->qTrib = "1.0000";//quantidade $std->vUnTrib = "13.98";// anterior $std->vUnTrib = "13.9800000000" $aa = $std->qTrib; $bb = $std->vUnTrib; $teste = $aa * $bb; $std->vProd = $teste;//"13.98";// $std->vFrete = "47.66";// $std->vSeg = ""; $std->vDesc = ""; $std->vOutro = ""; $std->indTot = 2;//integrar item ao resultado da nota (padrão) $nfe->tagprod($std); /** IMPOSTO **/ $std = new \stdClass(); $std->item = 2; //item da NFe mesmo id de cima do produto $std->vTotTrib = 4.00;//pegar do ibpt api total de imposto do produto? $nfe->tagimposto($std); /** ICMS **/ $std = new \stdClass(); $std->item = 2; //item da NFe $std->orig = 0;//0=nacional 1=importado $std->CST = "00"; //faltou igualar luiz??? CSOSN <CSOSN>103</CSOSN> $std->modBC = 0; //return $std->vProd;// TESTE XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX $std->vBC = $teste; $std->pICMS = "18.00";//percentual de imposto $std->vICMS = $std->vBC * $std->pICMS / 100;//valor base icns $nfe->tagICMS($std); // aqui só vai montar se for interstadual $std = new \stdClass(); $std->item = 2; //item da NFe seguir o mesmo do produto for $std->vBCUFDest = 13.98;//valor unitário precoBase ??? $std->vBCFCPUFDest = 0.00; $std->pFCPUFDest = 0.0000; $std->pICMSUFDest = 18.0000;//18 é padrao pra todos??? $std->pICMSInter = 7.00;//estava 12.00 $std->pICMSInterPart = 100.0000; $std->vFCPUFDest = 0.00; $std->vICMSUFDest = 0.00; $std->vICMSUFRemet = 0.00; $nfe->tagICMSUFDest($std); // fim aqui só monta se for interstadual $std = new \stdClass(); $std->item = 2; $std->cEnq = '999'; $std->CST = '50'; $std->vIPI = 0; $std->vBC = 0; $std->pIPI = 0; $nfe->tagIPI($std); /** PIS **/ $std = new \stdClass(); $std->item = 2; //item da NFe $std->CST = '01';// $std->vBC = $teste;// nota luiz esta 0.00 ??? $std->pPIS = "0.0000";// $std->vPIS = $std->vBC * ($std->pPIS / 100);// ou shekinah "0.00" ??? ;u padrão $std->vProd $std->qBCProd = null; $std->vAliqProd = null; $nfe->tagPIS($std); $std = new \stdClass(); $std->item = 2; $std->vCOFINS = 0; $std->vBC = 0; $std->pCOFINS = 0; $nfe->tagCOFINSST($std); /** COFINS **/ $std = new \stdClass(); $std->item = 2; //item da NFe $std->CST = '01';//estava 50 $std->vBC = 0.00;// $teste; para o caso de apenas um item, senao somar tudo, valor pago pelo cliente Luiz esta 0.00 ??? $std->pCOFINS = 0.0000; $std->vCOFINS = 0.00;//$std->vBC * ($std->pCOFINS / 100) estava assim $std->qBCProd = null; $std->vAliqProd = null; $nfe->tagCOFINS($std); // fim monta o foreach de cada produto /** TOTAIS **/ $std = new \stdClass(); $std->vBC = $teste; $std->vICMS = '0.00'; $std->vICMSDeson = ''; $std->vFCP = ''; //incluso no layout 4.00 $std->vBCST = ''; $std->vST = ''; $std->vFCPST = ''; //incluso no layout 4.00 $std->vFCPSTRet = ''; //incluso no layout 4.00 $std->vProd = $teste; $std->vFrete = ''; $std->vSeg = ''; $std->vDesc = ''; $std->vII = ''; $std->vIPI = ''; $std->vIPIDevol = ''; //incluso no layout 4.00 $std->vPIS = ''; $std->vCOFINS = ''; $std->vOutro = ''; $std->vNF = ''; $std->vTotTrib = '0.00'; $nfe->tagICMSTot($std); /** TRANSPORTADORA **/ $std = new \stdClass(); $std->modFrete = 1; $nfe->tagtransp($std); /** VOLUME **/ $std = new \stdClass(); $std->item = '1'; //indicativo do numero do volume $std->qVol = '2';//QTD VOLUME $std->esp = 'caixa'; $std->marca = 'OLX'; $std->nVol = '11111'; /*$std->pesoL = 10.50; $std->pesoB = 11.00;*/ $nfe->tagvol($std); /** PAGAMENTO **/ $std = new \stdClass(); $std->vTroco = null; //incluso no layout 4.00, obrigatório informar para NFCe (65) $nfe->tagpag($std); /** DETALHE DO PAGAMENTO **/ $std = new \stdClass(); $std->tPag = '14';//forma de pgto $std->vPag = 200.00; //Obs: deve ser informado o valor pago pelo cliente $std->CNPJ = '12345678901234'; $std->tBand = '01'; $std->cAut = '3333333'; $std->tpIntegra = 1; //incluso na NT 2015/002 $std->indPag = '0'; //0= Pagamento à Vista 1= Pagamento à Prazo $nfe->tagdetPag($std); /** INFORMAÇÕES ADICIONAIS **/ $std = new \stdClass(); $std->infAdFisco = 'informacoes para o fisco'; $std->infCpl = 'informacoes complementares'; $nfe->taginfAdic($std); /** MONTA A NF-E **/ $result = $nfe->montaNFe(); /** **/ //$result = $nfe->monta(); /** **/ //$result = $nfe->monta(); /** **/ //$xml = $nfe->getXML(); /** **/ //$chave = $nfe->getChave(); //var_dump($result); if($nfe->montaNFe()){ return $nfe->getXML();//funfando }else{ echo 'Erro ao gerar NF-e'; var_dump($nfe); return ; }/**/ } public function sign($xml){ try { $xmlAssinado = $this->tools->signNFe($xml); return $xmlAssinado; } catch (\Exception $e) { exit('erro: '.$e->getMessage().' ::: '.$xml); } //return var_dump($this->tools->signNFe($xml)); } } resultado xml gerado
      <!--?xml version="1.0" encoding="UTF-8"?--> <nfe xmlns="http://www.portalfiscal.inf.br/nfe"><infnfe id="NFe42200916604805000184550010000000021777050308" versao="4.00"><ide><cuf>42</cuf><cnf>77705030</cnf><natop>Venda de mercadoria adquirida ou recebida de terceiros</natop><mod>55</mod><serie>1</serie><nnf>2</nnf><dhemi>2020-09-10T17:51:52-03:00</dhemi><dhsaient>2020-09-10T17:51:52-03:00</dhsaient><tpnf>1</tpnf><iddest>1</iddest><cmunfg>4204608</cmunfg><tpimp>1</tpimp><tpemis>1</tpemis><cdv>8</cdv><tpamb>2</tpamb><finnfe>1</finnfe><indfinal>1</indfinal><indpres>1</indpres><procemi>0</procemi><verproc>1.0.0</verproc></ide><emit><cnpj>16604805000184</cnpj><xnome>NET BIBLIAS COMERCIO DE ARTIGOS EVANGELICOS LTDA-ME</xnome><xfant>NET BIBLIAS COMERCIO DE ARTIGOS EVANGELICOS LTDA-ME</xfant><enderemit><xlgr>Rua Carlos Otaviano Seara</xlgr><nro>349</nro><xbairro>Nossa Senhora da Salete</xbairro><cmun>4204608</cmun><xmun>Criciúma</xmun><uf>SC</uf><cep>88813410</cep><cpais>1058</cpais><xpais>Brasil</xpais><fone>48999689698</fone></enderemit><ie>258591137</ie><crt>1</crt></emit><dest><cpf>04587351911</cpf><xnome>NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL</xnome><enderdest><xlgr>Rua Roberto Burlemax</xlgr><nro>118</nro><xbairro>Ceará</xbairro><cmun>4204608</cmun><xmun>Criciúma</xmun><uf>SC</uf><cep>88815092</cep><cpais>1058</cpais><xpais>Brasil</xpais><fone>62994430218</fone></enderdest><indiedest>2</indiedest><email>alexsc2011@gmail.com</email></dest><det nitem="1"><det nitem="2"><det nitem="1"><prod><cprod>4634</cprod><cean>SEM GTIN</cean><xprod>OLEO DE UNcaO 60 ML</xprod><ncm>15122990</ncm><cfop>6102</cfop><ucom>UND</ucom><qcom>2.0000</qcom><vuncom>6.9900000000</vuncom><vprod>13.98</vprod><ceantrib>SEM GTIN</ceantrib><utrib>UND</utrib><qtrib>1.0000</qtrib><vuntrib>13.98</vuntrib><vfrete>47.66</vfrete><indtot>1</indtot></prod><imposto><vtottrib>4.00</vtottrib><icms><icms00><orig>0</orig><cst>00</cst><modbc>0</modbc><vbc>13.98</vbc><picms>18.0000</picms><vicms>2.52</vicms></icms00></icms><ipi><cenq>999</cenq><ipitrib><cst>50</cst><vbc>0.00</vbc><pipi>0.0000</pipi><vipi>0.00</vipi></ipitrib></ipi><pis><pisaliq><cst>01</cst><vbc>13.98</vbc><ppis>0.0000</ppis><vpis>0.00</vpis></pisaliq></pis><cofins><cofinsaliq><cst>01</cst><vbc>0.00</vbc><pcofins>0.0000</pcofins><vcofins>0.00</vcofins></cofinsaliq></cofins><cofinsst><vbc>0.00</vbc><pcofins>0.0000</pcofins><vcofins>0.00</vcofins></cofinsst><icmsufdest><vbcufdest>13.98</vbcufdest><vbcfcpufdest>0</vbcfcpufdest><pfcpufdest>0.0000</pfcpufdest><picmsufdest>18.0000</picmsufdest><picmsinter>7.00</picmsinter><picmsinterpart>100.0000</picmsinterpart><vfcpufdest>0</vfcpufdest><vicmsufdest>0</vicmsufdest><vicmsufremet>0</vicmsufremet></icmsufdest></imposto></det><det nitem="2"><prod><cprod>4634</cprod><cean>SEM GTIN</cean><xprod>OLEO DE UNcaO 60 ML</xprod><ncm>15122990</ncm><cfop>6102</cfop><ucom>UND</ucom><qcom>2.0000</qcom><vuncom>6.9900000000</vuncom><vprod>13.98</vprod><ceantrib>SEM GTIN</ceantrib><utrib>UND</utrib><qtrib>1.0000</qtrib><vuntrib>13.98</vuntrib><vfrete>47.66</vfrete><indtot>2</indtot></prod><imposto><vtottrib>4.00</vtottrib><icms><icms00><orig>0</orig><cst>00</cst><modbc>0</modbc><vbc>13.98</vbc><picms>18.0000</picms><vicms>2.52</vicms></icms00></icms><ipi><cenq>999</cenq><ipitrib><cst>50</cst><vbc>0.00</vbc><pipi>0.0000</pipi><vipi>0.00</vipi></ipitrib></ipi><pis><pisaliq><cst>01</cst><vbc>13.98</vbc><ppis>0.0000</ppis><vpis>0.00</vpis></pisaliq></pis><cofins><cofinsaliq><cst>01</cst><vbc>0.00</vbc><pcofins>0.0000</pcofins><vcofins>0.00</vcofins></cofinsaliq></cofins><cofinsst><vbc>0.00</vbc><pcofins>0.0000</pcofins><vcofins>0.00</vcofins></cofinsst><icmsufdest><vbcufdest>13.98</vbcufdest><vbcfcpufdest>0</vbcfcpufdest><pfcpufdest>0.0000</pfcpufdest><picmsufdest>18.0000</picmsufdest><picmsinter>7.00</picmsinter><picmsinterpart>100.0000</picmsinterpart><vfcpufdest>0</vfcpufdest><vicmsufdest>0</vicmsufdest><vicmsufremet>0</vicmsufremet></icmsufdest></imposto></det><total><icmstot><vbc>13.98</vbc><vicms>0.00</vicms><vicmsdeson>0.00</vicmsdeson><vfcp>0.00</vfcp><vbcst>0.00</vbcst><vst>0.00</vst><vfcpst>0.00</vfcpst><vfcpstret>0.00</vfcpstret><vprod>13.98</vprod><vfrete>95.32</vfrete><vseg>0.00</vseg><vdesc>0.00</vdesc><vii>0.00</vii><vipi>0.00</vipi><vipidevol>0.00</vipidevol><vpis>0.00</vpis><vcofins>0.00</vcofins><voutro>0.00</voutro><vnf>109.30</vnf></icmstot></total><transp><modfrete>1</modfrete><vol><qvol>2</qvol><esp>caixa</esp><marca>OLX</marca><nvol>11111</nvol></vol></transp><pag><detpag><indpag>0</indpag><tpag>14</tpag><vpag>200.00</vpag><card><tpintegra>1</tpintegra><cnpj>12345678901234</cnpj><tband>01</tband><caut>3333333</caut></card></detpag></pag><infadic><infadfisco>informacoes para o fisco</infadfisco><infcpl>informacoes complementares</infcpl></infadic></det></det></infnfe></nfe>  

    • By iguulima
      Ola a todos,
      Estou com uma dúvida e ja tentei de tudo que estão dentro das minhas limitações de conhecimento. Tenho um laço de repetição While sendo executado e quero que uma Variavel seja executada apenas uma vez dentro desse laço. Existe essa possibilidade. Obrigado a todos. Segue o código:

       
      <?php $consult = $row['id']; $sql = "SELECT * FROM upload_data WHERE USER_CODE = '$consult' ORDER BY id ASC"; $resultadoimg = mysql_query($sql); $numero_registros = mysql_num_rows($resultadoimg); while($registrosimg = mysql_fetch_array($resultadoimg)) { ?> <li data-target="#carousel-custom" data-slide-to="0" <?php ele precisa ser executado uma unica vez aqui?>><img src="" alt=""></li> <?php } ?>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.