Jump to content

POWERED BY:

Jack Oliveira

Members
  • Content count

    620
  • Joined

  • Last visited

Everything posted by Jack Oliveira

  1. Jack Oliveira

    PHP - Orientação referente Tabela HTML

    Há 3 maneiras 1 Remoção de espaços e substituição de vírgula por ponto..... // Função para somar o total da tabela function somarparcelas() { let parcelastotal = 0; // Itera sobre cada linha da tabela no tbody $("#tbparcs tbody tr").each(function() { // Obtém o texto da célula na segunda coluna (índice 1) let valorTexto = $(this).find("td:eq(1) span").text().trim(); // Remove espaços, substitui vírgula por ponto e converte para float let valorNumerico = parseFloat(valorTexto.replace(/\./g, '').replace(',', '.')); // Verifica se o valor convertido é um número válido if (!isNaN(valorNumerico)) { parcelastotal += valorNumerico; } }); // Atualiza o valor do input com o total formatado para 2 casas decimais $("input[name=parcelastotal]").val(parcelastotal.toFixed(2)); } 2 Uso de Number() com substituição de vírgula por ponto.... // Função para somar o total da tabela function somarparcelas() { let parcelastotal = 0; // Itera sobre cada linha da tabela no tbody $("#tbparcs tbody tr").each(function() { // Obtém o texto da célula na segunda coluna (índice 1) let valorTexto = $(this).find("td:eq(1) span").text().trim(); // Substitui vírgula por ponto e converte para número usando Number() let valorNumerico = Number(valorTexto.replace(',', '.')); // Verifica se o valor convertido é um número válido if (!isNaN(valorNumerico)) { parcelastotal += valorNumerico; } }); // Atualiza o valor do input com o total formatado para 2 casas decimais $("input[name=parcelastotal]").val(parcelastotal.toFixed(2)); } 3 Utilização de parseFloat com verificação adicional... // Função para somar o total da tabela function somarparcelas() { let parcelastotal = 0; // Itera sobre cada linha da tabela no tbody $("#tbparcs tbody tr").each(function() { // Obtém o texto da célula na segunda coluna (índice 1) let valorTexto = $(this).find("td:eq(1) span").text().trim(); // Substitui vírgula por ponto, remove caracteres não numéricos e converte para float let valorNumerico = parseFloat(valorTexto.replace(/[^\d,-]/g, '').replace(',', '.')); // Verifica se o valor convertido é um número válido if (!isNaN(valorNumerico)) { parcelastotal += valorNumerico; } }); // Atualiza o valor do input com o total formatado para 2 casas decimais $("input[name=parcelastotal]").val(parcelastotal.toFixed(2)); }
  2. Jack Oliveira

    PHP - Array contendo DATA salva 0 no MySql

    no seu controller, converte as datas para o formato Y-m-d antes de você salvar no seu banco de dados.... <?php protected function save_parcelas($notaLct, $dtaprc, $vlrprc, $idFrnc) { for ($i = 0; $i < count($vlrprc); $i++) { $dataVencimento = DateTime::createFromFormat('d/m/Y', $dtaprc[$i])->format('Y-m-d'); $data = array( 'nunNotafiscal' => $notaLct, 'dataVencimento' => $dataVencimento, // data no formato correto 'valorParcela' => $vlrprc[$i], 'id_fornecedor' => $idFrnc, 'id_user' => $this->session->userdata('id'), ); $this->lancamentos_model->save_parcelas($data); } } para garantir que a data de vencimento está sendo formatada corretamente antes de ser retornada para o seu JavaScript function gerarParcelas($dataInicial, $intervalos, $valorTotal) { $datasParcelas = []; $quantidadeParcelas = count($intervalos); $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100; $valorUltimaParcela = $valorTotal - ($valorParcela * ($quantidadeParcelas - 1)); for ($i = 0; $i < $quantidadeParcelas; $i++) { if ($i == $quantidadeParcelas - 1) { $valorAtualParcela = $valorUltimaParcela; } else { $valorAtualParcela = $valorParcela; } $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$intervalos[$i]} days"); $datasParcelas[] = [ 'data_vencimento' => $dataVencimento->format('d/m/Y'), // formato para exibição 'valor_parcela' => number_format($valorAtualParcela, 2, ',', '.') ]; } return $datasParcelas; } no seu view function gerarParcelas() { const dataInicial = $('#dtaentr').val(); const intervalos = $('#formaPgto').val(); const valorTotal = $('#subtotal').val(); $.ajax({ url: '<?=base_url()?>admin/lancamentos/geraParcelamento', type: 'POST', dataType: 'json', data: { dataInicial: dataInicial, intervalos: intervalos, valorTotal: valorTotal }, success: function(parcelas) { const tbody = $("#tbparcs tbody"); tbody.empty(); // Limpa a tabela antes de adicionar novas linhas parcelas.forEach(function(parcela) { let html = "<tr>"; html += "<td width='10%' height='10'><input type='hidden' name='dtaprc[]' value='" + parcela.data_vencimento + "'>" + parcela.data_vencimento + "</td>"; html += "<td width='32%' height='10'><input type='hidden' name='vlrprc[]' value='" + parcela.valor_parcela + "'>" + parcela.valor_parcela + "</td>"; html += "<td width='10%' height='10' style='text-align:center;'>" + "<button type='button' class='btn btn-primary btn-editar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'>" + "<span class='fa fa-edit'></span></button>" + "<button type='button' class='btn btn-success btn-salvar-parc' style='margin-right: 1%; padding: 1px 5px;' title='Salvar'>" + "<span class='fa fa-save'></span></button>" + "</td>"; html += "</tr>"; tbody.append(html); }); } }); }
  3. Jack Oliveira

    Instalador

    Ola, sobre Manutenção Difícil, eu fiz uma forma que toda vez que for fazer um ajsute etc.. ele automaticamente faz atualização no cliente entende... tipo para mim o codigo é normal, para o cliente ele vai ofuscado..... Ele é um projeto que estou criando do zero no php puro sem uso de Framework
  4. Jack Oliveira

    Instalador

    Ola estou fazendo um instalador de banco de dados em parte funciona Mas quando uso o <<<HTML HTML; Ele fica com estas informações no top 7.4 ao 8.38.0.28512MOnOnOnOffOffOnOffOffOnOnOnOnOnprogress-bar-success <?php $MeuHtml = <<<HTML <!DOCTYPE html> <html> <head><meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Instalação {$autor}</title> <link rel="icon" href="{$urlApi}api/allinstall/assets/icone.png?v={$versao}" sizes="32x32"> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <link rel="stylesheet" href="{$urlApi}api/allinstall/assets/css/app.css?v={$versao}"> <style type="text/css"> .license { background-color: #FFF; height: 400px; width: 100%; margin: 10px; } .form-control{ margin-bottom: 5px; } #primary{background: #FF6403} .paper-card{background: #272c33} .card{background: none;} .sw-theme-circles>ul.step-anchor:before{background-color: #30363d} .sw-theme-circles>ul.step-anchor>li>a{border: 3px solid #30363d} .sw-theme-circles>ul.step-anchor>li>a{background: #f5f5f5; min-width: 50px; height: 50px; text-align: center; -webkit-box-shadow: inset 0 0 0 3px #fff!important; box-shadow: inset 0 0 0 3px #fff!important; text-decoration: none; outline-style: none; z-index: 99; color: #999; background: #fff; line-height: 2; font-weight: bold;} .sw-theme-circles>ul.step-anchor>li{margin-left: 15%;} .card-header{border-bottom: 0} .table-striped tbody tr:nth-of-type(odd){background-color: #30363d;} .table-bordered{border: 1px solid #30363d;} .table-bordered td, .table-bordered th { border: 1px solid #30363d; } </style> </head> <body class="light loaded"> <div id="app"> <main> <div id="primary" class="p-t-b-100 height-full"> <div class="container"> <div class="row"> <div class="col-lg-8 mx-md-auto paper-card"> <div class="text-center"> <img class="img-responsive" src="{$urlApi}api/allinstall/assets/{$imagem}?v={$versao}"> <p><strong><H3>Instalação {$projeto} | V: {$versao}</H3></strong></p> </div> HTML; if (!isset($_GET['step']) || $_GET['step'] == '1') { $MeuHtml .= <<<HTML <div class="card no-b"> <div class="card-header pb-0"> <div class="stepper sw-main sw-theme-circles" id="smartwizard" data-options='{ "theme":"sw-theme-circles", "transitionEffect":"fade" }'> <ul class="nav step-anchor"> <li><a href="#step-1y">1</a></li> <li><a href="#step-2y">2</a></li> <li><a href="#step-3y">3</a></li> <li><a href="#step-4y">4</a></li> </ul> </div> </div> <div class="card-body"> <h6><b>Configurações do Servidor</b></h6><br> <table class="table table-condensed table-bordered table-striped"> <tr> <th>Função / Extensão</th> <th>Config. Necessária</th> <th>Config. Atual</th> <th width="50px">Status</th> </tr> <tr> <td>Versão do PHP</td> <td> HTML; echo $php7. ' ao '.$php8; $MeuHtml .= <<<HTML </td> <td> HTML; echo phpversion(); $MeuHtml .= <<<HTML </td> <td> HTML; if(phpversion() >= $php7 && phpversion() <= $php8) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> HTML; $MeuHtml .= <<<HTML <tr> <td>Memória do PHP</td> <td>128MB</td> <td> HTML; echo $mem = ini_get('memory_limit'); $MeuHtml .= <<<HTML </td> <td> HTML; if($mem >= 128) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>cURL</td> <td>On</td> <td> HTML; if(function_exists('curl_init')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(function_exists('curl_init')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>Allow URL fopen</td> <td>On</td> <td> HTML; if(ini_get('allow_url_fopen')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(ini_get('allow_url_fopen')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>File Get Contents</td> <td>On</td> <td> HTML; if(function_exists('file_get_contents')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(function_exists('file_get_contents')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>Sessão Auto Start</td> <td>Off</td> <td> HTML; if(ini_get('session_auto_start')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(!ini_get('session_auto_start')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>Safe Mode</td> <td>Off</td> <td> HTML; if(ini_get('safe_mode')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(!ini_get('safe_mode')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>Short Open Tags</td> <td>On</td> <td> HTML; if(ini_get('short_open_tag')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(ini_get('short_open_tag')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>Magic Quotes GPC</td> <td>Off</td> <td> HTML; if(ini_get('magic_quotes_gpc')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(!ini_get('magic_quotes_gpc')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>Register Globals</td> <td>Off</td> <td> HTML; if(ini_get('register_globals')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(!ini_get('register_globals')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>PHPMail</td> <td>On</td> <td> HTML; if(function_exists('mail')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(function_exists('mail')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { $i = $i + 1; echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>MySQLi</td> <td>On</td> <td> HTML; if(extension_loaded('mysqli')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(extension_loaded('mysqli')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>ZIP</td> <td>On</td> <td> HTML; if(extension_loaded('zip')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(extension_loaded('zip')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>MBString</td> <td>On</td> <td> HTML; if(extension_loaded('mbstring')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(extension_loaded('mbstring')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> <tr> <td>XML</td> <td>On</td> <td> HTML; if(extension_loaded('libxml')) { echo 'On'; } else { echo 'Off'; } $MeuHtml .= <<<HTML </td> <td> HTML; if(extension_loaded('libxml')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> </table> <hr> <h6><b>Diretórios e Permissões de Arquivos</b></h6><br> <table class="table table-condensed table-bordered table-striped"> <tr> <th>Diretório</th> <th style="width: 40px">Status</th> </tr> <tr> <td>database</td> <td> HTML; if(is_writable('database')) { $i = $i + 1; echo '<button type="button" class="btn btn-success"><i class="icon-check"></i></button>'; } else { echo '<button type="button" class="btn btn-danger"><i class="icon-close"></i></button>'; } $MeuHtml .= <<<HTML </td> </tr> </table> <hr> <h6><b>Pontuação / Compatibilidade</b></h6><br> <div class="progress"> <div class="progress-bar progress-bar-striped progress-bar-animated HTML; echo ProgressBar(substr(VerificaPontuacao($i,'16'),0,4)); $PontPorce = VerificaPontuacao($i,'16'); $pont100 = substr(VerificaPontuacao($i,'16'),0,4); $MeuHtml .= <<<HTML " role="progressbar" aria-valuemax="100" style="width: {$PontPorce}%;"> <strong>{$pont100} / 100</strong> </div> </div> <center> <br> <button class="btn btn-primary" onclick="document.location.href='{$URL}?step=1';">Verificar</button> <button class="btn btn-primary" onclick="document.location.href='{$URL}?step=2';">Próximo</button> </center> </div> </div> HTML; } elseif (isset($_GET['step']) && $_GET['step'] == '2') { $MeuHtml .= <<<HTML <div class="card no-b"> <div class="card-header pb-0"> <div class="stepper sw-main sw-theme-circles" id="smartwizard" data-options='{ "theme":"sw-theme-circles", "transitionEffect":"fade" }'> <ul class="nav step-anchor"> <li><a href="#step-1y">1</a></li> <li class="active"><a href="#step-2y">2</a></li> <li><a href="#step-3y">3</a></li> <li><a href="#step-4y">4</a></li> </ul> </div> </div> <div class="card-body "> <iframe src="{$urlApi}api/allinstall/termos.php{$Frame}" class="license" frameborder="0" scrolling="auto"></iframe> <form action="setup.php"> <input type="hidden" name="step" value="3"> <label><input type="checkbox" required=""> Sim, eu aceito</label> <center> <br> <a href="javascript:history.back()"><button class="btn btn-primary">Voltar</button></a> <button class="btn btn-primary" type="submit">Próximo</button> </center> </form> </div> </div> HTML; } elseif (isset($_GET['step']) && $_GET['step'] == '3') { $MeuHtml .= <<<HTML <div class="card no-b"> <div class="card-header pb-0"> <div class="stepper sw-main sw-theme-circles" id="smartwizard" data-options='{ "theme":"sw-theme-circles", "transitionEffect":"fade" }'> <ul class="nav step-anchor"> <li><a href="#step-1y">1</a></li> <li class="active"><a href="#step-2y">2</a></li> <li class="active"><a href="#step-3y">3</a></li> <li><a href="#step-4y">4</a></li> </ul> </div> </div> <div class="card-body"> <form method="post" action="?InstallDB"> <h6><b>1. MySQL - Configuração do Banco de Dados</b></h6><hr> <div class="form-group row"> <label class="col-sm-3 control-label">MySQL Host:</label> <div class="col-sm-9"> <input class="form-control" name="dbhost" value="localhost" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Usuário MySQL:</label> <div class="col-sm-9"> <input class="form-control" name="dbuser" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Senha MySQL:</label> <div class="col-sm-9"> <input class="form-control" name="dbpass"> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Nome do Banco MySQL:</label> <div class="col-sm-9"> <input class="form-control" name="dbname" required> </div> </div> <h6><b>2. Configuração Comum</b></h6><hr> <div class="form-group row"> <label class="col-sm-3 control-label">Nome do Site:</label> <div class="col-sm-9"> <input class="form-control" name="nomesite" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">URL do Site:</label> <div class="col-sm-9"> <input class="form-control" name="urlsite" value="{$urlsite}" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">URL de Instalação:</label> <div class="col-sm-9"> <input class="form-control" name="siteurl" value="{$siteurl}" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Extensão:</label> <div class="col-sm-9"> <select class="form-control" name="extensao" required> <option value=""> Selecionar Extensão </option> <option value="1"> MYSQLI </option> <option value="2"> PDO </option> </select> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Define TimeZone:</label> <div class="col-sm-9"> <select class="form-control" name="timezone" id="timezone"> HTML; foreach ($timezones as $timezone) : echo '<option value="'.$timezone.'" '.$timezone === $current_timezone ? 'selected' : ''.'> '.$timezone.' </option>'; endforeach; $MeuHtml .= <<<HTML </select> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">E-mail:</label> <div class="col-sm-9"> <input class="form-control" name="email" required> <em>Mesmo e-mail cadastrado em nosso Site.</em> </div> </div> <h6><b>3. Configuração do Administrador</b></h6><hr> <div class="form-group row"> <label class="col-sm-3 control-label">Nome do Usuário:</label> <div class="col-sm-9"> <input class="form-control" name="usuario" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Login:</label> <div class="col-sm-9"> <input class="form-control" name="login" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Senha:</label> <div class="col-sm-9"> <input class="form-control" type="password" name="senha" required> </div> </div> <div class="form-group row"> <label class="col-sm-3 control-label">Senha[confimação]:</label> <div class="col-sm-9"> <input class="form-control" type="password" name="senhaconfirm" required> </div> </div> <center> <a class="btn btn-primary" href="javascript:history.back()">Voltar</a> <button class="btn btn-primary">Próximo</button> </center> </form> </div> </div> HTML; } elseif (isset($_GET['step']) && $_GET['step'] == '4') { $MeuHtml .= <<<HTML <div class="card no-b"> <div class="card-header pb-0"> <div class="stepper sw-main sw-theme-circles" id="smartwizard" data-options='{ "theme":"sw-theme-circles", "transitionEffect":"fade" }'> <ul class="nav step-anchor"> <li><a href="#step-1y">1</a></li> <li class="active"><a href="#step-2y">2</a></li> <li class="active"><a href="#step-3y">3</a></li> <li class="active"><a href="#step-4y">4</a></li> </ul> </div> </div> <div class="card-body"> <div> <h4><b>Instalação realizada com sucesso!</b></h4> <p>Agora você poderá utilizar o seu {$projeto}, em caso de dúvidas entre em contato com o suporte: <b>{$emailautor}</b></p> </div> <center> <form action="{$URL}?step=4" method="post"> <button type="submit" name="realizar_login" class="btn btn-primary">Realizar Login</button> </form> </center> </div> </div> HTML; } if (isset($_POST['realizar_login'])) { // Deletar os arquivos @unlink('setup.php'); @unlink($URL); @unlink('termos.php'); @unlink('database/BD.sql'); @unlink('controller/setup.php'); // Redirecionar para a página de login ou outra página desejada header('Location: login.php?finish'); exit; } $MeuHtml .= <<<HTML <div class="box-footer"> <center> Todos os Direitos Reservados {$autor} </center> </div> </div> </div> </div> </div> </main> </div> <script src="{$urlApi}api/allinstall/assets/js/app.js"></script> </body> </html> HTML; echo $MeuHtml;
  5. Jack Oliveira

    PHP - Gerar vencimento parcelas com período variado

    Uma bordagem diferente se seu formulário HTML possui os campos necessários e um botão para disparar a função de gerar parcelas geração de parcelas com JSON e AJAX ou Fetch API / PHP 7.4 quanto no PHP 8.3 <form id="parcelasForm"> <input type="date" id="dtaentr" name="dtaentr" required> <select id="formaPgto" name="formaPgto" required> <option value="28/42/56">28/42/56</option> <option value="30/60/90">30/60/90</option> <!-- Outros intervalos --> </select> <input type="number" id="vlrtotal" name="vlrtotal" step="0.01" required> <button type="button" onclick="gerarParcelas()">Gerar Parcelas</button> </form> <table id="tbparcs"> <thead> <tr> <th>Data de Vencimento</th> <th>Valor da Parcela</th> <th>Ação</th> </tr> </thead> <tbody> </tbody> </table> Enviar via AJAX function gerarParcelas() { var dataInicial = document.getElementById("dtaentr").value; var intervalos = document.getElementById("formaPgto").value; var valorTotal = document.getElementById("vlrtotal").value; var dados = { dataInicial: dataInicial, intervalos: intervalos, valorTotal: valorTotal }; $.ajax({ url: 'gerar_parcelas.php', // URL do seu script PHP type: 'POST', data: JSON.stringify(dados), contentType: 'application/json', success: function(response) { var parcelas = JSON.parse(response); mostrarParcelas(parcelas); }, error: function(error) { console.log("Erro: ", error); } }); } function mostrarParcelas(parcelas) { var tbody = $("#tbparcs tbody"); tbody.empty(); parcelas.forEach(function(parcela) { var html = "<tr>"; html += "<td>" + parcela.data_vencimento + "</td>"; html += "<td>R$ " + parcela.valor_parcela.toFixed(2).replace(".", ",") + "</td>"; html += "<td style='text-align:center;'><button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'></button></td>"; html += "</tr>"; tbody.append(html); }); } Ou enviar via Fetch API function gerarParcelas() { var dataInicial = document.getElementById("dtaentr").value; var intervalos = document.getElementById("formaPgto").value; var valorTotal = document.getElementById("vlrtotal").value; var dados = { dataInicial: dataInicial, intervalos: intervalos, valorTotal: valorTotal }; fetch('gerar_parcelas.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(dados) }) .then(response => response.json()) .then(parcelas => { mostrarParcelas(parcelas); }) .catch(error => { console.log("Erro: ", error); }); } function mostrarParcelas(parcelas) { var tbody = document.querySelector("#tbparcs tbody"); tbody.innerHTML = ''; parcelas.forEach(function(parcela) { var html = "<tr>"; html += "<td>" + parcela.data_vencimento + "</td>"; html += "<td>R$ " + parcela.valor_parcela.toFixed(2).replace(".", ",") + "</td>"; html += "<td style='text-align:center;'><button type='button' class='btn btn-danger btn-alterar-parc' style='margin-right: 1%; padding: 1px 2px;' title='Editar'></button></td>"; html += "</tr>"; tbody.innerHTML += html; }); } retornar dados com JSON <?php // Recebe o JSON enviado pelo AJAX $data = json_decode(file_get_contents('php://input'), true); $dataInicial = new DateTime($data['dataInicial']); $intervalos = explode("/", $data['intervalos']); $valorTotal = floatval($data['valorTotal']); function gerarParcelas($dataInicial, $intervalos, $valorTotal) { $datasParcelas = []; $quantidadeParcelas = count($intervalos); $valorParcela = floor($valorTotal / $quantidadeParcelas * 100) / 100; $somaParcelas = 0; for ($i = 0; $i < $quantidadeParcelas; $i++) { if ($i == $quantidadeParcelas - 1) { $valorParcelaAtual = $valorTotal - $somaParcelas; } else { $valorParcelaAtual = $valorParcela; } $somaParcelas += $valorParcelaAtual; $dataVencimento = clone $dataInicial; $dataVencimento->modify("+{$intervalos[$i]} days"); $datasParcelas[] = [ 'data_vencimento' => $dataVencimento->format('Y-m-d'), 'valor_parcela' => $valorParcelaAtual ]; } return $datasParcelas; } $parcelas = gerarParcelas($dataInicial, $intervalos, $valorTotal); echo json_encode($parcelas); ?>
  6. Jack Oliveira

    DRAP AND DROP

    Ola pessoal, boa noite a todos Bom é o seguinte tenho um codigo html onde selecione um modelo de site para poder criar na base selecionada, ele criar ate então, mas ele esta pegando somente o index.html Mas quero que ele salva junto ao novo projeto o css, js, img, images, assets e fonts, quando faço os ajuste para que pega tudo isso ele me da erro ao salvar Vou mostra parte do html onde faz a seleção dos modelos <!-- 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 3 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> A ideia aqui é salvar tudo que tiver depois do themes/demo1/ quando ele salva so salva my-pasta/index.html e quando for salva ele salva dentro de um pasta Projetos/MeuSite1 Projetos/MeuSite2 e assim vai Este é o save.php <?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 ''; } //sanitize, remova o ponto duplo .. e remova os parâmetros get, se houver $file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file))); if ($file) { $file = __DIR__ . DIRECTORY_SEPARATOR . $file; } else { return ''; } //permitir apenas extensão .html 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; } $html = ''; $file = ''; $action = ''; if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) { $startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']); $html = ''; if ($startTemplateUrl) { $html = file_get_contents($startTemplateUrl); } } else if (isset($_POST['html'])){ $html = substr($_POST['html'], 0, MAX_FILE_LIMIT); if (!ALLOW_PHP) { //if (strpos($html, '<?php') !== false) { 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) { //ações do gerenciador de arquivos, excluir e renomear 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': //bloco ou seção $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 { //salvar pagina 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!'); } } Espero que possam entender o que preciso aqui.... fico no aguardo! quando eu tento mudar a forma de salva no php, ele me da erro de que não foi salvo, e volta ao orginal como esta ai acima ele salva, talvez eu esteja escapando alguma coisa que não estou vendo....
  7. Jack Oliveira

    DRAP AND DROP

    Ola @Williams Duarte, Eu fiz aqui e não salva ainda. Mas valeu ai...
  8. Jack Oliveira

    Código pho não executa em banco de dados grande

    otimizar sua consulta e melhorar a performance, a ideia principal é evitar subconsultas complexas e garantir que os índices corretos estão sendo utilizados. SELECT P.id, P.name, GROUP_CONCAT(I1.name ORDER BY I1.name) AS items FROM product P JOIN product_item PI1 ON P.id = PI1.productID JOIN item I1 ON I1.id = PI1.itemID LEFT JOIN (SELECT PI2.productID FROM product_item PI2 JOIN item I2 ON I2.id = PI2.itemID WHERE I2.active IS NULL OR I2.active != 'S' GROUP BY PI2.productID) AS InactiveItems ON P.id = InactiveItems.productID WHERE I1.name = 'casa' AND InactiveItems.productID IS NULL GROUP BY P.id, P.name; os índices apropriados estão configurados para as tabelas envolvidas. Os seguintes índices são recomendados: CREATE INDEX idx_product_item_productID ON product_item(productID); CREATE INDEX idx_product_item_itemID ON product_item(itemID); CREATE INDEX idx_item_id ON item(id); CREATE INDEX idx_item_name ON item(name); CREATE INDEX idx_item_active ON item(active); Php <?php // Configuração da conexão $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; // Cria a conexão $conn = new mysqli($servername, $username, $password, $dbname); // Verifica a conexão if ($conn->connect_error) { die("Falha na conexão: " . $conn->connect_error); } // Cria a consulta $sql = " SELECT P.id, P.name, GROUP_CONCAT(I1.name ORDER BY I1.name) AS items FROM product P JOIN product_item PI1 ON P.id = PI1.productID JOIN item I1 ON I1.id = PI1.itemID LEFT JOIN (SELECT PI2.productID FROM product_item PI2 JOIN item I2 ON I2.id = PI2.itemID WHERE I2.active IS NULL OR I2.active != 'S' GROUP BY PI2.productID) AS InactiveItems ON P.id = InactiveItems.productID WHERE I1.name = 'casa' AND InactiveItems.productID IS NULL GROUP BY P.id, P.name; "; // Executa a consulta $result = $conn->query($sql); if ($result->num_rows > 0) { // Saída dos dados de cada linha while ($row = $result->fetch_assoc()) { echo "ID: " . $row["id"] . " - Nome: " . $row["name"] . " - Itens: " . $row["items"] . "<br>"; } } else { echo "0 resultados"; } // Fecha a conexão $conn->close(); ?> Veja se sql assim ajudar melhor o tempo da consulta
  9. Jack Oliveira

    Código pho não executa em banco de dados grande

    Se os nomes dos itens forem exatamente "casa" e "apartamento" pode usar IN SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name IN ('casa', 'apartamento') Com php <?php // Configuração da conexão $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; // Cria a conexão $conn = new mysqli($servername, $username, $password, $dbname); // Verifica a conexão if ($conn->connect_error) { die("Falha na conexão: " . $conn->connect_error); } // Define os itens que você deseja buscar $items = ['casa', 'apartamento']; // Cria a consulta $sql = "SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name IN ('" . implode("','", array_map([$conn, 'real_escape_string'], $items)) . "')"; // Executa a consulta $result = $conn->query($sql); if ($result->num_rows > 0) { // Saída dos dados de cada linha while ($row = $result->fetch_assoc()) { echo "productID: " . $row["productID"]. "<br>"; } } else { echo "0 resultados"; } // Fecha a conexão $conn->close(); ?> Se você precisar buscar por correspondências parciais, como "casa%" ou "apartamento%": Pode usar OR com Like SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name LIKE 'casa%' OR I.name LIKE 'apartamento%' Php <?php // Configuração da conexão $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; // Cria a conexão $conn = new mysqli($servername, $username, $password, $dbname); // Verifica a conexão if ($conn->connect_error) { die("Falha na conexão: " . $conn->connect_error); } // Define os itens que você deseja buscar $items = ['casa', 'apartamento']; // Cria a consulta $sql = "SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE "; $whereClauses = []; foreach ($items as $item) { $escapedItem = $conn->real_escape_string($item); $whereClauses[] = "I.name LIKE '%$escapedItem%'"; } $sql .= implode(' OR ', $whereClauses); // Executa a consulta $result = $conn->query($sql); if ($result->num_rows > 0) { // Saída dos dados de cada linha while ($row = $result->fetch_assoc()) { echo "productID: " . $row["productID"]. "<br>"; } } else { echo "0 resultados"; } // Fecha a conexão $conn->close(); ?> Agora se você estiver buscando pelos nomes exatos e preferir a sintaxe com OR SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name = 'casa' OR I.name = 'apartamento' <?php // Configuração da conexão $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; // Cria a conexão $conn = new mysqli($servername, $username, $password, $dbname); // Verifica a conexão if ($conn->connect_error) { die("Falha na conexão: " . $conn->connect_error); } // Define os itens que você deseja buscar $items = ['casa', 'apartamento']; // Cria a consulta $sql = "SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE "; $whereClauses = []; foreach ($items as $item) { $escapedItem = $conn->real_escape_string($item); $whereClauses[] = "I.name = '$escapedItem'"; } $sql .= implode(' OR ', $whereClauses); // Executa a consulta $result = $conn->query($sql); if ($result->num_rows > 0) { // Saída dos dados de cada linha while ($row = $result->fetch_assoc()) { echo "productID: " . $row["productID"]. "<br>"; } } else { echo "0 resultados"; } // Fecha a conexão $conn->close(); ?> Se você precisar de correspondências exatas, utilize IN ou OR com igualdade. Se precisar de correspondências parciais, utilize LIKE com OR. O php é só uma base de como poderia esta fazendo blz.. Ajuste a sua maneira do seu projeto
  10. Jack Oliveira

    Instalador

    Obrigado por responder Então Williams eu quero poder ofuscar codigo php e html junto, mas sempre dá erro.. Se eu ofuscar só o php da certo Eu fiz este ofuscar e simples <?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); $response = [ 'status' => 'error', 'message' => 'Ocorreu um erro desconhecido.' ]; function obfuscatePHP($code, $fileName) { // Diretório onde o arquivo de código ofuscado será salvo $outputDirectory = 'CodigoFuscado/'; // Cria um nome de subdiretório baseado na data e hora atual $subDirectoryName = 'pasta_' . date('d-m-Y-H-i-s') . '/'; $subDirectoryPath = $outputDirectory . $subDirectoryName; // Verifica se o subdiretório não existe; se não, tenta criá-lo if (!file_exists($subDirectoryPath) && !is_dir($subDirectoryPath)) { if (!mkdir($subDirectoryPath, 0777, true)) { return false; } } // Caminho completo do arquivo de saída dentro do subdiretório $newFileName = $subDirectoryPath . $fileName; // Escreve o código ofuscado no arquivo $obfuscatedContent = "<?php\n"; $obfuscatedContent .= "// Todos os Direitos Reservados a PHPADMIN Fone: (69) 9.9203-0882\n"; $obfuscatedContent .= "\$OOO00O00O0=file(__FILE__);"; $obfuscatedContent .= "eval(gzinflate(base64_decode('"; $obfuscatedContent .= base64_encode(gzdeflate($code)); $obfuscatedContent .= "')));\n"; $obfuscatedContent .= "?>"; if (file_put_contents($newFileName, $obfuscatedContent)) { return $newFileName; } else { return false; } } if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { $fileTmpPath = $_FILES['file']['tmp_name']; $fileName = $_FILES['file']['name']; $fileSize = $_FILES['file']['size']; $fileType = $_FILES['file']['type']; $fileNameCmps = explode(".", $fileName); $fileExtension = strtolower(end($fileNameCmps)); if ($fileExtension === 'php') { $code = file_get_contents($fileTmpPath); // Remove tags PHP de abertura e fechamento $code = str_replace(['<?php', '?>'], '', $code); // Realiza a ofuscação $generatedFileName = obfuscatePHP($code, $fileName); if ($generatedFileName) { $response['status'] = 'success'; $response['message'] = "Arquivo ofuscado criado com sucesso: $generatedFileName"; } else { $response['message'] = 'Erro ao criar o arquivo ofuscado.'; } } else { $response['message'] = 'Tipo de arquivo inválido. Apenas arquivos PHP são permitidos.'; } } else { $response['message'] = 'Erro no upload do arquivo. Código de erro: ' . $_FILES['file']['error']; } } else { $response['message'] = 'Método de requisição inválido.'; } header('Content-Type: application/json'); echo json_encode($response); ?> Então eu pensei em mudar pra <<<HTML. Pra ver se resolve.. Se eu conseguir fazer com todos os php e html junto seria bom.. Eu posso esta errado em algo no php de ofuscado
  11. Jack Oliveira

    DRAP AND DROP

    obrigado Williams Duarte Vou por em pratica aqui
  12. Jack Oliveira

    Data igual do facebook

    você pode criar um array associativo onde as chaves são os períodos no singular e os valores são os períodos no plural. Dessa forma, você evita problemas com a pluralização manual. Além disso, algumas melhorias podem ser feitas para tornar o código mais claro e eficiente. <?php class Data { public static function ExibirTempoDecorrido($date) { if (empty($date)) { return "Informe a data"; } $periodos = array( "segundo" => "segundos", "minuto" => "minutos", "hora" => "horas", "dia" => "dias", "semana" => "semanas", "mês" => "meses", "ano" => "anos", "década" => "décadas" ); $duracao = array(60, 60, 24, 7, 4.35, 12, 10); $agora = time(); $unix_data = strtotime($date); // Verificar a validade da data if (empty($unix_data)) { return "Data inválida"; } // Verificar se é uma data futura ou passada if ($agora > $unix_data) { $diferenca = $agora - $unix_data; $tempo = "atrás"; } else { $diferenca = $unix_data - $agora; $tempo = "agora"; } $j = 0; while ($diferenca >= $duracao[$j] && $j < count($duracao) - 1) { $diferenca /= $duracao[$j]; $j++; } $diferenca = round($diferenca); // Determinar a forma singular ou plural $periodo = array_keys($periodos)[$j]; if ($diferenca != 1) { $periodo = $periodos[$periodo]; } return "$diferenca $periodo $tempo"; } } // Chame o método estático ExibirTempoDecorrido passando uma data $data = '2023-05-15 14:00:00'; // Exemplo de data echo Data::ExibirTempoDecorrido($data); ?>
  13. Jack Oliveira

    Modal Bootstrap 5

    Não sei se já resolveu a sua questão aí... Para dividir o envio da mensagem em duas etapas com modais, você pode seguir o seguinte processo: Primeiro Modal: Contém o formulário de contato. Processamento do Formulário: O formulário é enviado através de AJAX. Segundo Modal: Exibe uma mensagem de sucesso ou erro após o envio. Aqui está um exemplo detalhado de como você pode implementar isso: Primeiro Modal com Formulário <!-- Primeiro Modal --> <div class="modal fade" id="contactModal" tabindex="-1" aria-labelledby="contactModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="contactModalLabel">Quero fazer este curso</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <form id="contactForm"> <div class="mb-3"> <label for="name" class="form-label">Nome</label> <input type="text" class="form-control" id="name" name="name" required> </div> <div class="mb-3"> <label for="email" class="form-label">Email</label> <input type="email" class="form-control" id="email" name="email" required> </div> <div class="mb-3"> <label for="message" class="form-label">Mensagem</label> <textarea class="form-control" id="message" name="message" rows="3" required></textarea> </div> <button type="submit" class="btn btn-primary">Enviar</button> </form> </div> </div> </div> </div> Segundo Modal para Mensagem de Sucesso/Erro <!-- Segundo Modal --> <div class="modal fade" id="statusModal" tabindex="-1" aria-labelledby="statusModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="statusModalLabel">Status da Mensagem</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body" id="statusMessage"> <!-- Mensagem de status será inserida aqui --> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button> </div> </div> </div> </div> Script AJAX para Envio do Formulário <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function(){ $("#contactForm").on("submit", function(e){ e.preventDefault(); $.ajax({ type: "POST", url: "send_message.php", // O arquivo PHP que processa o formulário data: $(this).serialize(), success: function(response){ $("#contactModal").modal('hide'); $("#statusMessage").html(response); $("#statusModal").modal('show'); }, error: function(){ $("#contactModal").modal('hide'); $("#statusMessage").html('<p class="text-danger">Houve um erro ao enviar sua mensagem. Tente novamente mais tarde.</p>'); $("#statusModal").modal('show'); } }); }); }); </script> Arquivo PHP (send_message.php) para Processar o Formulário com PHPMailer <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = htmlspecialchars($_POST['name']); $email = htmlspecialchars($_POST['email']); $message = htmlspecialchars($_POST['message']); $mail = new PHPMailer(true); try { // Configurações do servidor $mail->isSMTP(); $mail->Host = 'smtp.exemplo.com'; $mail->SMTPAuth = true; $mail->Username = 'seu_email@exemplo.com'; $mail->Password = 'sua_senha'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; // Remetente e destinatário $mail->setFrom('seu_email@exemplo.com', 'Seu Nome'); $mail->addAddress('destinatario@exemplo.com', 'Nome Destinatário'); // Conteúdo do email $mail->isHTML(true); $mail->Subject = 'Nova mensagem do formulário de contato'; $mail->Body = "<p><strong>Nome:</strong> {$name}</p> <p><strong>Email:</strong> {$email}</p> <p><strong>Mensagem:</strong><br>{$message}</p>"; $mail->send(); echo '<p class="text-success">Sua mensagem foi enviada com sucesso!</p>'; } catch (Exception $e) { echo '<p class="text-danger">Houve um erro ao enviar sua mensagem. Tente novamente mais tarde.</p>'; } } ?> Não sei como você está fazendo aí, mais pode ajustar ao seu critério
  14. Jack Oliveira

    Código pho não executa em banco de dados grande

    Reescreva sua consulta para minimizar o número de operações e junções complexas. Vou fornecer uma versão otimizada da sua consulta: 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 WHERE P.id IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name = 'casa' ) AND P.id NOT IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.active IS NULL OR I.active != 'S' ) GROUP BY P.id, P.name; utilização de subconsultas pode ser custosa, especialmente em grandes bancos de dados. Tente minimizar subconsultas complexas. Vou tentar reescrever a consulta para evitar subconsultas: SELECT P.id, P.name, GROUP_CONCAT(I.name ORDER BY I.name) AS items FROM product P JOIN product_item PI1 ON P.id = PI1.productID JOIN item I1 ON I1.id = PI1.itemID WHERE I1.name = 'casa' AND NOT EXISTS ( SELECT 1 FROM product_item PI2 JOIN item I2 ON I2.id = PI2.itemID WHERE PI2.productID = P.id AND (I2.active IS NULL OR I2.active != 'S') ) GROUP BY P.id, P.name; Execute comandos de análise de índices para garantir que o banco de dados está utilizando os índices de forma eficiente: ANALYZE TABLE item; ANALYZE TABLE product; ANALYZE TABLE product_item; A principal ideia é reduzir a complexidade da consulta e garantir que os índices adequados estão sendo utilizados pelo banco de dados. Além disso, certifique-se de testar cada otimização individualmente para verificar se há melhorias no desempenho.
  15. Jack Oliveira

    PHP - Dúvida referente informação de POST

    Uma solução seria <div class="tab-pane fade" id="relacionamento" role="tabpanel" aria-labelledby="relacionamento-tab"> <div class="txtProd"> <?php echo $result->cod_interno; ?> - <?php echo $result->descricao; ?> </div> <div class="card-body"> <form id="frmRelac" action="javascript:;" method="post" accept-charset="utf-8" enctype="multipart/form-data"> <div class="row"> <div class="col-md-8"> <label for="idProdutos">Produto:</label> <div class="input-group"> <input type="hidden" name="idProdutos" id="idProdutos" value="<?= $result->idProdutos ?>"> <input type="text" class="form-control" id="descritem" name="descritem" style="font-size:15px; font-weight:bold; background:#ffffff;" placeholder="Pesquisar Produto para ser Relacionado" disabled> <span class="input-group-btn"> <button class="btn btn-warning" type="button" id="btnProd" name="btnProd" data-toggle="modal" data-target="#modal_prod"> <span class="fa fa-search"></span> Pesquisar </button> </span> </div> </div> <br/> <div class="col-md-2" style="margin-top:32px;"> <input type="hidden" id="idPrds" name="idPrds" value="<?php echo $result->idProdutos; ?>"/> <input type="hidden" id="idEmps" name="idEmps" value="<?php echo $emprsa[0]->idEmpresas; ?>"/> <button type="submit" id="btn-adic" class="btn btn-success" style="width:100%;"> Relacionar</button> </div> <div class="col-md-2" style="margin-top:32px;"> <button id="btn-limp" class="btn btn-danger" style="width:100%;"> <i class="fa fa-paint-brush icon-white"></i> Limpar </button> </div> <div class="clearfix"></div> <br/> </div> </form> <div class="clearfix"></div> <div class="row"> <div class="col-md-12" id="divRelac" style="padding: 1%; margin-left:0px;"> <table class="table" id="tab_prods"> <thead> <tr style="background-color:#BDDCDC;"> <th style="text-align:center;">CÓDIGO</th> <th style="text-align:center;">DESCRIÇÃO DO PRODUTO</th> <th style="text-align:center;">CATEGORIA</th> <th style="text-align:center;">IMAGEM</th> <th style="text-align:center;">AÇÃO</th> </tr> </thead> <tbody> <?php foreach ($relacto as $rlc) { echo '<tr>'; echo '<td width="20" height="10" style="text-align:center;">'.$rlc->cod_interno.'</td>'; echo '<td width="250" height="10" style="text-align:left;">'.$rlc->descricao.'</td>'; echo '<td width="20" height="10" style="text-align:center;">'.$rlc->categoria.'</td>'; echo '<td width="20" height="10" style="text-align:center;">' ?> <?php if ($rlc->imagemCapa != null) { ?> <img src="<?php echo $rlc->imagemCapa; ?>" width="40px;" height="30px" alt=""> <?php } else { ?> <img src="<?php echo base_url() ?>assets/img/semImg.jpg" width="40px;" height="30px" alt=""> <?php } ?> <?php '</td>'; echo '<td width="20" height="10" style="text-align:center;"><span idExcrlc="'.$rlc->idrelacionar.'" title="Excluir Produto Relacionado" class="btn btn-danger" style="margin-right: 1%; padding: 2px 5px;"><i class="fa fa-trash icon-white"></i></span></td>'; echo '</tr>'; } ?> </tbody> </table> &nbsp; </div> </div> </div> </div> javascript //Adicionar Relacionamento $("#frmRelac").validate({ submitHandler: function (form) { var dados = $(form).serialize(); $("#divRelac").html("<div class='progress'><div class='progress-bar progress-bar-primary progress-bar-striped' role='progressbar' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100' style='width: 100%''></div></div>"); $.ajax({ type: "POST", url: "<?php echo base_url();?>admin/produtos/adicionarRelac", data: dados, dataType: 'json', success: function (data) { if (data.result == true) { $("#divRelac").load("<?php echo current_url();?> #divRelac"); $("#descritem").val(''); //Desabilita os Buttons document.getElementById("btn-adic").disabled = true; document.getElementById("btn-limp").disabled = true; } else { alert('Ocorreu um erro ao tentar adicionar um produto.'); } } }); return false; } }); Atualize seu formulário para garantir que todos os campos necessários sejam preenchidos e verificados antes do envio. Em particular, adicione um atributo required aos campos que não podem ser vazios <input type="hidden" name="idProdutos" id="idProdutos" value="<?= $result->idProdutos ?>" required> <input type="hidden" id="idPrds" name="idPrds" value="<?php echo $result->idProdutos; ?>" required /> <input type="hidden" id="idEmps" name="idEmps" value="<?php echo $emprsa[0]->idEmpresas; ?>" required /> A função $(form).serialize() coleta os dados do formulário e os envia via AJAX. Verifique se o conteúdo de dados está correto e contém todos os parâmetros necessários: console.log(dados); // Adicione esta linha para depuração A função de sucesso do AJAX deve lidar com a resposta JSON e atualizar o DOM adequadamente. Certifique-se de que o manipulador AJAX está correto: $.ajax({ type: "POST", url: "<?php echo base_url();?>admin/produtos/adicionarRelac", data: dados, dataType: 'json', success: function (data) { if (data.result == true) { $("#divRelac").load("<?php echo current_url();?> #divRelac"); $("#descritem").val(''); // Desabilita os Buttons document.getElementById("btn-adic").disabled = true; document.getElementById("btn-limp").disabled = true; } else { alert('Ocorreu um erro ao tentar adicionar um produto.'); } }, error: function (xhr, status, error) { console.error("Erro na requisição:", error); } }); Adicione um manipulador de erro para capturar qualquer erro durante a requisição AJAX. Certifique-se de que a função adicionarRelac no seu controlador PHP está recebendo e processando os dados corretamente. Exemplo de Código PHP <?php public function adicionarRelac() { $idPrds = $this->input->post('idPrds'); $idEmps = $this->input->post('idEmps'); $idProdutos = $this->input->post('idProdutos'); // Verifique se os valores estão recebendo os dados corretos if($idPrds && $idEmps && $idProdutos) { // Processar a adição do relacionamento $result = $this->produtos_model->adicionarRelacionamento($idPrds, $idEmps, $idProdutos); if ($result) { echo json_encode(['result' => true]); } else { echo json_encode(['result' => false]); } } else { echo json_encode(['result' => false, 'message' => 'Dados insuficientes']); } } Exemplo de Método do Modelo <?php public function adicionarRelacionamento($idPrds, $idEmps, $idProdutos) { $data = [ 'idPrds' => $idPrds, 'idEmps' => $idEmps, 'idProdutos' => $idProdutos ]; return $this->db->insert('produtos_relacionados', $data); } Certifique-se de que a função adicionarRelacionamento no seu modelo está configurada corretamente para receber os dados e inserir no banco de dados: <?php public function adicionarRelacionamento($idPrds, $idEmps, $idProdutos) { $data = [ 'idPrds' => $idPrds, 'idEmps' => $idEmps, 'idProdutos' => $idProdutos ]; return $this->db->insert('produtos_relacionados', $data); } Código PHP OOP/PDO Atualizado para Adicionar Relacionamento Aqui está o exemplo do código PHP para adicionar um relacionamento entre produtos, atualizado para PDO e OOP: <?php class Database { private $host = 'localhost'; private $db_name = 'bancodedados'; private $username = 'usuario'; private $password = 'senha'; public $conn; public function __construct() { $this->connect(); } private function connect() { $dsn = "mysql:host={$this->host};dbname={$this->db_name};charset=utf8"; try { $this->conn = new PDO($dsn, $this->username, $this->password); $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully<br>"; } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); exit; } } public function query($sql, $params = [], $fetch = false) { $stmt = $this->conn->prepare($sql); $stmt->execute($params); if ($fetch) { return $stmt->fetchAll(PDO::FETCH_ASSOC); } return $stmt; } } ?> <?php // Inclua sua configuração PDO require_once 'path/to/Database.php'; // Crie uma nova instância do PDO $db = new Database(); $pdo = $db->getConnection(); // Adicionar Relacionamento if ($_SERVER['REQUEST_METHOD'] === 'POST') { $idPrds = $_POST['idPrds'] ?? null; $idEmps = $_POST['idEmps'] ?? null; $idProdutos = $_POST['idProdutos'] ?? null; if ($idPrds && $idEmps && $idProdutos) { $sql = "INSERT INTO produtos_relacionados (idPrds, idEmps, idProdutos) VALUES (:idPrds, :idEmps, :idProdutos)"; $stmt = $pdo->prepare($sql); $result = $stmt->execute([ ':idPrds' => $idPrds, ':idEmps' => $idEmps, ':idProdutos' => $idProdutos ]); if ($result) { echo json_encode(['result' => true]); } else { echo json_encode(['result' => false, 'message' => 'Erro ao adicionar relacionamento']); } } else { echo json_encode(['result' => false, 'message' => 'Dados insuficientes']); } } // Fechar a conexão com o banco de dados $pdo = null; ?> Revise todas as partes do código, garantindo que os valores estejam sendo passados e processados corretamente. Verifique tanto o lado do cliente (JavaScript) quanto o lado do servidor (PHP) para garantir que a comunicação entre eles esteja correta.
  16. Jack Oliveira

    Integração PIX MercadoPago

    Nao sei se resolveu o seu problema, mas tenta ai <?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); /** * Automatic Mercadopago payment system gateway. * * @name pix-myaac-mercadopago * @author Rafhael Oliveira <rafhaelxd@gmail.com> * @website github.com/thetibiaking/ttk-myaac-plugins * @website github.com/underewarrr/ * @version 1.0.0 */ require_once('/var/www/html/classes/functions.php'); require_once('/var/www/html/system/load.init.php'); require_once('/var/www/html/mercadopago/pix/config.php'); if (isset($config['mercadopago']) && $config['mercadopago'] == true) { } else { echo "MercadoPago is disabled. If you're an admin please configure this script in config.local.php."; return; } if (empty($logged)) { header("Location: " . $noSessionUrl); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $quantidadeSelecionada = (int)$_POST['quantidade']; $cpf = $_POST['cpf']; // Validate CPF if (!validateCPF($cpf)) { echo '<p>CPF inválido. Por favor, verifique e tente novamente.</p>'; exit; } $totalValue = $quantidadeSelecionada * $priceByPoints; $pontosGanhos = $quantidadeSelecionada * $pointsByDonate; $curl = curl_init(); $dados["transaction_amount"] = $totalValue; $dados["description"] = $_POST['description'] ?: 'Value and Coins'; $dados["external_reference"] = "2"; $dados["payment_method_id"] = "pix"; $dados["notification_url"] = $notificationUrl; $dados["payer"]["email"] = $_POST['email_cob']; $dados["payer"]["first_name"] = "Nilza"; $dados["payer"]["last_name"] = "Guimaraes"; $dados["payer"]["identification"]["type"] = "CPF"; $dados["payer"]["identification"]["number"] = $cpf; $dados["payer"]["address"]["zip_code"] = "76240000"; $dados["payer"]["address"]["street_name"] = "Av. Carlos Gomes"; $dados["payer"]["address"]["street_number"] = "411"; $dados["payer"]["address"]["neighborhood"] = "Bela Vista"; $dados["payer"]["address"]["city"] = "Aragarcas"; $dados["payer"]["address"]["federal_unit"] = "GO"; curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.mercadopago.com/v1/payments', CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($dados), CURLOPT_HTTPHEADER => array( 'accept: application/json', 'content-type: application/json', 'Authorization: Bearer ' . $authorizationToken, ), )); $response = curl_exec($curl); $resultado = json_decode($response); $collector_id = isset($resultado->id) ? $resultado->id : null; curl_close($curl); // Verifica se houve um erro na requisição if ($response === false) { echo 'cURL Error: ' . curl_error($curl); } else { if ($debug) { echo '<pre>'; var_dump($resultado); echo '</pre>'; } } if (!$collector_id) { echo '<p>Error: Collector ID not found in the response.</p>'; exit; } echo 'Collector ID: ' . $collector_id; if ($resultado->status === 'pending') { if (!$debug) { echo '<img style="display:block; width:300px;height:300px;" id="base64image" src="data:image/jpeg;base64, ' . $resultado->point_of_interaction->transaction_data->qr_code_base64 . '" />'; echo '<b>Copie:</b> ' . $resultado->point_of_interaction->transaction_data->qr_code; } echo '<p>Você gerou um pix no valor de ' .$totalValue. 'R$ e ' . $pontosGanhos . ' pontos!</p>'; echo '<p>Ao Pagar você recebera seus pontos automaticamente</p>'; echo '<p>Status: ' . $resultado->status . '</p>'; echo '<button onclick="location.href=\'https://meusite.com/?subtopic=mpnotification&id=' . $collector_id . '&debug=' . ($debug ? 'true' : 'false') . '\'" type="button">Conferir Status do Pedido</button> <br>'; $logged = getSession('account'); $sql = "INSERT INTO status(status, codigo, account, points) VALUES(?, ?, ?, ?)"; $stmt = mysqli_prepare($conexao, $sql); if ($stmt) { mysqli_stmt_bind_param($stmt, "sssi", $resultado->status, $collector_id, $logged, $pontosGanhos); mysqli_stmt_execute($stmt); if (mysqli_stmt_affected_rows($stmt) > 0) { echo "Record inserted successfully"; } else { echo "Error inserting record"; } mysqli_stmt_close($stmt); } else { echo "Error preparing statement: " . mysqli_error($conexao); } } else { echo '<p>Erro ao processar o pagamento. Tente novamente.</p>'; if (isset($resultado->message)) { echo '<p>Error Message: ' . $resultado->message . '</p>'; } echo '<p>Status: ' . $resultado->status . '</p>'; } } else { // Formulário para preenchimento dos dados echo ' <form method="POST"> <label for="quantidade">Quantidade de Doações:</label> <select name="quantidade" id="quantidade" required> <option value="1">1 - R$25,00 (60 pontos)</option> <option value="2">2 - R$50,00 (120 pontos)</option> <option value="3">3 - R$75,00 (180 pontos)</option> <!-- Adicione mais opções conforme necessário --> </select> <br> <label for="description">Descrição:</label> <input type="text" name="description" id="description" placeholder="Write any description" required> <br> <label for="email_cob">Email do Pagador:</label> <input type="email" name="email_cob" id="email_cob" required> <br> <label for="cpf">CPF do Pagador:</label> <input type="text" name="cpf" id="cpf" required> <br> <button type="submit">Gerar Pix</button> </form> '; } // Simple CPF validation function function validateCPF($cpf) { $cpf = preg_replace('/[^0-9]/', '', $cpf); if (strlen($cpf) != 11) return false; $sum = 0; for ($i = 0; $i < 9; $i++) { $sum += (int)$cpf[$i] * (10 - $i); } $remainder = $sum % 11; $digit = ($remainder < 2) ? 0 : 11 - $remainder; if ((int)$cpf[9] != $digit) return false; $sum = 0; for ($i = 0; $i < 10; $i++) { $sum += (int)$cpf[$i] * (11 - $i); } $remainder = $sum % 11; $digit = ($remainder < 2) ? 0 : 11 - $remainder; if ((int)$cpf[10] != $digit) return false; return true; } ?>
  17. Jack Oliveira

    problema em usar json para realizar engenharia de dados

    Tente isso import json # Adicione esta linha para importar o módulo json from urllib.request import urlopen # Obtém os dados JSON da API do Vimeo response = urlopen("http://vimeo.com/api/v2/video/57733101.json").read().decode('utf8') # Carrega os dados JSON dados = json.loads(response)[0] # Imprime os dados print(dados) # Exibe o título do vídeo print('Título: ', dados['title']) # Exibe a URL do vídeo print('URL: ', dados['url']) # Exibe a duração do vídeo print('Duração: ', dados['duration'])
  18. Jack Oliveira

    Passar Hora para Campo Input automaticamente

    Solução Simplificada O campo de entrada do tipo time espera um valor no formato HH:MM, então você pode simplificar a função para apenas formatar a hora e os minutos e definir o valor do campo. <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Hora Atual com Bootstrap</title> <!-- CSS do Bootstrap --> <link href="https://stackpath.bootstrapcdn.com/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet"> <style> .container { margin-top: 50px; } </style> </head> <body> <div class="container"> <h2>Definir Hora Atual</h2> <form> <div class="mb-3"> <label for="cotaHrsinicio" class="form-label">Hora da Abertura <span class="text-danger">*</span></label> <input type="time" id="cotaHrsinicio" name="cotaHrsinicio" class="form-control" /> </div> <button type="button" class="btn btn-primary" onclick="setCurrentTime()">Definir Hora Atual</button> </form> </div> <!-- JS do Bootstrap e jQuery --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script> <script> function setCurrentTime() { const now = new Date(); const hours = now.getHours().toString().padStart(2, '0'); const minutes = now.getMinutes().toString().padStart(2, '0'); document.getElementById('cotaHrsinicio').value = `${hours}:${minutes}`; } // Define a hora atual quando a página carrega document.addEventListener('DOMContentLoaded', (event) => { setCurrentTime(); }); </script> </body> </html>
  19. Jack Oliveira

    Formatação de campo nuemrico

    Olá não sei se já resolveu mas tente algo assim <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <title>Formato de Número</title> <style> .formatted-input { width: 200px; padding: 10px; font-size: 16px; } </style> </head> <body> <input type="text" id="numberField" class="formatted-input" placeholder="Digite um número" oninput="formatNumber(this)" /> <script> function formatNumber(input) { // Remove caracteres não numéricos let value = input.value.replace(/\D/g, ''); // Adiciona zero à esquerda para valores menores que 1000 if (value.length <= 3) { input.value = value.padStart(3, '0'); } else if (value.length <= 6) { // Formata para milhar input.value = value.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.'); } else if (value.length <= 7) { // Formata para milhão input.value = value.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.') .replace(/(\d{1,3})\.(\d{3})$/, '$1.$2') .replace(/^(\d{1,3})\.(\d{3})\.(\d{3})$/, '$1.$2.$3'); } else { // Remove os caracteres extras para limitar a 7 dígitos input.value = value.slice(0, 7) .replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.') .replace(/(\d{1,3})\.(\d{3})$/, '$1.$2') .replace(/^(\d{1,3})\.(\d{3})\.(\d{3})$/, '$1.$2.$3'); } } </script> </body> </html>
  20. Jack Oliveira

    Sistema de Login

    Não sei se ja foi resolvido o seu problema, mas vamos la por etapa 1 Etapa: Verificação da Função login() Primeiro, verifique se a função login() na classe User está implementada corretamente e está lidando com a autenticação do usuário. Aqui está um exemplo simplificado da função login() que você pode usar como referência: Então imagino que a sua function login() seja Certifique-se de que password_verify está sendo usado para verificar a senha criptografada e que o usuário está sendo encontrado corretamente. <?php public function login($username, $password, $remember) { $user = $this->find($username); if ($user) { if (password_verify($password, $user->password)) { $this->data = $user; Session::put(Config::get('session/session_name'), $this->data->id); if ($remember) { $hash = random_bytes(128); $hash = bin2hex($hash); // Salvando o hash no banco de dados $this->update(array( 'remember' => $hash, 'remember_expires' => date('Y-m-d H:i:s', strtotime('+1 week')) )); // Criando o cookie Cookie::put('remember', $hash, 604800); } return true; } } return false; } 2 Etapa: Verificação do Token CSRF Certifique-se de que a classe Token está gerando e verificando o token CSRF corretamente. Aqui está um exemplo básico da classe Token: Verifique se o token gerado no formulário está sendo verificado corretamente. <?php class Token { public static function generate() { return Session::put(Config::get('session/token_name'), md5(uniqid())); } public static function check($token) { $tokenName = Config::get('session/token_name'); if (Session::exists($tokenName) && $token === Session::get($tokenName)) { return true; } return false; } } 3 Etapa: Verificação da Validação dos Dados Certifique-se de que a classe Validate está validando corretamente os dados do formulário. Aqui está um exemplo básico da classe Validate: <?php class Validate { private $_errors = array(); public function check($source, $items = array()) { foreach ($items as $item => $rules) { foreach ($rules as $rule => $rule_value) { $value = trim($source[$item]); if ($rule === 'required' && empty($value)) { $this->addError("{$item} is required."); } // Adicione outras validações conforme necessário } } return $this; } public function passed() { return empty($this->_errors); } public function errors() { return $this->_errors; } private function addError($error) { $this->_errors[] = $error; } } 4 Etapa: Verificação da Configuração da Sessão Certifique-se de que a configuração da sessão está correta e que a sessão está sendo iniciada corretamente. Verifique o arquivo core/init.php para a configuração da sessão: <?php session_start(); // Inicia a sessão // as suas outras configurações aqui..... 5 Etapa: Final <?php require_once("core/init.php"); if (Input::exists()) { if (Token::check(Input::get("token"))) { $validate = new Validate(); $validation = $validate->check($_POST, array( "username" => array("required" => true), "password" => array("required" => true) )); if ($validation->passed()) { $user = new User(); $remember = (Input::get("remember")) === "on" ? true : false; $login = $user->login(Input::get("username"), Input::get("password"), $remember); if ($login) { Session::flash("home", "Welcome back!"); Redirect::to("index.php"); } else { echo "Could not log you in."; } } else { foreach ($validation->errors() as $error) { echo $error."<BR>"; } } } else { echo "Invalid token."; } } ?> <form action="" method="POST"> <div class="field"> <label for="username">Username</label> <input type="text" name="username" id="username" value="<?php echo htmlspecialchars(Input::get('username')); ?>"> </div> <div class="field"> <label for="password">Password</label> <input type="password" name="password" id="password"> </div> <div class="field"> <label for="remember"> <input type="checkbox" name="remember" id="remember" <?php echo (Input::get('remember') === "on") ? 'checked' : ''; ?>> Remember me </label> </div> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <input type="submit" value="Log in"> </form> Aqui estão alguns links que podem ser úteis para aprofundar seu entendimento e resolver problemas relacionados a login e segurança: PHP Password Hashing Guide Token CSRF em PHP Documentação do PHP sobre Sessões
  21. Jack Oliveira

    PHP - Cadastro de Faturamento

    Seu codigo esta certo, mas você precisa fazer algumas correções, precisa fazer uns ajustes para que ele funcione conforme você esta esperado. Código para calcular corretamente as datas de vencimento e os valores das parcelas de acordo com as regras que você especificou. Intervalos das Parcelas: O intervalo entre as parcelas não está correto. O intervalo para a 2ª parcela e subsequentes é de 14 dias, e não de 28 dias como está definido na variável $intervalo. Soma dos Valores das Parcelas: Ao formatar o valor das parcelas, você está convertendo o valor para uma string e depois somando isso, o que pode levar a erros. A soma deve ser feita usando números, e a formatação para a exibição deve ser feita separadamente. Correção da Última Parcela: A última parcela não está sendo calculada corretamente. O valor da última parcela deve ser ajustado para garantir que a soma total seja igual ao valor total da compra. Vou mostra 3 abordagem que pode ser feita Abordagem 1: Usando Funções Simples e Arrays casi desejar Nesta abordagem, você pode usar arrays para armazenar as datas de vencimento e valores das parcelas. A lógica para calcular as datas e valores é separada em funções para melhorar a organização e a legibilidade. <?php // Definir um fuso horário padrão date_default_timezone_set('America/Sao_Paulo'); // Valor da compra $valor_total = 700; // Quantidade de parcelas $quantidade_parc = 3; // Intervalo de Dias para Vencer $intervalo_inicial = 28; $intervalo_subsequente = 14; // Calcula o valor de cada parcela $valor_parc = $valor_total / $quantidade_parc; // Função para calcular a data de vencimento function calcular_vencimento($data_inicial, $dias) { $data = clone $data_inicial; $data->add(new DateInterval('P' . $dias . 'D')); return $data; } // Data atual $data_atual = new DateTime(); $valores_parcelas = []; $datas_vencimento = []; $intervalo = $intervalo_inicial; for ($i = 1; $i <= $quantidade_parc; $i++) { $datas_vencimento[$i] = calcular_vencimento($data_atual, $intervalo); if ($i == $quantidade_parc) { $valor_parcela_atual = $valor_total - array_sum($valores_parcelas); } else { $valor_parcela_atual = $valor_parc; } $valores_parcelas[$i] = $valor_parcela_atual; $intervalo = $intervalo_subsequente; } ?> <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <title>Calcula Vencimento</title> </head> <body> <?php // Converter o valor para o formato Real separado pela vírgula echo "Valor da compra: " . number_format($valor_total, 2, ',', '.') . "<br><br>"; // Imprimir a quantidade de parcelas echo "Quantidade de parcelas: $quantidade_parc <br><br>"; // Imprimir a quantidade de parcelas echo "Intervalo de Dias p/ Vencer: $intervalo_inicial para 1ª parcela e $intervalo_subsequente para as demais<br><br>"; for ($i = 1; $i <= $quantidade_parc; $i++) { echo "Valor da parcela " . $i . ": " . number_format($valores_parcelas[$i], 2, ',', '.') . "<br>"; echo "Data de Vencimento: " . $datas_vencimento[$i]->format('d/m/Y') . "<br><br>"; } // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela vírgula echo "<br>Valor total Parcelado: " . number_format(array_sum($valores_parcelas), 2, ',', '.') . "<br>"; ?> </body> </html> Abordagem 2: Usando uma Classe para Encapsular a Lógica caso desejar também Nesta abordagem, encapsulamos a lógica em uma classe para melhorar a organização e a reusabilidade do código. <?php // Definir um fuso horário padrão date_default_timezone_set('America/Sao_Paulo'); class CalculadorParcelas { private $valor_total; private $quantidade_parc; private $intervalo_inicial; private $intervalo_subsequente; public function __construct($valor_total, $quantidade_parc, $intervalo_inicial, $intervalo_subsequente) { $this->valor_total = $valor_total; $this->quantidade_parc = $quantidade_parc; $this->intervalo_inicial = $intervalo_inicial; $this->intervalo_subsequente = $intervalo_subsequente; } public function calcularParcelas() { $valor_parc = $this->valor_total / $this->quantidade_parc; $data_atual = new DateTime(); $valores_parcelas = []; $datas_vencimento = []; $intervalo = $this->intervalo_inicial; for ($i = 1; $i <= $this->quantidade_parc; $i++) { $data_vencimento = clone $data_atual; $data_vencimento->add(new DateInterval('P' . $intervalo . 'D')); $datas_vencimento[$i] = $data_vencimento; if ($i == $this->quantidade_parc) { $valor_parcela_atual = $this->valor_total - array_sum($valores_parcelas); } else { $valor_parcela_atual = $valor_parc; } $valores_parcelas[$i] = $valor_parcela_atual; $intervalo = $this->intervalo_subsequente; } return [$valores_parcelas, $datas_vencimento]; } } // Inicializando a classe $calculador = new CalculadorParcelas(700, 3, 28, 14); list($valores_parcelas, $datas_vencimento) = $calculador->calcularParcelas(); ?> <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <title>Calcula Vencimento</title> </head> <body> <?php // Converter o valor para o formato Real separado pela vírgula echo "Valor da compra: " . number_format(700, 2, ',', '.') . "<br><br>"; // Imprimir a quantidade de parcelas echo "Quantidade de parcelas: 3 <br><br>"; // Imprimir a quantidade de parcelas echo "Intervalo de Dias p/ Vencer: 28 para 1ª parcela e 14 para as demais<br><br>"; for ($i = 1; $i <= 3; $i++) { echo "Valor da parcela " . $i . ": " . number_format($valores_parcelas[$i], 2, ',', '.') . "<br>"; echo "Data de Vencimento: " . $datas_vencimento[$i]->format('d/m/Y') . "<br><br>"; } // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela vírgula echo "<br>Valor total Parcelado: " . number_format(array_sum($valores_parcelas), 2, ',', '.') . "<br>"; ?> </body> </html> Abordagem 3: Usando uma Função de Agregação se assim você também desejar rsrs Abordagem é criar uma função que retorna todas as informações necessárias para o cálculo das parcelas e exibição dos resultados. <?php // Definir um fuso horário padrão date_default_timezone_set('America/Sao_Paulo'); function calcularParcelas($valor_total, $quantidade_parc, $intervalo_inicial, $intervalo_subsequente) { $valor_parc = $valor_total / $quantidade_parc; $data_atual = new DateTime(); $parcelas = []; for ($i = 1; $i <= $quantidade_parc; $i++) { $data_vencimento = clone $data_atual; $intervalo = ($i == 1) ? $intervalo_inicial : $intervalo_subsequente; $data_vencimento->add(new DateInterval('P' . $intervalo . 'D')); $valor_parcela_atual = ($i == $quantidade_parc) ? $valor_total - array_sum(array_column($parcelas, 'valor')) : $valor_parc; $parcelas[] = [ 'data' => $data_vencimento, 'valor' => $valor_parcela_atual ]; } return $parcelas; } $parcelas = calcularParcelas(700, 3, 28, 14); ?> <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <title>Calcula Vencimento</title> </head> <body> <?php // Converter o valor para o formato Real separado pela vírgula echo "Valor da compra: " . number_format(700, 2, ',', '.') . "<br><br>"; // Imprimir a quantidade de parcelas echo "Quantidade de parcelas: 3 <br><br>"; // Imprimir a quantidade de parcelas echo "Intervalo de Dias p/ Vencer: 28 para 1ª parcela e 14 para as demais<br><br>"; foreach ($parcelas as $index => $parcela) { echo "Valor da parcela " . ($index + 1) . ": " . number_format($parcela['valor'], 2, ',', '.') . "<br>"; echo "Data de Vencimento: " . $parcela['data']->format('d/m/Y') . "<br><br>"; } // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela vírgula echo "<br>Valor total Parcelado: " . number_format(array_sum(array_column($parcelas, 'valor')), 2, ',', '.') . "<br>"; ?> </body> </html> Espero que seja o que deseja
  22. Jack Oliveira

    ordenar

    Que bom que você conseguiu descobrir isso já é um grande passo, parabéns :) CREATE TABLE `tab_aprendiz` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(255) NOT NULL, `order` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE tab_aprendiz ( id int(11) NOT NULL AUTO_INCREMENT, nome varchar(255) NOT NULL, `order` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  23. Jack Oliveira

    UPDATE multiple

    Parabéns!!!!
  24. Jack Oliveira

    ordenar

    Amigo não é que eu so tenho celular eu tenho computador, porem maioria das veze eu não estou em casa e nem carrego o notebook comigo, eu tenho uma vida e família não fico 24h com computador, quando vejo a notificações no celular que vou responder e muita da vezes ate demoro responder rsrsr....
  25. Jack Oliveira

    mover dois elementos ao mesmo tempo

    SImples segue o exemplo index.php <div id="resp"></div> <ul id="Order"> <?php $query = "SELECT * FROM tab_aprendiz ORDER BY ordem ASC"; $aprendiz = mysqli_query($conn, $query); while($row = mysqli_fetch_assoc($aprendiz)){ ?> <li id="arrayordem_<?php echo $row['id']; ?>"> <?php echo $row['id'] . " - "; echo $row['titulo']; ?> </li> <?php } ?> </ul> ul{ padding: 0px; margin: 0px; } #Order li{ background-color: #1aad72; color: #fff; margin: 0 0 3px; padding: 10px; list-style: none; } <script> $(document).ready(function () { $(function () { $("#Order").sortable({update: function () { var ordem_atual = $(this).sortable("serialize"); $.post("aprendiz_ordem.php", ordem_atual, function (retorno) { $("#resp").html(retorno); $("#resp").slideDown('slow'); retirarMsg(); }); } }); }); function retirarMsg(){ setTimeout( function (){ $("#resp").slideUp('slow', function(){}); }, 1700); } }); </script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> aprendiz_ordem.php include_once "dbBase.php"; $array = $_POST['arrayordem']; $cont = 1; foreach($array as $id){ $result = "UPDATE tab_aprendiz SET ordem = $cont WHERE id = $id"; $resultado = mysqli_query($conn, $result); $cont++; } echo "<span style='color: green;'>Alterado com sucesso</span>"; SQL CREATE TABLE `tab_aprendiz` ( `id` int(11) NOT NULL AUTO_INCREMENT, `titulo` varchar(255) DEFAULT NULL, `ordem` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `tab_aprendiz` (`id`, `titulo`, `ordem`) VALUES (NULL, 'Teste 1', 2), (NULL, 'Teste 2', 4), (NULL, 'Teste 3', 5), (NULL, 'Teste 4', 3), (NULL, 'Teste 5', 6), (NULL, 'Teste 6', 7), (NULL, 'Teste 7', 1);
×

Important Information

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