Jump to content

POWERED BY:

Jack Oliveira

Members
  • Content count

    620
  • Joined

  • Last visited

Community Reputation

1 Comum

5 Followers

About Jack Oliveira

Informações Pessoais

  • Sexo
    Masculino
  • Interesses
    PHP, CSS, JAVASCRIPT entre outros...

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Jack Oliveira

    PHP - Orientação referente Tabela HTML

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

    PHP - Array contendo DATA salva 0 no MySql

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

    Instalador

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

    PHP - Gerar vencimento parcelas com período variado

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

    DRAP AND DROP

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

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

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

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

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

    Instalador

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

    DRAP AND DROP

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

    Instalador

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

    Data igual do facebook

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

    Modal Bootstrap 5

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

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

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

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

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

    Integração PIX MercadoPago

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

Important Information

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