Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.585
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Na base da tentativa e erro, estudei o motor XMLhttpRequest do Javascript para conectar o HTML com o PHP bem como carregar um outro HTML dentro de um arquivo HTML. Para testar o código tive que limpar o histórico do navegador e até fechar o navegador. arquivo /Astudy/config.php <?php session_start(); define('DBNAME','teste'); define('HOST','localhost'); define('USER','root'); define('PASSWORD',''); $dbname=DBNAME; $verEsquema="select * from sys.schema_table_statistics where table_schema='$dbname'"; $pdoTemp=new PDO('mysql:host='.HOST,USER,PASSWORD); $resultado=$pdoTemp->query($verEsquema); $dbExiste=$resultado->fetchColumn()===$dbname; if(!$dbExiste){ $pdo->exec("create database ".DBNAME); $pdo->exec("use ".DBNAME); $pdo->exec("CREATE TABLE `usuarios` (`id` bigint unsigned NOT NULL AUTO_INCREMENT, `nome` varchar(45) ,`email` varchar(45) ,`senha` varchar(255), PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1"); $nome="Frank K Hosaka"; $email='frankhosaka@gmail.com'; $senha='1234'; $hashSenha=password_hash($senha,PASSWORD_BCRYPT); $pdo->query("insert into usuarios (nome,email,senha) values ('$nome','$email','$hashSenha')"); } $pdo=new PDO('mysql:host='.HOST.';dbname='.DBNAME,USER,PASSWORD); if(isset($_POST['email'])){ $email=$_POST['email']; $senha=$_POST['senha']; $smt=$pdo->query("select * from usuarios where email='$email'"); $usuario=$smt->fetchAll(PDO::FETCH_OBJ); if(count($usuario)==0){ echo "não existe usuario com email $email";exit; } if(password_verify($senha,$usuario[0]->senha)){ $_SESSION['id']=$usuario[0]->id; $_SESSION['nome']=$usuario[0]->nome; echo "liberado"; } else { echo "senha incorreta"; } } if(isset($_POST['usuario'])){ $id=$_SESSION['id']; $nome=$_SESSION['nome']; echo json_encode(['nome'=>$nome,'id'=>$id]); } arquivo /Astudy/diario.html <!DOCTYPE html> <meta charset="utf-8"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="java.js"></script> <script>usuario()</script> <body style="max-width:500px;margin:0 auto"> <script src="java.js"></script> <script>carregaHTML('menu.html')</script> <div id="conteudo"></div> <table class="table table-striped table-sm"> <tr class=fw-semibold><td>data<td>contaD<td>contaC<td>Valor<td>Histórico <tr><td>01/05/24<td>101<td>301<td>15,00<td>Salário </table> arquivo /Astudy/index.html <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="java.js"></script> <body class="bg-light w-25 m-auto"> <main class="w-100" style="margin-top:120px"> <form action="javascript:login()" id="formLogin"> <div class="form-floating"> <input name="email" value="frankhosaka@gmail.com" class="form-control"> <label>Email</label> </div> <div class="form-floating"> <input type="password" name="senha" value="1234" class="form-control"> <label>Senha</label> <div> <input type="submit" class="w-100 btn btn-lg btn-primary"> </form> </main> </body> arquivo /Astudy/java.js function carregaHTML(url) { xhr = new XMLHttpRequest() xhr.open('GET', url) xhr.onload = function() { if (xhr.status === 200) { htmlContent = xhr.responseText; conteudo.innerHTML = htmlContent; } } xhr.send(); } function login(){ xhr = new XMLHttpRequest() formData=new FormData(formLogin) xhr.open('POST','config.php') xhr.onload = function() { if(xhr.status===200){ if(xhr.responseText=='liberado'){ window.location.href="menu.html"; } else { alert(xhr.responseText) } } } xhr.send(formData) } function usuario(){ xmlhttp=new XMLHttpRequest(); url = "config.php"; formData = new FormData(); formData.append('usuario',''); xmlhttp.open("POST",url,true); xmlhttp.send(formData); xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ usuario=JSON.parse(xmlhttp.responseText) nomeUsuario.innerHTML=usuario.nome if(usuario.id==1){ usuario1.classList.remove('d-none') usuario1.classList.add('d-block') } } } } arquivo /Astudy/menu.html <!DOCTYPE html> <meta charset="utf-8"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="java.js"></script> <script>usuario()</script> <body style="max-width:500px;margin:0 auto"> <header id=cabecalho class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> Projeto HTML <div class=dropdown> <button type=button class="btn btn-outline-primary dropdown-toggle" data-bs-toggle=dropdown id=btmenu> Menu </button> <ul class="dropdown-menu" > <div id="usuario1" class="d-none"> <li><a class=dropdown-item href='diario.html' >Diário</a></li> <li><a class=dropdown-item href='balancete.html'>Balancete</a></li> <li><a class=dropdown-item href='pagar.html'>Pagar</a></li> <li><a class=dropdown-item href='outros.html'>Outros</a></li> </div> <li><a class=dropdown-item href='orcamento.html'>Orcamento</a></li> <li><a class=dropdown-item href='pessoas.html'>Pessoa</a></li> <li><a class=dropdown-item href='produtos.html'>Produto</a></li> <li><a class=dropdown-item href='venda.html'>Relatório de Venda</a></li> <li><a class=dropdown-item href='mercado.html'>Mercado Pago</a></li> </ul> </div> <div class="dropdown"> <button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <spam id="nomeUsuario"></spam> </button> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="index.html">Sair</a></li> <li><a class="dropdown-item" href="alterarSenha.html">Mudar a senha</a></li> </ul> </div> </header>
  2. Frank K Hosaka

    menu.html

    Consegui carregar um arquivo html dentro de outro arquivo html com a ajuda do JavaScript. Praticamente o código do menu.html vai ser o código padrão de todos os outros arquivos html. Para testar esses códigos, eu tive que limpar o histórico do navegador, fechar o navegador, abrir o navegador, e depois testar o código. Como o código menu.html precisa de duas funções do JavaScript, decidi colocar todas as funções do JavaScript num só arquivo que chamei de java.js: arquivo /HTML/basicoMenu.html <header id=cabecalho class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> Projeto HTML <div class=dropdown> <button type=button class="btn btn-outline-primary dropdown-toggle" data-bs-toggle=dropdown id=btmenu> Menu </button> <ul class="dropdown-menu" > <div id="usuario1" class="d-none"> <li><a class=dropdown-item href='diario.html' >Diário</a></li> <li><a class=dropdown-item href='balancete.html'>Balancete</a></li> <li><a class=dropdown-item href='pagar.html'>Pagar</a></li> <li><a class=dropdown-item href='outros.html'>Outros</a></li> </div> <li><a class=dropdown-item href='orcamento.html'>Orcamento</a></li> <li><a class=dropdown-item href='pessoas.html'>Pessoa</a></li> <li><a class=dropdown-item href='produtos.html'>Produto</a></li> <li><a class=dropdown-item href='venda.html'>Relatório de Venda</a></li> <li><a class=dropdown-item href='mercado.html'>Mercado Pago</a></li> </ul> </div> <div class="dropdown"> <button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <spam id="nomeUsuario"></spam> </button> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="index.php">Sair</a></li> <li><a class="dropdown-item" href="alterarSenha.html">Mudar a senha</a></li> </ul> </div> </header> arquivo /HTML/config.php <?php session_start(); $mysqli=new mysqli("localhost","root","","diario"); if(isset($_POST['email'])) { $email=$_POST['email']; $senha=$_POST['senha']; $query=$mysqli->query("select * from tbusuario where email='$email'"); $usuario=$query->fetch_assoc(); $validaEmail=$usuario['email']; if(!$validaEmail) { echo "Dados inválidos"; exit; } $confirmar=$usuario['password']; $validaSenha=password_verify($senha,$confirmar); if(!$validaSenha) { echo "Dados inválidos!"; exit; } $_SESSION['id']=$usuario['id']; $_SESSION['nome']=$usuario['name']; echo "liberado"; } if(isset($_POST['usuario'])){ $nome=$_SESSION['nome']; $id=$_SESSION['id']; echo json_encode(['nome'=>$nome,'id'=>$id]); } arquivo /HTML/index.html <!DOCTYPE html> <html lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <title>Projeto HTML</title> <script src="java.js"></script> <body class="d-flex text-center bg-light"> <main class="w-25 m-auto" style="padding-top:160px"> <form id="formLogin" action="javascript:void(0)"> <h1 class="h3 mb-3 fw-normal">Projeto HTML</h1> <div id="mensagem"></div> <div class="form-floating"> <input type="email" class="form-control" name=email id=email autofocus required> <label for="floatingInput">Email</label> </div> <div class="form-floating"> <input type="password" class="form-control" name="senha" id="senha" required ondblclick="senha.type='text'"> <label for="floatingPassword">Duplo click para ver a Senha<label> </div> <input class="w-100 btn btn-lg btn-primary" type="submit" value="Entrar" onclick="login()"> </form> </main></body> arquivo /HTML/java.js function carregarBasicoMenu(){ xhr = new XMLHttpRequest(); externalHTMLURL = 'basicoMenu.html'; xhr.open('GET', externalHTMLURL); xhr.onload = function() { if (xhr.status === 200) { externalHTML = xhr.responseText; menu.innerHTML = externalHTML; } else { console.error('Error loading external HTML:', xhr.statusText); } } xhr.send(); } function login() { xmlhttp=new XMLHttpRequest(); url = "config.php"; formData = new FormData(document.getElementById("formLogin")); xmlhttp.open("POST",url,true); xmlhttp.send(formData); xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ if(xmlhttp.responseText=="liberado"){ window.location.href="menu.html" } mensagem.innerHTML=xmlhttp.responseText; } } } function usuario () { // pega o id e nome do usuário no php e amplia o menu de opções se o usuario = 1 xmlhttp=new XMLHttpRequest(); url = "config.php"; formData = new FormData(); formData.append('usuario',''); xmlhttp.open("POST",url,true); xmlhttp.send(formData); xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ usuario=JSON.parse(xmlhttp.responseText) nomeUsuario.innerHTML=usuario.nome if(usuario.id==1){ usuario1.classList.remove('d-none') usuario1.classList.add('d-block') } } } } arquivo /HTML/menu.html <!DOCTYPE html> <html lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> <style> a {color:blue;text-decoration:none} a:hover {color:black;} form {margin:0} .linha {line-height:0px} summary{list-style:none} td {white-space: nowrap} </style> <title>Projeto HTML</title> <body class="text-center bg-light w-25 m-auto"> <script src="java.js"></script> <script>carregarBasicoMenu();usuario()</script> <div id="menu"></div>
  3. Frank K Hosaka

    menu.html

    Usando o método da tentativa e erro, bem como a ajuda da Gemini, consegui montar o meu segundo arquivo html. Eu fiquei surpreso por ele ter funcionado, o código JavaScript funcionou, mesmo que tenha sido colocado no topo da página. Desconfio que o JavaScript conseguiu encontrar o <div id=usuario1> bem como <spam id=nomeUsuario> graças ao marcador <!DOCTYPE html>. Agora o meu desafio é reutilizar esse mesmo código em várias páginas que virão adiante, eu não consegui utilizar o marcador <include> do HTML, assim vou usar o motor xmlhttp do JavaScript. Espero que dê certo. arquivo menu.html <!DOCTYPE html> <html lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> <style> a {color:blue;text-decoration:none} a:hover {color:black;} body {align-items: center;background-color: #f5f5f5;} form {margin:0} .linha {line-height:0px} summary{list-style:none} td {white-space: nowrap} </style> <title>Projeto HTML</title> <script> // pega o id e nome do usuário no php e amplia o menu de opções se o usuario = 1 xmlhttp=new XMLHttpRequest(); url = "config.php"; formData = new FormData(); formData.append('usuario',''); xmlhttp.open("POST",url,true); xmlhttp.send(formData); xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ usuario=JSON.parse(xmlhttp.responseText) nomeUsuario.innerHTML=usuario.nome if(usuario.id==1){ usuario1.classList.remove('d-none') usuario1.classList.add('d-block') } } } </script> <body style="max-width:500px;margin:0 auto"> <header id=cabecalho class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> Projeto HTML <div class=dropdown> <button type=button class="btn btn-outline-primary dropdown-toggle" data-bs-toggle=dropdown id=btmenu> Menu </button> <ul class="dropdown-menu" > <div id="usuario1" class="d-none"> <li><a class=dropdown-item href='diario.html' >Diário</a></li> <li><a class=dropdown-item href='balancete.html'>Balancete</a></li> <li><a class=dropdown-item href='pagar.html'>Pagar</a></li> <li><a class=dropdown-item href='outros.html'>Outros</a></li> </div> <li><a class=dropdown-item href='orcamento.html'>Orcamento</a></li> <li><a class=dropdown-item href='pessoas.html'>Pessoa</a></li> <li><a class=dropdown-item href='produtos.html'>Produto</a></li> <li><a class=dropdown-item href='venda.html'>Relatório de Venda</a></li> <li><a class=dropdown-item href='mercado.html'>Mercado Pago</a></li> </ul> </div> <div class="dropdown"> <button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <spam id="nomeUsuario"></spam> </button> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="?ControleLogin.sair">Sair</a></li> <li><a class="dropdown-item" href="?ControleLogin.alterarsenha">Mudar a senha</a></li> </ul> </div> </header> arquivo config.php <?php // ... if(isset($_POST['usuario'])){ $nome=$_SESSION['nome']; $id=$_SESSION['id']; echo json_encode(['nome'=>$nome,'id'=>$id]); }
  4. Encontrei outro código javascript, mas ele tem o mesmo problema que o anterior, eu não sei como encerrar a função assíncrona, mas pelo menos esse código roda pelo menos cinco vezes da maneira esperada: arquivo /Astudy/config.php <?php session_start(); $mysqli=new mysqli("localhost","root","","diario"); if(isset($_POST)) { $email=$_POST['email']; $senha=$_POST['senha']; $query=$mysqli->query("select * from tbusuario where email='$email'"); $usuario=$query->fetch_assoc(); $validaEmail=$usuario['email']; if(!$validaEmail) { echo "Dados inválidos"; exit; } $confirmar=$usuario['password']; $validaSenha=password_verify($senha,$confirmar); if(!$validaSenha) { echo "Dados inválidos!"; exit; } $_SESSION['id']=$usuario['id']; $_SESSION['nome']=$usuario['name']; echo "liberado"; } arquivo /Astudy/index.html <title>Projeto HTML</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script> function verificar() { xmlhttp=new XMLHttpRequest(); url = "config.php"; formData = new FormData(document.getElementById("formLogin")); xmlhttp.open("POST",url,true); xmlhttp.send(formData); xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ if(xmlhttp.responseText=="liberado"){ window.location.href="ola.html" } mensagem.innerHTML=xmlhttp.responseText; } } } </script> <body class="d-flex text-center bg-light"> <main class="w-25 m-auto"> <form id="formLogin" action="javascript:void(0)"> <h1 class="h3 mb-3 fw-normal">Projeto HTML</h1> <div id="mensagem"></div> <div class="form-floating"> <input type="email" class="form-control" name=email id=email autofocus required> <label for="floatingInput">Email</label> </div> <div class="form-floating"> <input type="password" class="form-control" name="senha" id="senha" required ondblclick="senha.type='text'"> <label for="floatingPassword">Duplo click para ver a Senha<label> </div> <input class="w-100 btn btn-lg btn-primary" type="submit" value="Entrar" onclick="verificar()"> </form> </main></body> arquivo /Astudy/ola.html <meta charset="utf-8"> <h1>Olá, mundo!</h1>
  5. O addslashes não funcionou comigo, assim voltei no esquema anterior, não usar as aspas dentro de uma string. Tenho um cliente chamado D'blacks, eu usei o acento agudo no lugar da apóstrofe.
  6. ** O código abaixo tem problema, ele só funciona uma vez. A Gemini disse que eu não consegui encerrar o código, estou procurando outro código JavaScript que funcine pelo menos umas cinco vezes *** Existem muitos exemplos de JavaScript que simulam a requisição POST para o PHP, mas a maioria não deixa o PHP utilizar a variável $_POST. Acho que esse é o único caso em que o PHP pode pegar as informações pela variável $_POST: arquivo index.html <script> async function teste() { nome=nome.value email=email.value formData=new FormData() formData.append('nome',nome) formData.append('email',email) resposta = await fetch("config.php", { method: "POST", body: formData }) servidor = await resposta.json() php.innerHTML=servidor.mensagem } </script> <table style="width:500px;margin:0 auto"> <tr><td>Nome<td><input id="nome" value="Frank"> <tr><td>Email<td><input id="email" value="frank@gmail.com"> <tr><td><td><input type="submit" onclick="teste()"> <tr><td><td id="php"> </table> arquivo config.php <?php $nome=$_POST['nome']; $email=$_POST['email']; $resposta=['mensagem'=>"Dados recebidos: $nome, $email"]; echo json_encode($resposta);
  7. Eloquent é uma gramática utilizada pelo Laravel, e hoje eu queria atualizar a consulta do produto utilizando a consulta em vários campos. A minha primeira tentativa não deu certo, assim eu pedi ajuda para a Gemini, e fiquei surpreso com a beleza da gramática do Eloquent. Ele é bem simples, agora o meu desafio é tentar fazer algo semelhante em PHP. <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbentraprod; use App\Models\tbdiario; use App\Models\tbhistprod; use App\Models\tbprod; use App\Models\tbpessoa; class ProdutoController extends Controller { public function produto(Request $request) { $filtro=session('filtro'); if($filtro) { $procurar=session('filtro'); if(!is_numeric($procurar)) { $procurar=str_replace(" ","%",$procurar); $prod=tbprod::where('prod','like','%'.$procurar.'%')->orderBy('prod')->get(); } else { $prod=tbprod::where('codprod',$procurar) ->orWhere('codforn','like','%'.$procurar.'%') ->orWhere('codbar','like','%'.$procurar.'%')->get(); } } else { $prod=tbprod::orderBy('prod')->take(15)->get(); } if($request->input("procurar")) { $procurar=$request->input("procurar"); if(!is_numeric($procurar)) { $procurar=str_replace(" ","%",$procurar); $prod=tbprod::where('prod','like','%'.$procurar.'%')->orderBy('prod')->get(); } else { $prod=tbprod::where('codprod',$procurar) ->orWhere('codforn','like','%'.$procurar.'%') ->orWhere('codbar','like','%'.$procurar.'%')->get(); } session(['filtro'=>$filtro]); } return view('produto',compact('prod')); }
  8. A variável globlal do PHP só é útil quando não existir nenhum formuário no projeto. Se houver, a variável global é inútil, e só o $_SESSION é capaz de salvar um valor até fechar o navegador.
  9. O código da Gemini funciona, só que demora uma hora para ser executado. Eu alterei o tempo de espera para um minuto com sleep(10). Eu gostei do código da Gemini, ela começa com a conexão mysqli e em seguida ela usa os métodos do PDO, só não sei se é possível obter um array de objetos. Para transformar a conexão numa variável global, ela não pode ser definido numa classe mas num sim num módulo comum como acontece com o arquivo config.php onde são definidos as constantes. A seguir o mesmo código da Gemini só que usando as classes: arquivo /Astudy/Controles/Controle.php <?php require 'Modelos/Conexao.php'; class Controle { public function entrada($nome, $apto, $entrou) { global $conexao; $sql = "INSERT INTO entradas (nome, apto, entrou) VALUES (?, ?, ?)"; $stmt = $conexao->prepare($sql); $stmt->bind_param("sss", $nome, $apto, $entrou); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "Regitrado: $nome (Apto: $apto) - entrou: $entrou <br>"; } else { echo "Problema: $conexao->error"; } $stmt->close(); } function saida($nome, $apto, $saiu) { global $conexao; $sql = "INSERT INTO saidas (nome, apto, saiu) VALUES (?, ?, ?)"; $stmt = $conexao->prepare($sql); $stmt->bind_param("sss", $nome, $apto, $saiu); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "Registrado $nome (Apto: $apto) - saiu: $saiu <br>"; } else { echo "Problema: $conexao->error"; } $stmt->close(); } } arquivo /Astudy/Modelos/Conexao.php <?php $host = "localhost"; $usuario = "root"; $senha = ""; $esquema = "diario"; $conexao = new mysqli($host, $usuario, $senha, $esquema); if ($conexao->connect_error) { die("Falha na conexao: " . $conexao->connect_error); } arquivo /Astudy/index.php <?php require 'Controles/controle.php'; $controle=new Controle; $nome = "John Doe"; $apto = "101"; $entrou = date("Y-m-d H:i"); $controle->entrada ($nome, $apto, $entrou); sleep(10); // 1 minuto $saiu = date("Y-m-d H:i"); $controle->saida($nome, $apto, $saiu);
  10. Depois de cinco anos, eu decidi eliminar a tabela super variável do meu banco de dados; no lugar dele eu uso a variável de sessão que dura enquanto o navegador estiver funcionando. Ontem, no entanto, eu perguntei para a Gemini se ela tinha um código exemplo para controlar o movimento das pessoas no condomínio, e ela me passou o código. O código dela é bem estranho, ela mistura o motor do mysqli com o motor PDO, eu duvido que isso vá funcionar, eu ainda não testei. Mesmo assim, o código dela é o primeiro exemplo que eu vi que alguém usa a variável global. Eu já tinha ouvido falar, mas nunca cheguei a testar. A minha ideia é tentar fazer uma variável global durar enquanto o navegador estiver funcionando, não sei se vou conseguir, mas o meu ponto de partida vai ser o código da Gemini: arquivo index.php <?php $dbHost = "localhost"; $dbUsername = "root"; $dbPassword = ""; $dbName = "diario"; $dbConnection = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName); if ($dbConnection->connect_error) { die("Connection failed: " . $dbConnection->connect_error); } function registerEntry($name, $apartment, $timeIn) { global $dbConnection; $sql = "INSERT INTO entries (name, apartment, time_in) VALUES (?, ?, ?)"; $stmt = $dbConnection->prepare($sql); $stmt->bind_param("sss", $name, $apartment, $timeIn); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "Entry registered successfully for: " . $name . " (Apartment: " . $apartment . ") - Time In: " . $timeIn . "\n"; } else { echo "Error registering entry: " . $dbConnection->error . "\n"; } $stmt->close(); } function registerExit($name, $apartment, $timeOut) { global $dbConnection; $sql = "INSERT INTO exits (name, apartment, time_out) VALUES (?, ?, ?)"; $stmt = $dbConnection->prepare($sql); $stmt->bind_param("sss", $name, $apartment, $timeOut); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "Exit registered successfully for: " . $name . " (Apartment: " . $apartment . ") - Time Out: " . $timeOut . "\n"; } else { echo "Error registering exit: " . $dbConnection->error . "\n"; } $stmt->close(); } $name = "John Doe"; $apartment = "101"; $timeIn = date("Y-m-d H:i:s"); registerEntry($name, $apartment, $timeIn); sleep(3600); // 1 hour $timeOut = date("Y-m-d H:i:s"); registerExit($name, $apartment, $timeOut); $dbConnection->close();
  11. Na Bling, tenho um produto chamado Esquadro 12" Ramada. Na hora de importar, a Bling monta um arquivo .csv. O Windows abre o arquivo .csv com o programa Excel. e lá você vê o mesmo produto do mesmo jeito que aparece lá na Bling. O problema é na hora de pedir para o PHP ver o arquivo, ele enxerga de maneira totalmente diferente, assim: "Esquadro 12"" Ramada". Eu criei a função aspas, e pedi para o PHP tirar o primeiro e o último aspas do produto. Mas tirar as aspas excedente no meio da descrição é problema. Durante uma semana quebrei a cabeça para resolver o problema. Hoje, eu pedi para o VS Code abrir o arquivo csv, e descobri que o problema não é o PHP, mas sim o arquivo csv. O Excel enxerga o csv de um jeito, mas o VS Code e o PHP enxergam de maneira bem diferente. Graças ao VS Code, consegui montar a função aspas no PHP: arquivo Modelos / Config.php <?php // ... function aspas($bling) { $primeiroCaractere=$bling[0]; $ultimoCaractere=$bling[-1]; if($primeiroCaractere==='"' && $ultimoCaractere==='"') { $bling=substr($bling,1,-1); return str_replace('""','"',$bling); } }
  12. Eu assisti vídeos do professor Guanabara, e com ele eu consegui instalar o WampServe no meu notebook. Essa foi a parte mais difícil do processo, eu levei quatro meses até conseguir o ícone verde na bandeja do Windows. Depois que o ícone do servidor ficar verde, você vai poder escrever no navegador "localhost", vai aparecer a mensagem dos aplicativos à sua disposição (eu já perdi o meu, agora só aparece o diretório do C:\wampserve\www). Depois de cinco meses, eu comecei a aprender a usar o Visual Studio Code, é uma tela preta. Depois de 10 meses, eu consegui montar o meu primeiro arquivo, assim: index.php echo "olá mundo"; mas precisei criar um diretório em c:\wampserve\www\astudy\ Depois de 15 meses é que eu consegui a minha primeira conexão com o MySQL: arquivo index.php <?php $mysqli=new mysqli("localhost","root","","diario"); $query=$mysqli->query("select * from produtos"); while($row=$query->fetch_assoc( )) { echo $row['produto']."<br>"; } Eu não sabia o que era esse "<br>". Em 2024, eu aprendi que "<br>" é um marcador utilizado no HTML. Enfim, já se passaram cinco anos, e eu não sei como programar. Quem me ajuda é a Gemini. Hoje eu perguntei para ela como colocar uma borda na parte de cima de um marcador <tr>, e ela disse que isso é besteira. Só dá para fazer borda no lado de cima com o marcador <td>. <tr> é o marcador de uma linha da tabela, <td> é o marcador de uma célula da tabela. Enfim, para saber um pouco mais de HTML, JavaScript, PHP, MySQL, o melhor é conversar com a Gemini, mas ultimamente ela só responde em inglês. O chato de tudo isso é o inglês. Eu estou apanhando para saber o que é select, var_dump, <input>, <table>, csv, echo, print_r, <a href>, e acho que o professor Guanabara errou ao afirmar que é preciso estudar o HTML e o MySQL antes do PHP. Precisa estudar sim é o inglês antes de tudo. Estou quase desistindo. Mas, além da Gemini, tem o pessoal aqui do fórum (um se chama Iowys e o outro Albano, um responde em maio e dezembro, outro em novembro e agosto). Basta você publicar o código e a imagem que aparece no notebook, assim:
  13. O projeto original trabalhava com quatro campos, manhãHoraEntrada, manhãHoraSaída, TardeHoraEntrada, TardeHoraSaída, eu simplifiquei em apenas dois campos, e assim consegui registrar várias entradas no mesmo dia e até saída no dia seguinte (o relatório ficou péssimo, mas dá para entender mais ou menos o movimento do colaborador ao longo do dia). O projeto original tinha rotina de login, CSS, e o meu projeto não tem nada disso. Aqui o meu foco é o banco de dados e como o PHP é bastante útil dentro do HTML. arquivo /Polo/Controles/ControlePortaria.php <?php $projeto="/Polo"; require_once $_SERVER['DOCUMENT_ROOT']."$projeto/Modelos/Config.php"; class ControlePortaria { private $Conexao; public function __construct() { $this->Conexao=new Conexao; } public function cadastroNovo() { if(isset($_POST['nome'])) { $nome=$_POST['nome']; $verificar=$this->Conexao->select("nome from cadastros where nome='$nome'")[0]->nome; if($verificar) { $mensagem="Já existe $verificar no cadastro"; return view('Mensagem',['mensagem'=>$mensagem]); } $id=$_POST['id']; $imagem=file_get_contents($_FILES['foto']['tmp_name']); $extensao = pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION); $arquivo="Fotos/$id.$extensao"; file_put_contents($arquivo,$imagem); $this->Conexao->insert("cadastros (nome,foto) values ('$nome','$arquivo')"); return header("location:index.php"); } $id=$this->Conexao->select("max(id) as maximo from cadastros")[0]->maximo+1; return view('CadastroNovo',['id'=>$id]); } public function entrada($id) { $agora=date('Y-m-d H:i'); $this->Conexao->update("movimentos set horaentrada='$agora' where id=$id"); return header("location:index.php"); } public function inicio() { $hoje=date('d/m/y'); $verifica=$this->Conexao->select("* from cadastros"); foreach($verifica as $ver) { $teste=$this->Conexao->select("* from movimentos where idCadastro=$ver->id and horasaida is null"); if(!$teste) { $this->Conexao->insert("movimentos (idCadastro) values ($ver->id)"); } } $cadastros=$this->Conexao->select("cadastros.id, nome, foto, movimentos.id as iid, idCadastro, horaentrada, horasaida from cadastros join movimentos on cadastros.id = movimentos.idCadastro where horasaida is null order by cadastros.nome"); $mensagem=""; if(count($cadastros)==0) { $mensagem="Ninguém foi cadastrado, ainda!"; } return view('Movimento',['cadastros'=>$cadastros,'mensagem'=>$mensagem,'hoje'=>$hoje]); } public function relatorio($dia = null) { $dia=($dia) ? $dia : date('Y-m-d'); $movimentos=$this->Conexao->select("* from movimentos join cadastros on movimentos.idCadastro = cadastros.id where date(horaentrada)='$dia' order by cadastros.nome"); $mensagem=""; if(count($movimentos)==0) { $mensagem="Não houve movimento nesse dia."; } return view('Relatorio',['dia'=>$dia,'movimentos'=>$movimentos,'mensagem'=>$mensagem]); } public function saida($id) { $agora=date('Y-m-d H:i'); $this->Conexao->update("movimentos set horasaida='$agora' where id=$id"); $this->inicio(); } } arquivo /Polo/Fotos/1.png arquivo /Polo/Fotos/2.jpeg arquivo /Polo/Fotos/padrão.jpg arquivo /Polo/Modelos/Conexao.php <?php class Conexao { private static $pdo; public static function instancia() { if (!self::$pdo) { // Veririca se o banco de dados existe $dbName = DBNAME; $checkDbExistsQuery = "SELECT * FROM sys.schema_table_statistics WHERE table_schema = '$dbName'"; try { $tempPdo = new PDO("mysql:host=" . HOST, USER, PASSWORD); $result = $tempPdo->query($checkDbExistsQuery); $dbExists = $result->fetchColumn() === $dbName; $tempPdo = null; // fecha a conexão temporária do PDO } catch (PDOException $e) { die("Erro ao procurar o banco de dados: " . $e->getMessage()); } // Criar o banco de dados se ele não existe if (!$dbExists) { $createDbQuery = "CREATE DATABASE $dbName"; try { $pdo = new PDO("mysql:host=" . HOST, USER, PASSWORD); $pdo->exec($createDbQuery); $pdo->exec("USE ". DBNAME); $pdo->exec("CREATE TABLE `cadastros` (`id` int NOT NULL AUTO_INCREMENT, `nome` varchar(45) NOT NULL,`foto` varchar(45) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci"); $pdo->exec("CREATE TABLE `movimentos` (`id` int NOT NULL AUTO_INCREMENT, `idCadastro` int NOT NULL,`horaentrada` varchar(20) DEFAULT NULL, `horasaida` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci"); } catch (PDOException $e) { die("Erro ao criar o banco de dados: " . $e->getMessage()); } } // fazer a conexão com o banco de dados self::$pdo = new PDO("mysql:host=" . HOST . ";dbname=" . DBNAME, USER, PASSWORD); } return self::$pdo; } public function delete($sql) { return $this->instancia()->query("delete from $sql"); } public function exec($sql) { return $this->instancia()->query($sql); } public function insert($sql) { return $this->instancia()->query("insert into $sql"); } public function select($sql) { $stmt=$this->instancia()->query("select $sql"); return $stmt->fetchAll(PDO::FETCH_OBJ); } public function update($sql) { return $this->instancia()->query("update $sql"); } } arquivo /Polo/Modelos/Config.php <?php date_default_timezone_set('America/Sao_Paulo'); $baseDir = $_SERVER['DOCUMENT_ROOT'].'/Polo/'; define('PROJETO', $baseDir); define('CONTROLES', PROJETO.'/Controles/'); define('FOTOS',PROJETO.'/Fotos/'); define('MODELOS', PROJETO.'/Modelos/'); define('VISOES', PROJETO.'/Visoes/'); define('HOST', 'localhost'); define('DBNAME','polo'); define('USER','root'); define('PASSWORD',''); spl_autoload_register(function ($classe) { $diretorios = ['Controles', 'Modelos', 'Visoes']; foreach ($diretorios as $diretorio) { $arquivo = PROJETO . DIRECTORY_SEPARATOR . $diretorio . DIRECTORY_SEPARATOR . $classe . '.php'; if (file_exists($arquivo)) { require_once $arquivo; return; } } throw new Exception("Erro ao carregar a classe '{$classe}'. Arquivo não encontrado."); }); function view($arquivo, $array = null) { if (!is_null($array)) { foreach ($array as $var => $value) { ${$var} = $value; } } include VISOES . $arquivo . ".php"; } arquivo /Polo/Visoes/CadastroNovo.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Formulário de Cadastro</title> <script> function atualizarImagem() { file = document.getElementById('foto').files[0] reader = new FileReader() reader.onload = function(event) { imageURL = event.target.result; document.getElementById('imagemPreview').src = imageURL; } reader.readAsDataURL(file); } </script> </head> <body style="width:500px;margin:0 auto"> <fieldset> <legend><h3>Formulário de Cadastros id=<?=$id?></h3></legend> <div style=float:left;width:190px> <img src="Fotos/padrão.jpg" height="190" width="150" id=imagemPreview> </div> <div style=float:left;width:250px> <form action="?ControlePortaria.cadastroNovo" method="post" enctype='multipart/form-data'> <table> <tr><td><label for=foto style=display:block>Selecione uma foto</label> <tr><td><input type="file" name="foto" id="foto" onchange="atualizarImagem()"> <tr style=height:20px> <tr><td>Nome: <tr><td><input name="nome" placeholder="Informe o Nome" size=30 required> <input type=hidden name=id value=<?=$id?>> <tr><td><input type=submit value=Gravar> <tr><td><a href='?ControlePortaria.inicio'>Cancelar</a> </table> </form> </div> </fieldset> arquivo /Polo/Visoes/Mensagem.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Mensagem</title> </head> <body style="width:500px;margin:0 auto"> <fieldset> <legend><h3>Mensagem</h3></legend> <h4><?=$mensagem?></h4> <h4><a href=index.php>Voltar</a></h4> </fieldset> arquivo /Polo/Visoes/Movimento.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Movimento na Portaria</title> <script> function altera(imagem) { if (imagem.height === 10) { imagem.height = 190; } else { imagem.height = 10; } } </script> </head> <body style="width:500px;margin:0 auto"> <fieldset> <legend><h3>Movimento na Portaria em <?=$hoje?> </h3></legend> <form> <input name=nome placeholder="Busca por nome" onchange=submit()> <a href='?ControlePortaria.cadastroNovo'>Cadastrar Pessoas</a> <a href='?ControlePortaria.relatorio'> Relatório</a> </form> <h4><?=$mensagem?></h4> <table> <tr><th>id<th>Pessoa<th>Entrada<th>Saída<th>Foto <?php foreach($cadastros as $c): ?> <tr><td><?=$c->id?><td><?=$c->nome?> <?php if(is_null($c->horaentrada)): $entrada="<input type=submit value='Confirmar' onclick=location.replace('?ControlePortaria.entrada.$c->iid')>"; $saida=null; else: $entrada=date('H:i',strtotime($c->horaentrada)); $saida="<input type=submit value='Confirmar' onclick=location.replace('?ControlePortaria.saida.$c->iid')>"; endif; ?> <td style=text-align:center><?=$entrada?><td><?=$saida?> <td><img src=<?=$c->foto?> height="10" width="150" id=imagem onclick=altera(imagem)> <?php endforeach; ?> </fieldset> arquivo /Polo/Visoes/Relatorio.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Relatorio</title> </head> <body style="width:500px;margin:0 auto"> <fieldset> <legend> <h3> Relatorio de <input type=date value=<?=$dia?> onchange='location.replace("?ControlePortaria.relatorio."+this.value)'> <a href=index.php> Voltar</a> </h3> </legend> <h3><?=$mensagem?></h3> <table><th>Nome, Entrada => Saída <?php foreach($movimentos as $m): if(!isset($controle)): $controle=$m->nome; $controle2=0; ?> <tr><td><?=$m->nome?> <?php endif; if($controle!==$m->nome): $controle=$m->nome; $controle2=0; ?> <tr><td><?=$m->nome?> <?php endif; $he=date('H:i',strtotime($m->horaentrada)); $hs=($m->horasaida) ? date('H:i',strtotime($m->horasaida)) : null; $de=date('Y-m-d',strtotime($m->horaentrada)); $ds=($m->horasaida) ?date('Y-m-d',strtotime($m->horasaida)) : null; if($de!==$ds): $hs=($m->horasaida) ?date('d/m H:i',strtotime($m->horasaida)) : null; endif; $controle2++; if($controle2>2): $controle2=0; ?> <tr><td> <?php endif; ?> , <?=$he." => ".$hs?> <?php endforeach; ?> </fieldset> arquivo /Polo/index.php <?php ini_set('display_errors', 1); require __DIR__ . '/Modelos/Config.php'; $rota='ControlePortaria_inicio'; if($_GET) { if(strpos(key($_GET),"_")==0) { exit; } $rota=isset($_GET) ? key($_GET) : $rota; } $segmentos=explode('_',$rota); $nomeControle=$segmentos[0] ?? 'ControlePortaria'; $metodo=$segmentos[1] ?? 'inicio'; $parametro=$segmentos[2] ?? null; $controle=new $nomeControle(); $controle->$metodo($parametro);
  14. Eu estou estudando o projeto polo. O código original está no google drive e tem um tamanho espetacular de 54 mb. Joguei todas as pastas fora e sobrou apenas alguns arquivos php, e o tamanho da pasta polo ficou reduzido em 706 kb. O problema é que eu vi um código HTML assim: <img src="/polo/fotos/padrão.jpg" height="190" width="150" id="foto-cliente"> E eu vi no navegador a imagem da sombra de um homem, quando não esperava ver coisa alguma. Eu limpei a lixeira, reiniciei o Windows duas vezes, mas a imagem continuou aparecendo no navegador. Eu fiquei intrigado, não sabia como o marcador <img> conseguiu "lembrar" da imagem do padrão.jpg. Depois de muito pensar, lembrei que o navegador também tem um repositório de imagens. Pedi para o navegador limpar o histórico da navegação, e assim consegui ver no navegador o que eu esperava, ou seja, nada. Assim, cheguei à conclusão de que o navegador procura imagens primeiro no repositório do navegador e só depois é que ele vai buscar no armazenamento local.
  15. A parte mais difícil da gramática do MySQL, HTML e o PHP é quando eu precisei usar o apóstrofo simples ou duplo (tipo cano 3/4") no histórico ou descrição de um formulário. Para evitar esse problema, eu sempre evitei de usar os apóstrofos. Ontem, no entanto, a Gemini sugeriu usar o comando addslashes do PHP. Agora sim eu posso escrever o que eu quiser no MySQL: <?php // ... $this->Conexao->insert("tbdiario (dia,lcto,contad,contac,valor,hist) values ('$dia',$lcto,$contad,$contac,$valor,'".addslashes($hist)."')");
  16. Aqui eu tento comparar os arquivos csv obtidos na Bling e comparar com o que tem no MySQL: arquivo Modelos / Config.php <?php // ... function aspas($bling) { return str_replace('"','',$bling); } function dec($value) { if($value==null) { return null; } return number_format($value,2,',','.'); } function deca($num) { $value=str_replace(".","",$num); return str_replace(",",".",$value); } arquivo Controles / ControleBling.php <?php class ControleBling extends Controle { private $Conexao; public function __construct() { $this->Conexao=new Conexao; } public function diferenca() { $this->Conexao->exec("truncate table tbprodbling"); $arquivos=['produtos1.csv','produtos2.csv','produtos3.csv','produtos4.csv','produtos5.csv']; foreach($arquivos as $arquivo) { $dados=file($arquivo); foreach($dados as $linha) { $campos=explode(';',$linha); if(aspas($campos[1])!=="Código") { $codprod=intval(trim(aspas($campos[1]))); $un=aspas($campos[3]); $prod=aspas($campos[2]); $custo=deca(aspas($campos[11])); $codbar=trim(aspas($campos[19])); $cf=deca(aspas($campos[4])); $venda=deca(aspas($campos[6])); $this->Conexao->insert("tbprodbling (codprod,un,prod,custo,codbar,cf,venda) values ($codprod,'$un','$prod',$custo,'$codbar','$cf',$venda)"); } } } $produto=$this->Conexao->select("* from tbprod where loc <> 'a24'"); $prodBling=$this->Conexao->select("* from tbprodbling"); echo "O número de registros no MySQL é ".count($produto).".<br>"; echo "O número de registros na Bling é ".count($prodBling).".<br>"; echo "<table><th><th class=text-left>MySQL<th class=text-left>Bling"; foreach($produto as $pr) { $codprod=$pr->codprod; $bling = array_filter($prodBling, function ($produto) use ($codprod) { return $produto->codprod == $codprod;}); $a=current($bling); if(is_null($a)) { echo "<tr><td>Codigo<td><td>Incluir"; } else { $un=($pr->un==$a->un) ? 1 : 0; $prod=($pr->prod==$a->prod) ? 1 : 0; $custo=($pr->custo==$a->custo) ? 1 : 0; $codbar=($pr->codbar==$a->codbar) ? 1 : 0; $cf=($pr->cf==$a->cf) ? 1 : 0; $venda=($pr->venda==$a->venda) ? 1 : 0; if($un.$prod.$custo.$codbar.$cf.$venda !== '111111') { echo "<tr><td>**<td>**<td>**"; echo "<tr><td>Código<td>$pr->codprod<td>$a->codprod"; if($pr->prod!==$a->prod) { echo "<tr><td>Descriçao<td>$pr->prod<td>$a->prod"; } if($pr->custo!==$a->custo) { echo "<tr><td>Custo<td>$pr->custo<td>$a->custo"; } if($pr->codbar!=$a->codbar) { echo "<tr><td>Código de Barra<td>$pr->codbar<td>$a->codbar"; } if($pr->cf!==$a->cf) { echo "<tr><td>NCM<td>$pr->cf<td>$a->cf"; } if($pr->venda!==$a->venda) { echo "<tr><td>Venda<td>$pr->venda<td>$a->venda"; } } } } } }
  17. Esse é um problema difícil de resolver, eu decidi fazer gambiarra: <?php // tb_cadastro (id pk nn ai,nome varchar(45)) InnoDB // (1,"Frank")(2,"João")(3,"Pedro")(4,"Rafael")(5,"Lazaro") session_start(); $conn=mysqli_connect("localhost","root","","polo"); $avancar=(isset($_GET['avancar'])) ? $_GET['avancar'] : null; $where=""; if($avancar) { $id=$_SESSION['referencia']+$avancar; $where="where id >= $id"; } $intervalo=3; $query=$conn->query("select * from tb_cadastro $where order by nome limit $intervalo"); $clientes=$query->fetch_all(MYSQLI_ASSOC); $query=$conn->query("select count(*) as limite from tb_cadastro"); $limite=$query->fetch_assoc()['limite']-$intervalo; $_SESSION['referencia']=($limite>$clientes[0]['id']) ? $clientes[0]['id'] : $limite; $pagina=$intervalo-1; ?> <table> <tr> <td><a href="?avancar=<?=-$pagina?>">Anterior</a> <td><a href="?inicio">Inicio</a> <td><a href="?avancar=<?=$pagina?>" >Posterior</a> <tr> <th>id<th>cliente <?php foreach($clientes as $cliente) : ?> <tr><td><?=$cliente['id']?><td><?=$cliente['nome']?> <?php endforeach; ?> Esse código saiu em desacordo com a estrutura da tabela que você apresentou, mas precisei simplificar para a listagem não ficar longa.
  18. <script> window.open("https://www.example.com", "novaJanela", "width=400,height=300,toolbar=no,location=no,menubar=no,scrollbars=yes,resizable=yes"); </script>
  19. Achei isso com a Gemini: <?php // Verifica se o arquivo foi enviado if (isset($_FILES['arquivo'])) { // Define o nome do arquivo $nomeArquivo = $_FILES['arquivo']['name']; // Define o local de destino $destino = "uploads/" . $nomeArquivo; // Move o arquivo para o destino if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $destino)) { echo "Arquivo salvo com sucesso!"; } else { echo "Erro ao salvar o arquivo."; } } ?>
  20. O código a seguir faz o download do arquivo csv.csv com a ajuda do JavaScript. Ele não deveria funcionar, pois ele está amarrado dentro de um link vazio (href=""). Mas eu consegui fazer funcionar colocando um comando logo abaixo do location.replace. Mas isso só funciona se a página de destino for trabalhar com o download. Se a próxima página não for download, o código Java só vai funcionar se você colocar qualquer coisa no link, na propriedade href. Melhor mesmo é não usar o JavaScript, a sintaxe do link é <a href="paginaDestino.php">Próximo</a>, mas no meu caso precisei apelar para a gambiarra: arquivo csv.csv 1 arquivo index.php <script> function bling() { location.replace("teste.php") alert() } </script> <a href="" onclick=bling()>Bling</a> arquivo teste.php <?php header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("csv.csv")); header('Content-Length: ' . filesize("csv.csv")); ob_get_clean(); readfile("csv.csv");
  21. Finalmente, consegui montar um arquivo csv no servidor e baixar no notebook. O meu problema estava no comando readfile("$pBling.csv"), ele baixava o arquivo csv mas também todo o código HTML que fazia parte do contexto do código PHP. Na base da persistência, encontrei o comando ob_get_clean que "limpa" a área de trabalho e só manda o arquivo csv. arquivo bling.php <?php include('menu.php'); $pedido=$_GET['pedido']; $pBling=$_GET['pBling']; $query=$mysqli->query("select count(bling) as contagem from tbpedido where bling=$pBling"); $verificar=$query->fetch_all(MYSQLI_ASSOC)[0]['contagem']; if($verificar) { exit; } $mysqli->query("update tbpedido set bling=$pBling where ped=$pedido"); $contato="Consumidor Final"; $query=$mysqli->query("select * from tbhistped where ped=$pedido"); $itens=json_decode(json_encode($query->fetch_all(MYSQLI_ASSOC))); $query=$mysqli->query("select sum(subtotal) as soma from tbhistped where subtotal < 0 and ped=$pedido"); $desconto=($query->fetch_assoc()['soma']) ? abs($query->fetch_assoc()['soma']) : 0; $query=$mysqli->query("select total from tbpedido where ped=$pedido"); $total=$query->fetch_assoc()['total']; $query=$mysqli->query("select dia from tbpedido where ped = $pedido"); $data=date('d/m/Y',strtotime($query->fetch_assoc()['dia'])); $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento")); foreach($itens as $item) { if($item->subtotal>0) { $dados[]=array($pBling,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, $item->codprod,$item->un,$item->qt,$item->unitario,$item->subtotal, $total,null,$desconto,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0); } } $arquivo = fopen("$pBling.csv", "w"); fputcsv($arquivo, $dados[0]); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha); } } fclose($arquivo); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("$pBling.csv")); header('Content-Length: ' . filesize("$pBling.csv")); ob_get_clean(); readfile("$pBling.csv"); unlink("$pBling.csv");
  22. Na hora de mandar o arquivo para a Bling, a Bling se recusou de receber porque estava fora do padrão que ela esperava. Eu fui ver o arquivo, e levei um susto. Hoje eu aprendi que o comando do PHP header( ) é poderoso, mas se tiver alguma ponta solta lá atrás, o resultado é um completo desastre. Para resolver o meu problema, eu tive que tirar o comando include('menu.php'), e no lugar eu criei uma conexão com o banco de dados $mysqli=new mysqli etc. Ou seja, eu devo ter feito muita besteira no arquivo menu.php para atrapalhar o serviço de download do PHP.
×
×
  • Criar Novo...