-
Content count
620 -
Joined
-
Last visited
-
Jack Oliveira started following Integração PIX MercadoPago, PHP - Orientação referente Tabela HTML, PHP - Array contendo DATA salva 0 no MySql and and 6 others
-
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
-
PHP - Gerar vencimento parcelas com período variado
Jack Oliveira replied to violin101's topic in 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 @Williams Duarte, Eu fiz aqui e não salva ainda. Mas valeu ai...
-
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
-
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
-
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;
-
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
-
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 replied to user32's question in 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 reply
-
- mercadopago
- pix
-
(and 1 more)
Tagged with: