Ir para conteúdo

POWERED BY:

Williams Duarte

Members
  • Total de itens

    3978
  • Registro em

  • Última visita

  • Dias vencidos

    47

Tudo que Williams Duarte postou

  1. Williams Duarte

    Instalador

    Vamos lá, ofuscar o código pode parecer uma boa ideia para proteger a propriedade intelectual e impedir a engenharia reversa, mas há várias razões pelas quais isso pode não ser a melhor abordagem: 1. Manutenção Difícil Ofuscar o código torna a manutenção extremamente difícil. Se um bug ou problema surgir, a depuração de código ofuscado pode ser um pesadelo, mesmo para os desenvolvedores originais. Isso pode aumentar significativamente o tempo e o custo de manutenção do software. 2. Impacto na Performance A ofuscação pode introduzir complexidade desnecessária e aumentar o tempo de execução do código. Variáveis e funções com nomes curtos podem parecer menores, mas o processamento adicional para interpretar e executar o código pode impactar negativamente o desempenho. 3. Problemas de Compatibilidade Ferramentas de ofuscação podem gerar código que não é totalmente compatível com todas as versões de PHP ou com todas as bibliotecas e frameworks utilizados. Isso pode levar a erros inesperados e problemas difíceis de diagnosticar. 4. Segurança Ilusória A ofuscação oferece uma falsa sensação de segurança. Hackers experientes ainda podem deofuscar ou contornar a proteção. A segurança do software deve ser baseada em boas práticas de codificação, controle de acesso e criptografia de dados sensíveis, não apenas na ofuscação do código. 5. Dificuldade de Integração Trabalhar com outras equipes ou integrar o código em sistemas maiores pode ser complicado quando o código está ofuscado. A colaboração é prejudicada, pois o entendimento do código é severamente limitado. 6. Experiência do Desenvolvedor A ofuscação degrada a experiência do desenvolvedor. Novos desenvolvedores que se juntam ao projeto enfrentarão uma curva de aprendizado muito mais íngreme e terão dificuldade em contribuir eficazmente para o código base. 7. Problemas de Licenciamento Se o seu software depende de bibliotecas de terceiros, a ofuscação pode violar os termos de licença dessas bibliotecas, que muitas vezes exigem que as modificações sejam visíveis e compreensíveis. Conclusão Embora a ofuscação possa parecer uma solução para proteger o código, os contras superam os prós na maioria dos casos. A segurança e a proteção da propriedade intelectual devem ser alcançadas através de boas práticas de desenvolvimento, revisões de código, testes de segurança e uma sólida arquitetura de software. A ofuscação pode ser uma camada adicional de proteção, mas não deve ser a principal estratégia de segurança.
  2. Williams Duarte

    DRAP AND DROP

    Abaixo um exemplo de funções mais microgerenciadas, com documentação indicando se cada função é uma função pura ou não: <?php define('MAX_FILE_LIMIT', 1024 * 1024 * 2); // Tamanho máximo de arquivo HTML de 2 megabytes define('ALLOW_PHP', false); // Verifique se o html salvo contém tag php e não salve se não for permitido define('ALLOWED_OEMBED_DOMAINS', [ 'https://www.youtube.com/', 'https://www.vimeo.com/', 'https://www.twitter.com/' ]); // Carregar URLs apenas de sites permitidos para oembed /** * Sanitiza o nome do arquivo. * Função pura. */ function sanitizeFileName($file, $allowedExtension = 'html') { $basename = getBaseName($file); if (isDisallowedFile($basename)) { showError('Nome de arquivo não permitido!'); return ''; } $file = sanitizeFilePath($file); if ($file) { $file = __DIR__ . DIRECTORY_SEPARATOR . $file; } else { return ''; } if ($allowedExtension) { $file = addAllowedExtension($file, $allowedExtension); } return $file; } /** * Retorna o nome base do arquivo. * Função pura. */ function getBaseName($file) { return basename($file); } /** * Verifica se o arquivo é um dos arquivos não permitidos. * Função pura. */ function isDisallowedFile($basename) { $disallow = ['.htaccess', 'passwd']; return in_array($basename, $disallow); } /** * Sanitiza o caminho do arquivo. * Função pura. */ function sanitizeFilePath($file) { return preg_replace('@\?.*$@', '', preg_replace('@\.{2,}@', '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file))); } /** * Adiciona a extensão permitida ao arquivo. * Função pura. */ function addAllowedExtension($file, $allowedExtension) { return preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension"; } /** * Exibe uma mensagem de erro e encerra a execução. * Função pura. */ function showError($error) { header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); die($error); } /** * Verifica se a URL é permitida para oEmbed. * Função de alta ordem. */ function validOembedUrl($url) { return array_reduce(ALLOWED_OEMBED_DOMAINS, fn($valid, $domain) => $valid || strpos($url, $domain) === 0, false); } /** * Copia o diretório fonte para o diretório de destino. * Função não pura (opera no sistema de arquivos). */ function copyDirectory($src, $dst) { $dir = openDirectory($src); createDirectory($dst); while (false !== ($file = readDirectory($dir))) { if (isNotSpecialDir($file)) { $srcFilePath = $src . '/' . $file; $dstFilePath = $dst . '/' . $file; if (isDirectory($srcFilePath)) { copyDirectory($srcFilePath, $dstFilePath); } else { copyFile($srcFilePath, $dstFilePath); } } } closeDirectory($dir); } /** * Abre um diretório. * Função não pura (opera no sistema de arquivos). */ function openDirectory($path) { return opendir($path); } /** * Cria um diretório. * Função não pura (opera no sistema de arquivos). */ function createDirectory($path) { return @mkdir($path); } /** * Lê um diretório. * Função não pura (opera no sistema de arquivos). */ function readDirectory($dir) { return readdir($dir); } /** * Verifica se o arquivo não é um diretório especial (. ou ..). * Função pura. */ function isNotSpecialDir($file) { return ($file != '.' && $file != '..'); } /** * Verifica se o caminho é um diretório. * Função não pura (opera no sistema de arquivos). */ function isDirectory($path) { return is_dir($path); } /** * Copia um arquivo de origem para o destino. * Função não pura (opera no sistema de arquivos). */ function copyFile($src, $dst) { return copy($src, $dst); } /** * Fecha um diretório. * Função não pura (opera no sistema de arquivos). */ function closeDirectory($dir) { closedir($dir); } /** * Processa as ações com base no tipo de ação. * Função de alta ordem. */ function processAction($action, $data) { $actions = [ 'rename' => function($data) { $newfile = sanitizeFileName($data['newfile']); if ($data['file'] && $newfile) { if (rename($data['file'], $newfile)) { echo "Arquivo '{$data['file']}' renomeado para '$newfile'"; } else { showError("Erro ao renomear arquivo '{$data['file']}' para '$newfile'"); } } }, 'delete' => function($data) { if ($data['file']) { if (unlink($data['file'])) { echo "Arquivo '{$data['file']}' excluído"; } else { showError("Erro ao excluir arquivo '{$data['file']}'"); } } }, 'saveReusable' => function($data) { $type = $data['type'] ?? false; $name = $data['name'] ?? false; $html = $data['html'] ?? false; if ($type && $name && $html) { $file = sanitizeFileName("$type/$name"); if ($file) { $dir = dirname($file); if (!is_dir($dir)) { echo "$dir pasta não existe\n"; if (mkdir($dir, 0777, true)) { echo "$dir pasta foi criada\n"; } else { showError("Erro ao criar pasta '$dir'\n"); } } if (file_put_contents($file, $html)) { echo "Arquivo salvo '$file'"; } else { showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!"); } } else { showError('Nome de arquivo inválido!'); } } else { showError("Faltam dados de elementos reutilizáveis!\n"); } }, 'oembedProxy' => function($data) { $url = $data['url'] ?? ''; if (validOembedUrl($url)) { header('Content-Type: application/json'); echo file_get_contents($url); } else { showError('URL inválida!'); } } ]; if (isset($actions[$action])) { $actions[$action]($data); } else { showError("Ação inválida '$action'!"); } } $html = ''; $file = ''; $action = ''; if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) { $startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']); if ($startTemplateUrl) { $templateDir = dirname($startTemplateUrl); $targetDir = __DIR__ . '/Projetos/' . sanitizeFileName($_POST['folder']); copyDirectory($templateDir, $targetDir); $html = file_get_contents($startTemplateUrl); } } else if (isset($_POST['html'])) { $html = substr($_POST['html'], 0, MAX_FILE_LIMIT); if (!ALLOW_PHP) { if (containsPHP($html)) { showError('PHP não permitido!'); } } } if (isset($_POST['file'])) { $file = sanitizeFileName($_POST['file']); } if (isset($_GET['action'])) { $action = sanitizeAction($_GET['action']); } if ($action) { processAction($action, [ 'file' => $file, 'newfile' => $_POST['newfile'] ?? '', 'type' => $_POST['type'] ?? '', 'name' => $_POST['name'] ?? '', 'html' => $_POST['html'] ?? '', 'url' => $_GET['url'] ?? '' ]); } else { if ($html) { if ($file) { if (!is_dir($dir = dirname($file))) { echo "$dir pasta não existe\n"; if (!mkdir($dir, 0777, true)) { showError("Erro ao criar pasta '$dir'\n"); } } if (file_put_contents($file, $html)) { echo "Arquivo salvo '$file'"; } else { showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!"); } } else { showError('O nome do arquivo está vazio!'); } } else { showError('O conteúdo HTML está vazio!'); } } /** * Verifica se o conteúdo contém PHP. * Função pura. */ function containsPHP($html) { return preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html); } /** * Sanitiza a ação recebida via GET. * Função pura. */ function sanitizeAction($action) { return htmlspecialchars(strip_tags($action)); } ?> Explicações das Funções: sanitizeFileName: Sanitiza o nome do arquivo. Função pura. getBaseName: Retorna o nome base do arquivo. Função pura. isDisallowedFile: Verifica se o arquivo é um dos arquivos não permitidos. Função pura. sanitizeFilePath: Sanitiza o caminho do arquivo. Função pura. addAllowedExtension: Adiciona a extensão permitida ao arquivo. Função pura. showError: Exibe uma mensagem de erro e encerra a execução. Função pura. validOembedUrl: Verifica se a URL é permitida para oEmbed. Função de alta ordem. copyDirectory: Copia o diretório fonte para o diretório de destino. Função não pura. openDirectory: Abre um diretório. Função não pura. createDirectory: Cria um diretório. Função não pura. readDirectory: Lê um diretório. Função não pura. isNotSpecialDir: Verifica se o arquivo não é um diretório especial (. ou ..). Função pura. isDirectory: Verifica se o caminho é um diretório. Função não pura. copyFile: Copia um arquivo de origem para o destino. Função não pura. closeDirectory: Fecha um diretório. Função não pura. processAction: Processa as ações com base no tipo de ação. Função de alta ordem. containsPHP: Verifica se o conteúdo contém PHP. Função pura. sanitizeAction: Sanitiza a ação recebida via GET. Função pura. Este código agora está mais modularizado com funções microgerenciadas, facilitando a leitura e manutenção, além de seguir princípios de programação funcional onde aplicável.
  3. Williams Duarte

    DRAP AND DROP

    Um adendo: tente programar códigos complexos, no mínimo, utilizando somente programação funcional e não misture com programação procedural. https://www.alura.com.br/artigos/programacao-funcional-o-que-e Exemplo: <?php define('MAX_FILE_LIMIT', 1024 * 1024 * 2); // Tamanho máximo de arquivo HTML de 2 megabytes define('ALLOW_PHP', false); // Verifique se o html salvo contém tag php e não salve se não for permitido define('ALLOWED_OEMBED_DOMAINS', [ 'https://www.youtube.com/', 'https://www.vimeo.com/', 'https://www.twitter.com/' ]); // Carregar URLs apenas de sites permitidos para oembed // Função pura function sanitizeFileName($file, $allowedExtension = 'html') { $basename = basename($file); $disallow = ['.htaccess', 'passwd']; if (in_array($basename, $disallow)) { showError('Nome de arquivo não permitido!'); return ''; } $file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file))); if ($file) { $file = __DIR__ . DIRECTORY_SEPARATOR . $file; } else { return ''; } if ($allowedExtension) { $file = preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension"; } return $file; } // Função pura function showError($error) { header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); die($error); } // Função de alta ordem (recebe uma função como argumento) function validOembedUrl($url) { return array_reduce(ALLOWED_OEMBED_DOMAINS, function($valid, $domain) use ($url) { return $valid || strpos($url, $domain) === 0; }, false); } // Função pura function copyDirectory($src, $dst) { $dir = opendir($src); @mkdir($dst); while (false !== ($file = readdir($dir))) { if (($file != '.') && ($file != '..')) { if (is_dir($src . '/' . $file)) { copyDirectory($src . '/' . $file, $dst . '/' . $file); } else { copy($src . '/' . $file, $dst . '/' . $file); } } } closedir($dir); } // Função de alta ordem (recebe uma função como argumento) function processAction($action, $data) { $actions = [ 'rename' => function($data) { $newfile = sanitizeFileName($data['newfile']); if ($data['file'] && $newfile) { if (rename($data['file'], $newfile)) { echo "Arquivo '{$data['file']}' renomeado para '$newfile'"; } else { showError("Erro ao renomear arquivo '{$data['file']}' para '$newfile'"); } } }, 'delete' => function($data) { if ($data['file']) { if (unlink($data['file'])) { echo "Arquivo '{$data['file']}' excluído"; } else { showError("Erro ao excluir arquivo '{$data['file']}'"); } } }, 'saveReusable' => function($data) { $type = $data['type'] ?? false; $name = $data['name'] ?? false; $html = $data['html'] ?? false; if ($type && $name && $html) { $file = sanitizeFileName("$type/$name"); if ($file) { $dir = dirname($file); if (!is_dir($dir)) { echo "$dir pasta não existe\n"; if (mkdir($dir, 0777, true)) { echo "$dir pasta foi criada\n"; } else { showError("Erro ao criar pasta '$dir'\n"); } } if (file_put_contents($file, $html)) { echo "Arquivo salvo '$file'"; } else { showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!"); } } else { showError('Nome de arquivo inválido!'); } } else { showError("Faltam dados de elementos reutilizáveis!\n"); } }, 'oembedProxy' => function($data) { $url = $data['url'] ?? ''; if (validOembedUrl($url)) { header('Content-Type: application/json'); echo file_get_contents($url); } else { showError('URL inválida!'); } } ]; if (isset($actions[$action])) { $actions[$action]($data); } else { showError("Ação inválida '$action'!"); } } $html = ''; $file = ''; $action = ''; if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) { $startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']); if ($startTemplateUrl) { $templateDir = dirname($startTemplateUrl); $targetDir = __DIR__ . '/Projetos/' . sanitizeFileName($_POST['folder']); copyDirectory($templateDir, $targetDir); $html = file_get_contents($startTemplateUrl); } } else if (isset($_POST['html'])) { $html = substr($_POST['html'], 0, MAX_FILE_LIMIT); if (!ALLOW_PHP) { if (preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html)) { showError('PHP não permitido!'); } } } if (isset($_POST['file'])) { $file = sanitizeFileName($_POST['file']); } if (isset($_GET['action'])) { $action = htmlspecialchars(strip_tags($_GET['action'])); } if ($action) { processAction($action, ['file' => $file, 'newfile' => $_POST['newfile'] ?? '', 'type' => $_POST['type'] ?? '', 'name' => $_POST['name'] ?? '', 'html' => $_POST['html'] ?? '', 'url' => $_GET['url'] ?? '']); } else { if ($html) { if ($file) { $dir = dirname($file); if (!is_dir($dir)) { echo "$dir pasta não existe\n"; if (mkdir($dir, 0777, true)) { echo "$dir pasta foi criada\n"; } else { showError("Erro ao criar pasta '$dir'\n"); } } if (file_put_contents($file, $html)) { echo "Arquivo salvo '$file'"; } else { showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!"); } } else { showError('O nome do arquivo está vazio!'); } } else { showError('O conteúdo HTML está vazio!'); } } ?>
  4. Williams Duarte

    Instalador

    O problema é causado pelas chamadas ao echo no meio da string <<<HTML. Isso faz com que o PHP misture a saída do buffer de código HTML com a saída do PHP antes de completar a construção da string. Para resolver isso, encapsule a lógica PHP em funções ou variáveis antes de construir a string HTML.
  5. Williams Duarte

    DRAP AND DROP

    Para salvar todos os arquivos e pastas relacionados ao template (CSS, JS, imagens, etc.), você pode modificar seu código PHP para copiar a estrutura de diretórios e os arquivos. Vou mostrar como você pode fazer isso: HTML O código HTML não precisa de muitas alterações, mas certifique-se de que os caminhos dos templates estejam corretos. Aqui está o trecho relevante do seu HTML para referência: <!-- new page modal--> <div class="modal fade" id="new-page-modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <form id="newPageForm" method="POST" action="save.php"> <div class="modal-content"> <div class="modal-header"> <h6 class="modal-title text-primary fw-normal"><i class="la la-lg la-file"></i> Nova página</h6> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body text"> <div class="mb-3 row" data-key="type"> <label class="col-sm-3 col-form-label"> Modelo <abbr title="O conteúdo deste modelo será usado como ponto de partida para o novo modelo"> <i class="la la-lg la-question-circle text-primary"></i> </abbr> </label> <div class="col-sm-9 input"> <div> <select class="form-select" name="startTemplateUrl"> <option value="themes/modelo-branco/branco-template.html">Modelo em branco</option> <option value="themes/modelo1/index.html">Modelo 1 de L2</option> <option value="themes/modelo2/index.html">Modelo 2 de L2</option> <option value="themes/modelo3/index.html">Modelo 3 de L2 </option> </select> </div> </div> </div> <div class="mb-3 row" data-key="href"> <label class="col-sm-3 col-form-label">Nome da página</label> <div class="col-sm-9 input"> <div> <input name="title" type="text" value="Minha página" class="form-control" placeholder="Minha página" required> </div> </div> </div> <div class="mb-3 row" data-key="href"> <label class="col-sm-3 col-form-label">Nome do arquivo</label> <div class="col-sm-9 input"> <div> <input name="file" type="text" value="my-page.html" class="form-control" placeholder="index.html" required> </div> </div> </div> <div class="mb-3 row" data-key="href"> <label class="col-sm-3 col-form-label">Salvar na pasta</label> <div class="col-sm-9 input"> <div> <input name="folder" type="text" value="my-pages" class="form-control" placeholder="/" required> </div> </div> </div> </div> <div class="modal-footer"> <button class="btn btn-secondary btn-lg" type="reset" data-bs-dismiss="modal"><i class="la la-times"></i> Cancelar</button> <button class="btn btn-primary btn-lg" type="submit"><i class="la la-check"></i> Criar página</button> </div> </div> </form> </div> </div> PHP (save.php) Modifique o seu save.php para copiar a estrutura completa do template selecionado. Adicionado função para copiar diretórios recursivamente e ajustar o script para usar essa função. <?php define('MAX_FILE_LIMIT', 1024 * 1024 * 2);//Tamanho máximo de arquivo HTML de 2 megabytes define('ALLOW_PHP', false);//verifique se o html salvo contém tag php e não salve se não for permitido define('ALLOWED_OEMBED_DOMAINS', [ 'https://www.youtube.com/', 'https://www.vimeo.com/', 'https://www.twitter.com/' ]);//carregar URLs apenas de sites permitidos para oembed function sanitizeFileName($file, $allowedExtension = 'html') { $basename = basename($file); $disallow = ['.htaccess', 'passwd']; if (in_array($basename, $disallow)) { showError('Nome de arquivo não permitido!'); return ''; } $file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file))); if ($file) { $file = __DIR__ . DIRECTORY_SEPARATOR . $file; } else { return ''; } if ($allowedExtension) { $file = preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension"; } return $file; } function showError($error) { header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); die($error); } function validOembedUrl($url) { foreach (ALLOWED_OEMBED_DOMAINS as $domain) { if (strpos($url, $domain) === 0) { return true; } } return false; } function copyDirectory($src, $dst) { $dir = opendir($src); @mkdir($dst); while(false !== ( $file = readdir($dir)) ) { if (( $file != '.' ) && ( $file != '..' )) { if ( is_dir($src . '/' . $file) ) { copyDirectory($src . '/' . $file, $dst . '/' . $file); } else { copy($src . '/' . $file, $dst . '/' . $file); } } } closedir($dir); } $html = ''; $file = ''; $action = ''; if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) { $startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']); if ($startTemplateUrl) { $templateDir = dirname($startTemplateUrl); $targetDir = __DIR__ . '/Projetos/' . sanitizeFileName($_POST['folder']); copyDirectory($templateDir, $targetDir); $html = file_get_contents($startTemplateUrl); } } else if (isset($_POST['html'])){ $html = substr($_POST['html'], 0, MAX_FILE_LIMIT); if (!ALLOW_PHP) { if (preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html)) { showError('PHP não permitido!'); } } } if (isset($_POST['file'])) { $file = sanitizeFileName($_POST['file']); } if (isset($_GET['action'])) { $action = htmlspecialchars(strip_tags($_GET['action'])); } if ($action) { switch ($action) { case 'rename': $newfile = sanitizeFileName($_POST['newfile']); if ($file && $newfile) { if (rename($file, $newfile)) { echo "Arquivo '$file' renomeado para '$newfile'"; } else { showError("Erro ao renomear arquivo '$file' renomeado para '$newfile'"); } } break; case 'delete': if ($file) { if (unlink($file)) { echo "Arquivo '$file' excluído"; } else { showError("Erro ao excluir arquivo '$file'"); } } break; case 'saveReusable': $type = $_POST['type'] ?? false; $name = $_POST['name'] ?? false; $html = $_POST['html'] ?? false; if ($type && $name && $html) { $file = sanitizeFileName("$type/$name"); if ($file) { $dir = dirname($file); if (!is_dir($dir)) { echo "$dir pasta não existe\n"; if (mkdir($dir, 0777, true)) { echo "$dir pasta foi criada\n"; } else { showError("Erro ao criar pasta '$dir'\n"); } } if (file_put_contents($file, $html)) { echo "Arquivo salvo '$file'"; } else { showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!"); } } else { showError('Nome de arquivo inválido!'); } } else { showError("Faltam dados de elementos reutilizáveis!\n"); } break; case 'oembedProxy': $url = $_GET['url'] ?? ''; if (validOembedUrl($url)) { header('Content-Type: application/json'); echo file_get_contents($url); } else { showError('URL inválida!'); } break; default: showError("Ação inválida '$action'!"); } } else { if ($html) { if ($file) { $dir = dirname($file); if (!is_dir($dir)) { echo "$dir pasta não existe\n"; if (mkdir($dir, 0777, true)) { echo "$dir pasta foi criada\n"; } else { showError("Erro ao criar pasta '$dir'\n"); } } if (file_put_contents($file, $html)) { echo "Arquivo salvo '$file'"; } else { showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!"); } } else { showError('O nome do arquivo está vazio!'); } } else { showError('O conteúdo HTML está vazio!'); } } ?> Explicação Função copyDirectory: Essa função copia recursivamente todos os arquivos e subdiretórios de um diretório fonte para um diretório destino. Modificação do processamento do template: Adicionado o código para copiar a estrutura do diretório do template para o destino especificado. Com essas alterações, quando você selecionar um template e criar uma nova página, todo o conteúdo do diretório do template (CSS, JS, imagens, etc.) será copiado para a nova localização.
  6. Williams Duarte

    PHP - Gerar vencimento parcelas com período variado

    Sua nova função ajustada com for, deixei mais limpa! <?php // Exemplo de uso $dataInicial = new DateTime(); $intervalos = [0, 3, 6]; $valorTotal = 1000.00; $qtd_parc = count($intervalos); // Converter o valor para o formato Real separado pela vírgula echo "Valor da compra: R$ " . number_format($valorTotal, 2, ',', '.') . "<br><br>"; // Apenas Exibir a quantidade de Intervalos echo "Quantidade de intervalos: $qtd_parc <br><br>"; function gerarParcelas($dataInicial, $intervalos, $valorTotal) { $datasParcelas = []; $quantidadeParcelas = count($intervalos); $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100; // Calcula o valor base das parcelas (arredondando para baixo) $valorUltimaParcela = $valorTotal - ($valorParcela * ($quantidadeParcelas - 1)); // Calcula a última parcela para ajustar a soma total for ($i = 0; $i < $quantidadeParcelas; $i++) { if ($i == $quantidadeParcelas - 1) { $valorAtualParcela = $valorUltimaParcela; // Última parcela ajustada } else { $valorAtualParcela = $valorParcela; // Parcelas intermediárias } echo "Valor Parc. R$ " . number_format($valorAtualParcela, 2, ',', '.') . "<br>"; $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$intervalos[$i]} days"); $datasParcelas[] = [ 'data_vencimento' => $dataVencimento, 'valor_parcela' => $valorAtualParcela ]; } return $datasParcelas; } $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal); echo "<br>"; foreach ($parcelas as $parcela) { echo $parcela['data_vencimento']->format('Y-m-d') . " - Valor..: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . "<br>"; } ?>
  7. Williams Duarte

    PHP - Gerar vencimento parcelas com período variado

    Melhor usar dentro da função: https://ideone.com/nv22yr <?php function gerarParcelas($dataInicial, $intervalos, $valorTotal) { $datasParcelas = []; $quantidadeParcelas = count($intervalos); $valorParcela = $valorTotal / $quantidadeParcelas; foreach ($intervalos as $dias) { $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$dias} days"); $datasParcelas[] = [ 'data_vencimento' => $dataVencimento, 'valor_parcela' => $valorParcela ]; } return $datasParcelas; } // Exemplo de uso $dataInicial = new DateTime('2024-07-06'); $intervalos = [28, 42, 56]; $valorTotal = 1000.00; $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal); foreach ($parcelas as $parcela) { echo "Data de Vencimento: " . $parcela['data_vencimento']->format('Y-m-d') . PHP_EOL; echo "Valor da Parcela: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . PHP_EOL; echo "-----------------------" . PHP_EOL; } Vamos supor que você queira aplicar juros de 2% apos 30 dias, ai você cria outra função responsavel para isto, separando responsabilidades fica mais organizado e sabe oque cada coisa faz! https://ideone.com/4fQCRe <?php function calcularJuros($valor, $dias, $taxaJuros, $diasSemJuros) { if ($dias > $diasSemJuros) { $diasComJuros = $dias - $diasSemJuros; $valorComJuros = $valor * pow((1 + $taxaJuros / 100), ($diasComJuros / 30)); return $valorComJuros; } return $valor; } function gerarParcelas($dataInicial, $intervalos, $valorTotal, $taxaJuros, $diasSemJuros) { $datasParcelas = []; $quantidadeParcelas = count($intervalos); $valorParcela = $valorTotal / $quantidadeParcelas; foreach ($intervalos as $dias) { $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$dias} days"); $valorParcelaComJuros = calcularJuros($valorParcela, $dias, $taxaJuros, $diasSemJuros); $datasParcelas[] = [ 'data_vencimento' => $dataVencimento, 'valor_parcela' => $valorParcelaComJuros ]; } return $datasParcelas; } // Exemplo de uso $dataInicial = new DateTime('2024-07-06'); $intervalos = [28, 42, 56]; $valorTotal = 1000.00; $taxaJuros = 2; // 2% de juros ao mês $diasSemJuros = 30; // Sem juros para os primeiros 30 dias $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal, $taxaJuros, $diasSemJuros); foreach ($parcelas as $parcela) { echo "Data de Vencimento: " . $parcela['data_vencimento']->format('Y-m-d') . PHP_EOL; echo "Valor da Parcela: R$ " . number_format($parcela['valor_parcela'], 2, ',', '.') . PHP_EOL; echo "-----------------------" . PHP_EOL; }
  8. Williams Duarte

    PHP - Gerar vencimento parcelas com período variado

    Para implementar uma rotina em PHP 8.2 que gere vencimentos com períodos variados, você pode seguir o exemplo abaixo. A ideia é criar uma função que aceite um array de intervalos e a data inicial, retornando as datas de vencimento conforme os períodos definidos. IDEONE: https://ideone.com/ytjlxc <?php function gerarVencimentos(DateTime $dataInicial, array $intervalos): array { $datasVencimento = []; foreach ($intervalos as $dias) { $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$dias} days"); $datasVencimento[] = $dataVencimento; } return $datasVencimento; } // Exemplo de uso $dataInicial = new DateTime('2024-07-06'); $intervalos = [0, 30, 60, 90, 28, 42, 56]; $datasVencimento = gerarVencimentos($dataInicial, $intervalos); foreach ($datasVencimento as $data) { echo $data->format('Y-m-d') . PHP_EOL; } Explicação: Função gerarVencimentos: Recebe a data inicial e um array de intervalos em dias. Clona a data inicial para evitar modificações na data original. Utiliza o método modify do objeto DateTime para adicionar os dias do intervalo. Adiciona a nova data de vencimento ao array de datas de vencimento. Exemplo de Uso: Define a data inicial e os intervalos. Chama a função gerarVencimentos para obter as datas de vencimento. Itera sobre o array de datas de vencimento e imprime cada data. Essa abordagem permite que o sistema entenda e calcule os vencimentos com períodos variados conforme os intervalos fornecidos Obs.: Se a versão do PHP não suportar tipagem, remova: <?php function gerarVencimentos($dataInicial, $intervalos) { $datasVencimento = []; foreach ($intervalos as $dias) { $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$dias} days"); $datasVencimento[] = $dataVencimento; } return $datasVencimento; } // Exemplo de uso $dataInicial = new DateTime('2024-07-06'); $intervalos = [0, 30, 60, 90, 28, 42, 56]; $datasVencimento = gerarVencimentos($dataInicial, $intervalos); foreach ($datasVencimento as $data) { echo $data->format('Y-m-d') . PHP_EOL; }
  9. Williams Duarte

    Passar Hora para Campo Input automaticamente

    <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Atualizar Hora no Input</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> </head> <body> <div class="container mt-5"> <div class="col-lg-3"> <label for="cotaHrsinicio">Hora da Abertura <span class="required">*</span></label> <div class="controls"> <input type="time" id="cotaHrsinicio" name="cotaHrsinicio" class="form-control" style="width:100%;" value="" /> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function() { function date_time() { var date = new Date(); var hour = date.getHours(); var minute = date.getMinutes(); if (hour < 10) { hour = "0" + hour; } if (minute < 10) { minute = "0" + minute; } var currentTime = hour + ":" + minute; document.getElementById("cotaHrsinicio").value = currentTime; } date_time(); // Call the function to set the initial time setInterval(date_time, 60000); // Update the time every minute }); </script> </body> </html>
  10. Williams Duarte

    Não atualizar a div dentro de um setInterval

    Para resolver esse problema, você pode separar o conteúdo que precisa ser atualizado do conteúdo que não deve ser atualizado. A ideia é carregar o conteúdo dinâmico de uma maneira que a div estática não seja afetada. Podemos fazer isso através de AJAX, atualizando apenas a parte necessária. Vou fornecer um exemplo de código para isso: centro.php: Essa será a página que você está atualizando a cada minuto, contendo apenas o conteúdo dinâmico. index.html: A página principal que contém a div estática e a div dinâmica. centro.php <?php // Conteúdo dinâmico que será atualizado a cada minuto echo "<p>Conteúdo dinâmico atualizado em " . date("H:i:s") . "</p>"; ?> index.html <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Página Principal</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> </head> <body> <div id="centro"> <div id="conteudo-dinamico"> <!-- O conteúdo dinâmico será carregado aqui --> </div> <div id="conteudo-estatico" style="background-color: red; color: white;"> <p>DIV QUE NÃO PODE SER ATUALIZADA</p> </div> </div> <script> function atualiza() { $.get('centro.php', function(data) { $('#conteudo-dinamico').html(data); }); } // Atualiza a cada 60 segundos setInterval(atualiza, 60000); // Carrega o conteúdo inicial $(document).ready(function() { atualiza(); }); </script> </body> </html> Explicação: centro.php: Contém apenas o conteúdo dinâmico que será carregado via AJAX. index.html: Carrega o conteúdo dinâmico na div #conteudo-dinamico e mantém a div #conteudo-estatico inalterada. JavaScript: A função atualiza faz uma requisição AJAX para centro.php e insere a resposta na div #conteudo-dinamico. setInterval chama a função atualiza a cada 60 segundos. O conteúdo inicial é carregado quando o documento está pronto com $(document).ready. Dessa forma, a div que não pode ser atualizada (#conteudo-estatico) permanece inalterada, enquanto o conteúdo dinâmico é atualizado a cada minuto.
  11. Williams Duarte

    Setar cookie para subdominio

    Exatamente, sem o "www". Ao definir o cookie como: setcookie("token", $valor, time() + (60 * 10), "/", ".dominio.com.br"); Você está especificando que o cookie deve ser acessível por todos os subdomínios sob dominio.com.br. O ponto antes de dominio.com.br é crucial porque indica que o cookie é válido para o domínio principal e todos os seus subdomínios. Se você colocasse "www.dominio.com.br", o cookie seria restrito apenas ao subdomínio www. Portanto, sem o "www" é a forma correta de garantir que o cookie seja compartilhado entre todos os subdomínios.
  12. Williams Duarte

    Verificar usuário

    Para verificar se um usuário já existe no banco de dados MySQL em tempo real e exibir uma mensagem assim que o foco sair do campo de entrada, você pode usar uma combinação de HTML, JavaScript (com jQuery ou Vanilla JS), e PHP para a comunicação com o banco de dados. Aqui está um passo a passo simples para fazer isso: 1. HTML Crie um campo de entrada no HTML para o nome de usuário: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Verificação de Nome de Usuário</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> </head> <body> <form> <label for="username">Nome de Usuário:</label> <input type="text" id="username" name="username"> <span id="username-message"></span> </form> <script src="check_username.js"></script> </body> </html> 2. JavaScript Use JavaScript para verificar o nome de usuário assim que o foco sair do campo de entrada: // check_username.js $(document).ready(function() { $('#username').on('blur', function() { var username = $(this).val(); if (username.length > 0) { $.ajax({ url: 'check_username.php', type: 'POST', data: { username: username }, success: function(response) { $('#username-message').html(response); } }); } }); }); 3. PHP Crie um script PHP para verificar o nome de usuário no banco de dados: // check_username.php <?php $servername = "localhost"; $username = "seu_usuario"; $password = "sua_senha"; $dbname = "seu_banco_de_dados"; // Conectar ao banco de dados $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Conexão falhou: " . $conn->connect_error); } if (isset($_POST['username'])) { $username = $_POST['username']; $sql = "SELECT * FROM users WHERE username = '$username'"; $result = $conn->query($sql); if ($result->num_rows > 0) { echo "Nome de usuário já existe."; } else { echo "Nome de usuário disponível."; } } $conn->close(); ?> Explicação: HTML: Cria um formulário simples com um campo de entrada para o nome de usuário. JavaScript: Usa jQuery para detectar quando o campo de entrada perde o foco (blur) e envia uma requisição AJAX para o script PHP. PHP: O script PHP recebe o nome de usuário enviado, consulta o banco de dados MySQL e retorna uma mensagem indicando se o nome de usuário já existe ou está disponível. Essa abordagem verifica o nome de usuário em tempo real e exibe uma mensagem apropriada assim que o usuário sai do campo de entrada. Se precisar de um tutorial mais detalhado, busque por termos como "AJAX username validation PHP MySQL". Espero que isso ajude!
  13. Williams Duarte

    Setar cookie para subdominio

    Você deve definir o domínio do cookie para o domínio principal com um ponto à frente, como .dominio.com.br Desta forma, o cookie token será acessível em qualquer subdomínio de dominio.com.br, incluindo usuario.dominio.com.br, www.dominio.com.br, e outros que você possa ter.
  14. Williams Duarte

    Carregamento preloading

    Adicione o índice [0] para acessar o elemento document.getElementsByClassName('conteudo')[0].style.display = "block";
  15. Williams Duarte

    Saber se todos os produtos de uma consulta estão cadastrados no banco de dados

    Para resolver o problema que você descreveu, precisa de uma consulta SQL que selecione os registros da tabela "itens" onde o produto escolhido, como "uva", apareça e todos os outros produtos nesse registro também estejam listados na tabela "produtos". Isso garante que todos os produtos relacionados em cada item estejam validados contra a lista de produtos aceitáveis. Dada a estrutura atual das suas tabelas e considerando que você quer filtrar por um produto específico e garantir que todos os produtos mencionados no registro estejam na tabela "produtos", uma possível abordagem é a seguinte: SELECT i.* FROM itens i WHERE 'uva' IN (i.prod_01, i.prod_02, i.prod_03, i.prod_04) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_01) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_02) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_03) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_04); Nessa consulta: A cláusula WHERE 'uva' IN (i.prod_01, i.prod_02, i.prod_03, i.prod_04) verifica se "uva" está em algum dos campos de produto em um registro da tabela "itens". As cláusulas EXISTS verificam se cada produto listado em um registro específico de "itens" está presente na tabela "produtos". Isso é feito para cada campo de produto (prod_01, prod_02, etc.). Se você estiver usando MySQL ou outro sistema compatível no OneCompiler, o código que forneci deve funcionar conforme abaixo. https://onecompiler.com/mysql/42b35kdf5 -- Criação das tabelas CREATE TABLE produtos ( id INT AUTO_INCREMENT PRIMARY KEY, produto VARCHAR(50) ); CREATE TABLE itens ( id INT AUTO_INCREMENT PRIMARY KEY, prod_01 VARCHAR(50), prod_02 VARCHAR(50), prod_03 VARCHAR(50), prod_04 VARCHAR(50) ); -- Inserção de dados na tabela produtos INSERT INTO produtos (produto) VALUES ('laranja'), ('maçã'), ('uva'), ('goiaba'), ('arroz'), ('feijão'), ('macarrão'), ('azeite'); -- Inserção de dados na tabela itens INSERT INTO itens (prod_01, prod_02, prod_03, prod_04) VALUES ('laranja', 'uva', 'arroz', 'feijão'), ('maçã', 'macarrão', 'goiaba', 'uva'), ('arroz', 'feijão', 'maçã', 'azeite'); -- Consulta para verificar a presença de 'uva' e validar os outros produtos SELECT i.* FROM itens i WHERE 'uva' IN (i.prod_01, i.prod_02, i.prod_03, i.prod_04) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_01) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_02) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_03) AND EXISTS (SELECT 1 FROM produtos p WHERE p.produto = i.prod_04);
  16. Williams Duarte

    Ler campos com caracteres especiais no xml

    Para acessar elementos no XML que possuem nomes de tags com dois pontos, como "dc:creator", você precisa lidar com namespaces. No PHP, o SimpleXMLElement tem métodos específicos para manipular namespaces. O namespace pode ser especificado diretamente se você conhece o URI $link = "noticias.xml"; $xml = simplexml_load_file($link); $namespace = $xml->getNamespaces(true); // Pega todos os namespaces do documento foreach ($xml->channel->item as $item) { $titulo = (string)$item->title; $url = (string)$item->link; $creator = (string)$item->children($namespace['dc'])->creator; // Acessa o namespace 'dc' echo "Título: $titulo\n"; echo "URL: $url\n"; echo "Criador: $creator\n"; }
  17. Williams Duarte

    Consulta SQL dentro de outra consulta

    Se você também quer garantir que os produtos listados contenham um item específico, você pode adicionar uma condição extra na cláusula WHERE para filtrar por esse item específico. Teste Online e Ajustado a Query https://onecompiler.com/mysql/42atjfa59 SELECT P.id, P.name, GROUP_CONCAT(I.name ORDER BY I.name) AS items FROM product P JOIN product_item PI ON P.id = PI.productID JOIN item I ON I.id = PI.itemID AND I.active = 'S' WHERE P.id NOT IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.active IS NULL ) AND P.id IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name = 'mesa' ) GROUP BY P.id, P.name;
  18. Williams Duarte

    Data igual do facebook

    class Data { public static function ExibirTempoDecorrido($date) { if(empty($date)) { return "Informe a data"; } $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década"); $duracao = array("60","60","24","7","4.35","12","10"); $agora = time(); $unix_data = strtotime($date); if(empty($unix_data)) { return "Bad date"; } if($agora > $unix_data) { $diferenca = $agora - $unix_data; $tempo = "atrás"; } else { $diferenca = $unix_data - $agora; $tempo = "agora"; } for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) { $diferenca /= $duracao[$j]; } $diferenca = round($diferenca); if($diferenca != 1) { if($periodos[$j] == "mês") { $periodos[$j] = "meses"; } else { $periodos[$j] .= "s"; } } return "$diferenca $periodos[$j] $tempo"; } } Teste Online https://ideone.com/hj5Qok
  19. Williams Duarte

    Fazer busca no Banco de dados usando vários critério

    Vou lhe dar outro exemplo de como você pode realizar esta consulta utilizando IN. A consulta SQL inicial buscará na tabela variações todos os registros que contenham a palavra "casa" ou seu plural "casas", e em seguida verificará se os outros itens desses registros estão ativos. Como SQL tem limitações para verificar múltiplas colunas de uma forma dinâmica em diferentes tabelas, faremos uma abordagem que requer uniões múltiplas com a tabela itens. SELECT v.* FROM variações v JOIN itens i1 ON (v.item1 = i1.item OR v.item1 = i1.plural) AND i1.ativo = 'S' JOIN itens i2 ON (v.item2 = i2.item OR v.item2 = i2.plural) AND i2.ativo = 'S' JOIN itens i3 ON (v.item3 = i3.item OR v.item3 = i3.plural) AND i3.ativo = 'S' WHERE 'casa' IN (v.item1, v.item2, v.item3) OR 'casas' IN (v.item1, v.item2, v.item3) Processamento PHP <?php $pdo = new PDO('mysql:host=your_host;dbname=your_dbname', 'username', 'password'); // Sua consulta SQL $sql = "SELECT v.* FROM variações v JOIN itens i1 ON (v.item1 = i1.item OR v.item1 = i1.plural) AND i1.ativo = 'S' JOIN itens i2 ON (v.item2 = i2.item OR v.item2 = i2.plural) AND i2.ativo = 'S' JOIN itens i3 ON (v.item3 = i3.item OR v.item3 = i3.plural) AND i3.ativo = 'S' WHERE 'casa' IN (v.item1, v.item2, v.item3) OR 'casas' IN (v.item1, v.item2, v.item3)"; $stmt = $pdo->query($sql); // Verifica se há registros if ($stmt->rowCount() > 0) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo "Registro encontrado: " . implode(", ", $row) . "<br>"; } } else { echo "Nenhum registro ativo encontrado."; } ?> Obs.: Troque os valores fixos por variaveis.
  20. Williams Duarte

    Upload de arquivos com javascript

    O problema está no retorno, não no script js, é como eu disse antes: " resposta esperada geralmente depende de como você configurou o servidor para lidar com o upload"
  21. Williams Duarte

    Consulta em duas tabelas

    Só utilizar operador UNION ALL https://www.devmedia.com.br/sql-utilizando-o-operador-union-e-union-all/37457 Exemplo de Uso: $consulta = " ( SELECT A.cod_evento AS cod, A.titulo_evento AS titulo, A.data_evento AS data, 1 AS ordem FROM tabela1 A ) UNION ALL ( SELECT B.cod_noticia AS cod, B.titulo_noticia AS titulo, B.data_noticia AS data, 2 AS ordem FROM tabela2 B ) ORDER BY data, ordem; "; $resultado = mysqli_query($conexao, $consulta) or die ("Erro"); while($busca = mysqli_fetch_array($resultado)) { print $busca['cod']; print $busca['titulo']; } Adapte a sua necessidade!
  22. Williams Duarte

    Nodejs não consigo rodar uma Api de rotas

    Você está lidando com um conflito entre módulos ES e CommonJS no seu projeto Node.js. Quando você define "type": "module" no seu package.json, o Node.js espera que todos os arquivos .js usem a sintaxe de módulos ES6 (import/export). O problema é que o Consign, pelo que você descreveu, não suporta diretamente esta sintaxe. Aqui estão algumas abordagens que você pode tentar: Alterar o Tipo de Módulo: Modifique "type": "module" para "type": "commonjs" no seu package.json. Isso exigirá que você atualize seu código para usar require e module.exports em vez de import e export. Aqui está um exemplo de como seu index.js poderia ser alterado: const express = require('express'); const consign = require('consign'); const app = express(); consign() .include("models") .then("libs/middlewares.js") .then("routes") .then("libs/boot.js") .into(app); Importação Dinâmica: Se quiser manter os módulos ES, experimente usar import() dinamicamente. Essa é uma solução mais moderna, mas pode não ser totalmente compatível com a forma como o Consign carrega arquivos. Reavaliar o Uso do Consign: Dependendo da complexidade do seu projeto, talvez valha a pena considerar estruturas alternativas que não dependam do Consign, facilitando o uso de módulos ES diretamente. Configuração Adequada do Babel: Como você já utiliza o Babel, certifique-se de que está corretamente configurado para transpilar o código ES6+ para compatibilidade com a versão do Node.js que você está usando. Isso pode ajudar a manter a sintaxe de módulos ES6 e ainda assim ser compatível com bibliotecas que esperam CommonJS.
  23. Williams Duarte

    Campo de sequencial em uma select

    Fiquei curioso sobre isto, então resolvi pesquisar! SELECT ROW_NUMBER() OVER (ORDER BY nome_usuario) AS contador, id_usuario, nome_usuario FROM usuarios
  24. Williams Duarte

    Upload de arquivos com javascript

    O erro "Unexpected token ... sugere que o seu código esperava JSON, mas recebeu HTML, provavelmente de uma página de erro (como 404 ou 500). Isso ocorre ao tentar converter a resposta do servidor em JSON quando a URL está errada ou o servidor não responde corretamente. Verifique a URL e as configurações do servidor para garantir que aceitam uploads POST e retornam JSON. fetch('http://localhost/dashboard/dados', { method: 'POST', body: formData }) .then(response => { if (!response.ok) { throw new Error('Houve um problema com a resposta da rede'); } // Verifica se a resposta é JSON antes de tentar converter const contentType = response.headers.get('content-type'); if (contentType && contentType.includes('application/json')) { return response.json(); } else { throw new Error('Não é JSON: ' + contentType); } }) .then(data => { console.log('Sucesso:', data); }) .catch(error => { console.error('Problemas com o Upload:', error); }); Entenda, quando você faz o upload de arquivos para um servidor usando PHP ou Node.js, a resposta esperada geralmente depende de como você configurou o servidor para lidar com o upload e o que você precisa fazer com os arquivos após recebê-los. Abaixo estão exemplos de respostas que você pode esperar de cada um: Exemplo de Resposta do PHP: <?php // Processamento do upload... // Supondo que tudo correu bem $response = [ 'success' => true, 'message' => 'Upload realizado com sucesso!', 'fileInfo' => [ 'name' => $_FILES['file']['name'], 'size' => $_FILES['file']['size'], 'type' => $_FILES['file']['type'], ] ]; header('Content-Type: application/json'); echo json_encode($response); Exemplo de Resposta do Node.js com Express: app.post('/upload', upload.single('file'), (req, res) => { // Processamento do upload... // Supondo que tudo correu bem res.json({ success: true, message: 'Upload realizado com sucesso!', fileInfo: { name: req.file.originalname, size: req.file.size, type: req.file.mimetype, } }); }); Obs.: Diferentes frameworks têm a capacidade de ajustar automaticamente seus comportamentos com base nos cabeçalhos HTTP recebidos, o que significa que não existe uma única abordagem padrão aplicável a todos os casos.
  25. Williams Duarte

    Upload de arquivos com javascript

    A lógica é bem parecida com a de um único arquivo, só que você vai incluir mais de um arquivo no formData. No input no seu HTML adicione o atributo multiple <input multiple type="file"> Agora, pegue os arquivos do input. const fileInput = document.querySelector('input[type="file"][multiple]'); Adicione cada arquivo ao formData Array.from(fileInput.files).forEach((file, index) => { // Aqui, 'files[]' é o nome do campo que será usado pelo servidor para receber os arquivos. // O uso de '[]' indica que é um array de arquivos. O nome exato depende da API do servidor. formData.append('files[]', file); }); O restante é praticamente igual! Fóruns exigem esforço próprio; não esperem soluções prontas. Pesquise para aproveitar bem.
×

Informação importante

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