-
Total de itens
620 -
Registro em
-
Última visita
Tudo que Jack Oliveira postou
-
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)); }
-
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); }); } }); }
-
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
-
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;
-
PHP - Gerar vencimento parcelas com período variado
Jack Oliveira respondeu ao tópico de violin101 em PHP
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); ?> -
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....
-
Ola @Williams Duarte, Eu fiz aqui e não salva ainda. Mas valeu ai...
-
Código pho não executa em banco de dados grande
Jack Oliveira respondeu ao tópico de landerbadi em PHP
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 -
Código pho não executa em banco de dados grande
Jack Oliveira respondeu ao tópico de landerbadi em PHP
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 -
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
-
obrigado Williams Duarte Vou por em pratica aqui
-
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); ?>
-
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
-
Código pho não executa em banco de dados grande
Jack Oliveira respondeu ao tópico de landerbadi em PHP
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. -
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> </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.
-
Integração PIX MercadoPago
Jack Oliveira respondeu ao pergunta de user32 em Perguntas e respostas rápidas
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; } ?>- 1 resposta
-
- mercadopago
- pix
-
(e mais 1 )
Tags:
-
problema em usar json para realizar engenharia de dados
Jack Oliveira respondeu ao tópico de LuizH.M em Python
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']) -
Passar Hora para Campo Input automaticamente
Jack Oliveira respondeu ao tópico de violin101 em Javascript
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> -
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>
-
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
-
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
-
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;
-
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....
-
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);