Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.678
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Frank K Hosaka

    Download arquivos

    O Durub tem razão, o PHP não tem como fazer mais nada quando você usa o comando head(), nem adianta fazer o comando echo antes dele usar esses comandos. O PHP também não tem uma instrução direta para ver se o arquivo chegou no destino. Mas dá para jogar o serviço na costa do usuário: <form style="width:500px;margin:0 auto"> <?php if(isset($_GET['download'])) { $fname="index.php"; header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$fname); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0",false); header("Pragma: no-cache"); header("Content-Transfer-Encoding: binary\n"); readfile($fname); } ?> <input type=submit value="Fazer download" onclick="mensagem.innerHTML='Por favor, verifique se o arquivo chegou na pasta Downloads'"> <input type=hidden name=download value=download> <div id=mensagem></div> </form>
  2. <form style="width:500px;margin:0 auto;margin-top:100px"> <?php // CREATE TABLE `cadastro` (`id` int NOT NULL AUTO_INCREMENT, `nome` varchar(45) DEFAULT NULL, // `idade` int DEFAULT NULL, `cidade` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) // ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci $mysqli=new mysqli("localhost","root","","teste"); if(isset($_GET['nome'])) { $nome=$_GET['nome']; $idade=$_GET['idade']; $cidade=$_GET['cidade']; $mysqli->query("insert into cadastro (nome,idade,cidade) values ('$nome',$idade,'$cidade')"); $query=$mysqli->query("select * from cadastro order by id desc"); $ultimoRegistro=$query->fetch_assoc(); var_dump($ultimoRegistro); } ?> Cadastro Teste <table> <tr><td>Nome:<td><input name=nome required> <tr><td>Idade:<td><input name=idade required> <tr><td>Cidade:<td> <select name=cidade> <option>Londrina <option selected>Curitiba </select> <tr><td><td><input type=submit> </table> </form>
  3. A minha sugestão é atualizar a tela, depois de enviar a nova mensagem, assim: <?php // CREATE TABLE `chat` (`id` int NOT NULL AUTO_INCREMENT, `msg` varchar(40) DEFAULT NULL, // PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci $mysqli=new mysqli("localhost","root","","teste"); if(isset($_GET['novaMsg'])) { $novaMsg=$_GET['novaMsg']; $mysqli->query("insert into chat (msg) values ('$novaMsg')"); } $query=$mysqli->query("select * from (select * from chat order by id desc limit 3) as t1 order by t1.id"); ?> <div style="border:1px solid"> <?php while($row=$query->fetch_assoc()) { echo $row['msg']."<p>"; } ?> </div> <p> <form> <textarea name="novaMsg" rows="5" cols="100" autofocus></textarea> <input type=submit> </form> Apesar da questão ser de 2008, nesse código apresento a sugestão de exibir as três últimas mensagens do chat mas em ordem crescente.
  4. A minha experiência com projeto multiusuário é precária. O meu projeto só suporta dois usuários. Eu não sei se o meu irmão está conectado, mas olhando o histórico do orçamento, eu sei que ele estava conectado às 10:02 hs de hoje. No meu caso, eu não preciso de um gerenciador de usuário, quando o meu irmão não consegue conectar, ele liga no meu WhatsApp e eu tenho que correr para saber onde está o problema. A minha sugestão é buscar outras alternativas além do LDAP ou fazer uma rotina para gerenciar o usuário através da rotina de login, contar as janelas que eles abrem e pedir para o JavaScript fazer a rotina de logout na tabela de usuários assim que todas as janelas do navegador forem fechadas, ou seja, pesquisar nas tabelas existentes o que os usuários andaram registrando. No meu caso, a tabela orçamento não tem o id do usuário, mas eu sei quando aconteceu o último registro.
  5. A tabela do diário contábil tem cinco colunas: lançamento, contaDevedora, contaCredora, Valor e Histórico. Isso é bem fácil de mostrar num notebook de 14 polegadas, mas não é o caso do celular de 7 polegadas. Pensei em ocultar a coluna do histórico, e a Gemini sugeriu esse código: <table class="table table-responsive"> <thead> <tr> <th>Coluna 1</th> <th>Coluna 2</th> <th>Coluna 3</th> <th>Coluna 4</th> <th class="d-none d-sm-table-cell">Coluna 5</th> </tr> </thead> <tbody> <tr> <td>Dado 1</td> <td>Dado 2</td> <td>Dado 3</td> <td>Dado 4</td> <td class="d-none d-sm-table-cell">Dado 5</td> </tr> </tbody> </table> Eu testei, e funcionou. Para ver a coluna do histórico, basta mudar o celular para o modo paisagem.
  6. Frank K Hosaka

    O código HTML

    Eu peguei um exemplo de modal no Bootstrap, e ele funcionou no meu projeto Orçamento que fiz em PHP. Também tenho um outro projeto que faz a mesma coisa, mas usa a linguagem das classes. O modal funcionou por alguns segundos e desapareceu. Eu presumi que eu fiz coisa errada que afetou o código HTML. Usei o comando de visualizar o código do navegador, e eu vi que o código saiu bem diferente entre a versão PHP e o PHP-classes. Peguei a versão PHP e eliminei o comando echo, e no lugar dele tentei separar o que é PHP e o que é HTML, e mesmo assim eu não consegui colocar o marcador <tr> no canto esquerdo da tela. Mostrei o código para a Gemini e ela explicou que o meu erro é colocar o marcador <form> dentro de um marcador <td>. E assim eu perdi todo o feriado de ontem para aprender que eu não sei nada do código HTML. Desesperado, eu abandonei a Gemini e usei o antigo motor de busca do Google, procurando por alguém que estava passando na mesma situação que eu. Por sorte, eu achei alguém já no final da madrugada. O erro dele é exatamente igual ao meu. No meu projeto PHP-classes, eu escrevi assim <a href="" onclick=bling()>. A função bling() chama o modal, mas a função href="" manda atualizar o navegador. Esse é um erro brutal de lógica, e não há como encontrá-lo no código HTML. Para consertar isso, eu escrevi assim <a onclick=bling()>. O modal funciona, mas o link não. O nome disso é gambiarra, e eu tenho que dar o braço a torcer para a Gemini quando ela repete várias vezes: a gambiarra não compensa.
  7. O <input autofocus> não funciona no modal do Bootstrap, para contornar o problema usei o JavaScript abrir(modalSignin) variavel.focus() arquivo modal.php // esse código pressupõe que o Bootstrap já foi carregado <script> //... function bling(pedido,vendido) { if(!vendido) { mensagemModalSheet.innerHTML="<h1>Não dá para criar pedido Bling quando ainda não foi vendido</h1>" abrir(modalSheet) } else { btnVariavel.addEventListener('click',function(event) { window.location.href=`bling.php?pedido=${pedido}&pBling=${variavel.value}` fechar(modalSignin) setTimeout(()=>{location.replace("orcamento.php")},1000) // atualizar a tela após 10 segundos }) abrir(modalSignin) variavel.focus() // colocando o foco no <input id=variavel> } } </script> <!-- modalSignin --> <div class="modal d-none" tabindex="-1" role="dialog" id="modalSignin"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-4 shadow"> <div class="modal-header p-5 pb-4 border-bottom-0"> <h5 class="fw-semibold mb-0 fs-2">Número do pedido Bling</h5> <button type="button" class="btn-close" onclick=fechar(modalSignin) aria-label="Close"></button> </div> <div class="modal-body p-5 pt-0"> <div class="form-floating mb-3"> <input type=text class="form-control rounded-3 fs-2" id="variavel"> </div> <button class="w-100 mb-2 btn btn-lg rounded-3 btn-primary" type="submit" id=btnVariavel>Enviar</button> </div> </div> </div> </div>
  8. O próximo código presume que o Bootstrap já foi carregado. Usei o modal para substituir as funções prompt(), confirm() e alert() do JavaScript. A grande diferença entre essas funções e o modal é que as funções param a execução do código, enquanto as funções não forem concluídas. Para simular algo parecido, eu fiz uma gambiarra, criando um temporizdor de 10 segundos: arquivo modal.php <script> function abrir(abrirModal) { abrirModal.classList.remove('d-none') abrirModal.classList.add('d-block') } function fechar(fecharModal) { fecharModal.classList.remove('d-block') fecharModal.classList.add('d-none') } function bling(pedido,vendido) { if(!vendido) { mensagemModalSheet.innerHTML="<h1>Não dá para criar pedido Bling quando ainda não foi vendido</h1>" abrir(modalSheet) } else { btnVariavel.addEventListener('click',function(event) { window.location.href=`bling.php?pedido=${pedido}&pBling=${variavel.value}` fechar(modalSignin) setTimeout(()=>{location.replace("orcamento.php")},1000) // atualizar a tela após 10 segundos }) abrir(modalSignin) } } function apagarBling(pedido) { mensagemModalChoice.innerHTML=`Você quer apagar o pedido Bling do pedido ${pedido} ?` btnChoice.addEventListener('click',function(event){window.location.href=`orcamento.php?apagarBling=${pedido}`}) abrir(modalChoice) } </script> <!-- modalSheet --> <div class="modal d-none p-4 py-md-5" tabindex="-1" role="dialog" id="modalSheet"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-4 shadow"> <div class="modal-header border-bottom-0 opacity-1"> <h1 class="modal-title fs-5">Mensagem</h1> <button type="button" class="btn-close" onclick=fechar(modalSheet) aria-label="Close"></button> </div> <div class="modal-body py-0"> <p id=mensagemModalSheet></p> </div> </div> </div> </div> <!-- modalSignin --> <div class="modal d-none" tabindex="-1" role="dialog" id="modalSignin"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-4 shadow"> <div class="modal-header p-5 pb-4 border-bottom-0"> <h5 class="fw-semibold mb-0 fs-2">Digite o número do pedido Bling</h5> <button type="button" class="btn-close" onclick=fechar(modalSignin) aria-label="Close"></button> </div> <div class="modal-body p-5 pt-0"> <div class="form-floating mb-3"> <input class="form-control rounded-3" id=variavel autofocus> <label for="floatingInput">Número do Pedido Bling</label> <button class="w-100 mb-2 btn btn-lg rounded-3 btn-primary" type="submit" id=btnVariavel>Enviar</button> </div> </div> </div> </div> </div> <!-- modalChoice --> <div class="modal d-none p-4 py-md-5" tabindex="-1" role="dialog" id="modalChoice"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-3 shadow"> <div class="modal-body p-4 text-center"> <h4 class="mb-0" id=mensagemModalChoice></h4> </div> <div class="modal-footer flex-nowrap p-0"> <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 py-3 m-0 rounded-0 border-end" id=btnChoice><strong>Sim, eu quero</strong></button> <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 py-3 m-0 rounded-0" onclick=fechar(modalChoice)>Não, apertei por engano</button> </div> </div> </div> </div>
  9. Existem vários tipos de modal, tem um para dar um alerta, aguardar confirmação e outro para coletar informação. O código seguinte sugere colocar tudo que é tipo de modal dentro de um arquivo: arquivo index.php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script> <?php require 'modal.php' ?> <script> function fechar(fecharModal) { fecharModal.classList.remove('d-block') fecharModal.classList.add('d-none') } function abrir(abrirModal) { abrirModal.classList.remove('d-none') abrirModal.classList.add('d-block') } </script> <div class=h-25></div> <table class='table table-striped w-25'> <tr class=fw-semibold><td>Exemplos do Bootstrap <tr><td onclick=abrir(modalSheet)>modalSheet <tr><td onclick=abrir(modalChoice)>modalChoice <tr><td onclick=abrir(modalTour)>modalTour <tr><td onclick=abrir(modalSignin)>modalSigin </table> arquivo modal.php <!-- modalSheet --> <div class="modal opacity-75 d-none bg-body-secondary p-4 py-md-5" tabindex="-1" role="dialog" id="modalSheet"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-4 shadow"> <div class="modal-header border-bottom-0"> <h1 class="modal-title fs-5">Modal title</h1> <button type="button" class="btn-close" onclick=fechar(modalSheet) aria-label="Close"></button> </div> <div class="modal-body py-0"> <p>This is a modal sheet, a variation of the modal that docs itself to the bottom of the viewport like the newer share sheets in iOS.</p> </div> <div class="modal-footer flex-column align-items-stretch w-100 gap-2 pb-3 border-top-0"> <button type="button" class="btn btn-lg btn-primary">Save changes</button> <button type="button" class="btn btn-lg btn-secondary" data-bs-dismiss="modal">Close</button> </div> </div> </div> </div> <!-- modalChoice --> <div class="modal opacity-75 d-none bg-body-secondary p-4 py-md-5" tabindex="-1" role="dialog" id="modalChoice"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-3 shadow"> <div class="modal-body p-4 text-center"> <h5 class="mb-0">Enable this setting?</h5> <p class="mb-0">You can always change your mind in your account settings.</p> </div> <div class="modal-footer flex-nowrap p-0"> <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 py-3 m-0 rounded-0 border-end"><strong>Yes, enable</strong></button> <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 py-3 m-0 rounded-0" onclick=fechar(modalChoice)>No thanks</button> </div> </div> </div> </div> <!-- modalTour --> <div class="modal opacity-75 d-none bg-body-secondary" tabindex="-1" role="dialog" id="modalTour"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-4 shadow"> <div class="modal-body p-5"> <h2 class="fw-bold mb-0">What's new</h2> <ul class="d-grid gap-4 my-5 list-unstyled small"> <li class="d-flex gap-4"> <svg class="bi text-body-secondary flex-shrink-0" width="48" height="48"><use xlink:href="#grid-fill"/></svg> <div> <h5 class="mb-0">Grid view</h5> Not into lists? Try the new grid view. </div> </li> <li class="d-flex gap-4"> <svg class="bi text-warning flex-shrink-0" width="48" height="48"><use xlink:href="#bookmark-star"/></svg> <div> <h5 class="mb-0">Bookmarks</h5> Save items you love for easy access later. </div> </li> <li class="d-flex gap-4"> <svg class="bi text-primary flex-shrink-0" width="48" height="48"><use xlink:href="#film"/></svg> <div> <h5 class="mb-0">Video embeds</h5> Share videos wherever you go. </div> </li> </ul> <button type="button" class="btn btn-lg btn-primary mt-5 w-100" onclick=fechar(modalTour)>Great, thanks!</button> </div> </div> </div> </div> <!-- modalSignin --> <div class="modal opacity-75 d-none bg-body-secondary" tabindex="-1" role="dialog" id="modalSignin"> <div class="modal-dialog" role="document"> <div class="modal-content rounded-4 shadow"> <div class="modal-header p-5 pb-4 border-bottom-0"> <h1 class="fw-bold mb-0 fs-2">Sign up for free</h1> <button type="button" class="btn-close" onclick=fechar(modalSignin) aria-label="Close"></button> </div> <div class="modal-body p-5 pt-0"> <form class=""> <div class="form-floating mb-3"> <input type="email" class="form-control rounded-3" id="floatingInput" placeholder="name@example.com"> <label for="floatingInput">Email address</label> </div> <div class="form-floating mb-3"> <input type="password" class="form-control rounded-3" id="floatingPassword" placeholder="Password"> <label for="floatingPassword">Password</label> </div> <button class="w-100 mb-2 btn btn-lg rounded-3 btn-primary" type="submit">Sign up</button> <small class="text-body-secondary">By clicking Sign up, you agree to the terms of use.</small> <hr class="my-4"> <h2 class="fs-5 fw-bold mb-3">Or use a third-party</h2> <button class="w-100 py-2 mb-2 btn btn-outline-secondary rounded-3" type="submit"> <svg class="bi me-1" width="16" height="16"><use xlink:href="#twitter"/></svg> Sign up with Twitter </button> <button class="w-100 py-2 mb-2 btn btn-outline-primary rounded-3" type="submit"> <svg class="bi me-1" width="16" height="16"><use xlink:href="#facebook"/></svg> Sign up with Facebook </button> <button class="w-100 py-2 mb-2 btn btn-outline-secondary rounded-3" type="submit"> <svg class="bi me-1" width="16" height="16"><use xlink:href="#github"/></svg> Sign up with GitHub </button> </form> </div> </div> </div> </div>
  10. Eu sempre quis colocar um modal no meu projeto PHP. O problema é que eu não sabia como chamar o modal através do JavaScript. A sintaxe (new bootstrap.Modal(myModal)).show() só funciona com o Bootstrap 5.2 para cima, e ela vai ser útil quando você precisar deixar uma mensagem para o usuário, quando ele solicitar um serviço que não está disponível ou faltarem mais dados. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"> </script> <button data-bs-toggle="modal" data-bs-target="#myModal"> versão clássica </button> <p> <button onclick="(new bootstrap.Modal(myModal)).show()"> versão java script </button> <!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> Teste <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> </div> </div> </div>
  11. O seguinte código coloca todos os arquivos no diretório raiz, as definições e a conexão foram colocadas no arquivo Controle, e foi utilizado o prefixo v para todos os arquivos que contém os formulários em HTML. arquivo /Astudy/Controle.php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <div style=height:20px></div> <?php date_default_timezone_set('America/Sao_Paulo'); defined('HOST') || define('HOST', 'localhost'); defined('DBNAME') || define('DBNAME', 'teste'); defined('USER') || define('USER','root'); defined('PASSWORD') || define('PASSWORD',''); spl_autoload_register( function ($classe) { $arquivo = $classe . '.php'; if (file_exists($arquivo)) { require_once $arquivo; return; } throw new Exception("Erro ao carregar a classe '{$classe}'. Arquivo não encontrado.$arquivo"); } ); function dec($value) { if($value==null) { return null; } return number_format($value,2,',','.'); } function deca($num) { $value=str_replace(".","",$num); return str_replace(",",".",$value); } function fmt($date) { return date('d/m/y',strtotime($date)); } function pvenda($custo,$margem) { $calculo=intval($custo*(1+$margem/100)*100)/100; $fracao=$calculo-intval($calculo); if ($fracao < 0.09) { $pvenda=intval($calculo); } else { if ($fracao <= 0.59) { $pvenda=intval($calculo)+0.5; } else { $pvenda=intval($calculo)+1; } } return dec($pvenda); } function view($arquivo, $array = null) { if (!is_null($array)) { foreach ($array as $var => $value) { ${$var} = $value; } } ob_start(); include $arquivo . ".php"; ob_flush(); } class Controle { private static $pdo; public static function instancia() { if(!self::$pdo) { self::$pdo=new PDO("mysql:host=".HOST.";dbname=".DBNAME,USER,PASSWORD); } return self::$pdo; } function select($sql) { $stmt=$this->instancia()->query("select $sql"); return $stmt->fetchAll(PDO::FETCH_OBJ); } function insert($sql) { return $this->instancia()->query("insert into $sql"); } function delete($sql) { return $this->instancia()->query("delete $sql"); } function update($sql) { return $this->instancia()->query("update $sql"); } } arquivo /Astudy/ControleOrcamento.php <?php class ControleOrcamento extends Controle { public function alteraQt() { $qt=$_POST['alteraQt']; $id=$_POST['id']; $ped=$_POST['ped']; $unitario=$_POST['unitario']; $subtotal=$qt*$unitario; $this->update("tbhistped set qt=$qt, subtotal=$subtotal where id=$id"); $total=$this->select("sum(subtotal) as total from tbhistped where ped=$ped")[0]->total; $this->update("tbpedido set total=$total where ped=$ped"); return $this->inicio($ped); } public function excluir($id) { $pedido=$_GET['pedido']; $this->delete("from tbhistped where id=$id"); $total=$this->select("sum(subtotal) as total from tbhistped where ped=$pedido")[0]->total; $this->update("tbpedido set total=$total where ped=$pedido"); return $this->inicio($pedido); } public function historico($hist = null) { $where=""; if($hist) { $ped=$_GET['referencia']+$hist; $where="where ped <= $ped"; } $pedidos=$this->select("* from tbpedido $where order by ped desc limit 15"); return view('vHistorico',['pedidos'=>$pedidos]); } public function incluirProduto($codprod) { $pedido=$_GET['pedido']; return $this->inicio($pedido,$codprod); } public function incluirQt() { $qt=deca($_POST['qt']); $ped=$_POST['ped']; $codprod=$_POST['codprod']; $unitario=str_replace(",",".",$_POST['venda']); $un=$_POST['un']; $subtotal=$qt*$unitario; $this->insert("tbhistped (ped,codprod,un,unitario,subtotal,qt) values ($ped,$codprod,'$un',$unitario,$subtotal,$qt)"); $total=$this->select("sum(subtotal) as total from tbhistped where ped=$ped")[0]->total; $this->update("tbpedido set total=$total where ped=$ped"); return $this->inicio($ped); } public function inicio($pedido = null, $codprod = null) { if($pedido) { $pedido=$this->select("* from tbpedido where ped=$pedido")[0]; } else { $ultimo=$this->select("max(ped) as ultimo from tbpedido")[0]->ultimo; $pedido=$this->select("* from tbpedido where ped=$ultimo")[0]; } if($codprod) { $vr['codprod']=$codprod; $produto=$this->select("* from tbprod where codprod=$codprod")[0]; $vr['prod']=$produto->prod; $vr['venda']=$produto->venda; $vr['un']=$produto->un; } else { $vr['codprod']=null; $vr['prod']=null; $vr['venda']=null; $vr['un']=null; } $vr['ped']=$pedido->ped; $vr['diaped'] = $pedido->dia; $vr['total'] = $pedido->total; $vr=json_decode(json_encode($vr)); $histped=$this->select("* from tbhistped join tbprod on tbprod.codprod = tbhistped.codprod where ped=$vr->ped"); return view('vOrcamento',['vr'=>$vr,'histped'=>$histped]); } public function novoPedido() { $pedido=$this->select("* from tbpedido order by ped desc")[0]; $ped=$pedido->ped; $total=$pedido->total; if($total!==null) { $ped++; $dia=date('Y-m-d'); $this->insert("tbpedido (ped,dia) values ($ped,'$dia')"); } return $this->inicio($ped); } public function produto() { $pedido=$_POST['pedido']; $produtos=$this->select("* from tbprod order by prod limit 15"); return view('vProduto',['produtos'=>$produtos,'pedido'=>$pedido]); } } arquivo /Astudy/ControleProduto.php <?php class ControleProduto extends Controle { public function procurarProduto() { $procura=$_POST['procura']; $pedido=$_POST['pedido']; $criterio=str_replace(" ","%",$procura); $produtos=$this->select("* from tbprod where prod like '%$criterio%' order by prod"); return view('vProduto',['produtos'=>$produtos,'pedido'=>$pedido]); } public function selecionado($codprod) { $pedido=$_GET['pedido']; return header("location:?ControleOrcamento.incluirProduto.$codprod&pedido=$pedido"); } } arquivo /Astudy/index.php <?php require('Controle.php'); $rota='ControleOrcamento_inicio'; if($_GET) { if(strpos(key($_GET),"_")==0) { exit; } $rota=isset($_GET) ? key($_GET) : $rota; } $segmentos=explode('_',$rota); $nomeControle=$segmentos[0] ?? 'ControleOrcamento'; $metodo=$segmentos[1] ?? 'inicio'; $parametro=$segmentos[2] ?? null; $controle=new $nomeControle(); $controle->$metodo($parametro); arquivo /Astudy/mysql.txt CREATE TABLE `tbhistped` ( `ped` int DEFAULT NULL, `codprod` int DEFAULT NULL, `un` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `unitario` float DEFAULT NULL, `subtotal` float DEFAULT NULL, `id` int NOT NULL AUTO_INCREMENT, `qt` float DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13063 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci CREATE TABLE `tbpedido` ( `ped` int NOT NULL AUTO_INCREMENT, `total` float DEFAULT NULL, `dia` date DEFAULT NULL, `codp` mediumint DEFAULT NULL, `horavenda` datetime DEFAULT NULL, `vendido` date DEFAULT NULL, `dinheiro` float DEFAULT NULL, `troco` float DEFAULT NULL, `cartao` tinyint DEFAULT NULL, `pix` tinyint DEFAULT NULL, `bling` int DEFAULT NULL, PRIMARY KEY (`ped`) ) ENGINE=InnoDB AUTO_INCREMENT=5825 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci CREATE TABLE `tbprod` ( `codprod` mediumint NOT NULL AUTO_INCREMENT, `un` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'un', `prod` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `custo` decimal(13,2) DEFAULT NULL, `marg` decimal(5,2) DEFAULT NULL, `codbar` varchar(29) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `loc` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '""', `emb` float DEFAULT NULL, `cf` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `codforn` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `estoque` float DEFAULT NULL, `origem` int NOT NULL DEFAULT '0', `vazio` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `venda` decimal(13,2) DEFAULT NULL, PRIMARY KEY (`codprod`) ) ENGINE=InnoDB AUTO_INCREMENT=2288 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci arquivo /Astudy/vHistorico.php <?php $referencia = $pedidos[0]->ped; ?> <table class='table table-striped table-sm w-25 m-auto'> <th style=width:20px>Dia <th style=width:40px> <div style="display:flex;width:30px;margin-right:15px"> <a href="?ControleOrcamento.historico.-14&referencia=<?=$referencia?>"><</a>&nbsp; <a href="?ControleOrcamento.inicio">Ped</a>&nbsp; <a href="?ControleOrcamento.historico.14&referencia=<?=$referencia?>" >></a> </div> <th class=text-end>Total <?php foreach($pedidos as $ped) : ?> <tr><td><?=date('d/m/y',strtotime($ped->dia))?> <td class=text-end><a href=?ControleOrcamento.inicio.<?=$ped->ped?>><?=$ped->ped?></a> <td class=text-end><?=dec($ped->total)?> <?php endforeach; ?> arquivo /Astudy/vOrcamento.php <table class='table table-striped table-sm w-50 m-auto pt-3'> <tr class="fw-semibold align-middle" style=height:40px> <td>Produto <a href=?ControleOrcamento.historico>Historico</a> <a href="?ControleOrcamento.novoPedido">Novo</a> <spam class=text-danger>Pedido <?=$vr->ped?> de <?=fmt($vr->diaped)?></spam> <td class=text-end>Qt<td>Un<td>Preço<td class=text-end>Total <?php foreach($histped as $item): ?> <tr> <td><?=$item->prod?> <td class=text-end> <form class='m-0' action=?ControleOrcamento.alteraQt method=post> <?php if($item->qt==intval($item->qt)): ?> <input name=alteraQt value='<?=$item->qt?>' onchange=submit() size=1 style=text-align:right;border:none;background:transparent> <?php else: ?> <input name=alteraqQt value='<?=dec($item->qt)?>' onchange=submit() size=1 style=text-align:right;border:none;background:transparent> <?php endif; ?> <input type=hidden name=id value=<?=$item->id?>> <input type=hidden name=ped value=<?=$item->ped?>> <input type=hidden name=unitario value=<?=$item->unitario?>> </form> <td><a href=?ControleOrcamento.excluir.<?=$item->id?>&pedido=<?=$item->ped?>><?=$item->un?></a> <td class=text-end><?=dec($item->unitario)?> <td class=text-end><?=dec($item->subtotal)?> <?php endforeach; ?> <tr > <?php if($vr->prod==""):?> <td> <form action=?ControleOrcamento.produto method=post class=m-0> <input type=submit value="Selecione um produto" autofocus> <input type=hidden name=pedido value=<?=$vr->ped?>> </form> <?php else: ?> <td><?=$vr->prod?> <?php endif; ?> <?php if(isset($_GET['pedido'])): ?> <td class=text-end> <form action=?ControleOrcamento.incluirQt method=post class=m-0> <input id=qt name=qt onchange=submit() size=1 placeholder=qt autofocus> <input type=hidden name=ped value="<?=$vr->ped?>"> <input type=hidden name=codprod value="<?=$vr->codprod?>"> <input type=hidden name=venda value="<?=$vr->venda?>"> <input type=hidden name=un value="<?=$vr->un?>"> </form> <td><?=$vr->un?><td class=text-end><?=$vr->venda?><td> <?php else: ?> <td><td><td><td> <?php endif; ?> <tr class=fw-semibold><td><td><td><td>Total<td class=text-end><?=dec($vr->total)?> </table>> arquivo /Astudy/vProduto.php <table class='table table-striped table-sm w-50 m-auto'> <tr><td><td> <form action="?ControleProduto.procurarProduto" method=post class=m-0> <input name=procura size=40 onchange=submit() autofocus> <input type=hidden name=pedido value=<?=$pedido?>> </form> <td> <tr class=fw-semibold><td>Cód<td>Descrição dos Produtos<td>Venda <?php foreach($produtos as $prod): ?> <tr><td class=text-end> <a href='?ControleProduto.selecionado.<?=$prod->codprod?>&pedido=<?=$pedido?>'> <?=$prod->codprod?></a> <td><?=$prod->prod?> <td class=text-end><?=pvenda($prod->custo,$prod->marg)?> <?php endforeach; ?>
  12. arquivo resources > views > notaFornecedor.blade.php <x-app-layout> <script>btmenu.innerHTML='Nota do Fornecedor';document.title="Nota do Fornecedor"</script> <form class="text-center" action="processaNF" method=post enctype="multipart/form-data"> @csrf <input type=file name=arquivo onchange=submit()> </form> @if($jatriz) <div class="container"> <table class="mx-auto border border-separate border-collapse"> <tr class="text-center font-medium"><td>CodForn<td>Cod<td>Produto<td>Qtdade<td>Total @foreach($jatriz as $vetor) <tr class="odd:bg-white even:bg-gray"><td class="px-4 py-2">{{$vetor->codforn}} <td class="text-right px-4 py-2"><?=$vetor->codprod?> <td class="px-4 py-2">{{$vetor->produto}} <td class="text-right px-4 py-2">{{intval($vetor->qt)}} <td class="text-right px-4 py-2">{{dec($vetor->subtotal)}} @endforeach </table> </div> @endif </x-app-layout>
  13. Escrevi um comentário, afirmando que o marcador do Blade {{ }} é diferente do <?= ?>, mas eu estava enganado. O meu erro era de digitação, assim apaguei o comentário anterior: arquivo teste.blade.php @php $parametro="Olá mundo"; @endphp <div id=div1></div> <div id=div2></div> <script> div1.innerHTML='{{$parametro}}' div2.innerHTML='<?=$parametro?>' </script>
  14. O seguinte código importa um arquivo xml, calcula o valor do produto como a soma do seu valor com o ICMS-ST, IPI e diferença de alíquota do ICMS, se houverem. Se ele não encontrar o código do produto correspondente ao do fornecedor, ele dispara um alerta 'Verificar'. Se houver diferença entre o custo anterior com o custo atual, ele avermelha o total do item, por onde o usuário pode atualizar o custo do produto, se assim desejar. Finalmente, o programa pede um número de lançamento para que ele possa encaminhar tudo para o banco de dados. Como esse programa é gratuito, não aceito reclamações. Mas se funcionar, eu aceito qualquer valor pelo pix frankhosaka@gmail.com. arquivo nota_bd.php <?php $mysqli=new mysqli("localhost","root","","diario"); if(isset($_POST['custoAtual'])){ $custoAtual=$_POST['custoAtual']; $codprod=$_POST['codprod']; $mysqli->query("update tbprod set custo=$custoAtual where codprod = $codprod"); } if(isset($_POST['lcto'])){ $lcto=$_POST['lcto']; $matriz=json_decode($_POST['matriz']); echo "aqui fica a rotina do lançamento $lcto que vai incluir os dados: "; var_dump($matriz); } arquivo notaDoFornecedor.php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script> function atualizar(custoAtual,custoAnterior,codprod){ confirma=confirm("Atualizar?\ncusto atual: "+custoAtual+"\ncusto anterior: "+custoAnterior) if(confirma){ xmlhttp=new XMLHttpRequest() url = "nota_bd.php" formData = new FormData() formData.append('custoAtual',custoAtual) formData.append('codprod',codprod) xmlhttp.open("POST",url,true) xmlhttp.send(formData) location.reload() } } </script> <form method=post class="w-50 m-auto" enctype="multipart/form-data"> <label for=arquivo>Escolha o arquivo XML</label> <input type=file name=arquivo required> <input type=submit> </form> <?php if(!isset($_FILES['arquivo'])){exit;} $notaFornecedor=$_FILES['arquivo']['tmp_name']; function dec($value) { return ($value) ? number_format($value,2,',','.') : null; } $mysqli=new mysqli("localhost","root","","diario"); // Carregar o arquivo XML $dom = new DOMDocument(); $dom->load($notaFornecedor); // Acessar os itens $nfe = $dom->documentElement; $itens = $nfe->getElementsByTagName('det'); // Calcula diferença de alíquota do ICMS $difAliqICMS=0; $aliquotaInterna=0.18; foreach($itens as $item){ if($item->getElementsByTagName('CFOP')->item(0)->textContent==6102){ $vBC=$item->getElementsByTagName('vBC')->item(0)->textContent; $vICMS=$item->getElementsByTagName('vICMS')->item(0)->textContent; $difAliqICMS += intval(($vBC*$aliquotaInterna - $vICMS)*100)/100; } } echo "<table class='table table-striped table-sm w-50 m-auto'>"; $vNF=$nfe->getElementsByTagName('vNF')->item(0)->textContent; $nNF=$nfe->getElementsByTagName('nNF')->item(0)->textContent; $xNome=$nfe->getElementsByTagName('xNome')->item(0)->textContent; echo "<tr class=fw-semibold><td><td><td>NF $nNF ". substr($xNome,0,4). "<td><td class=text-end>". dec($vNF); if($difAliqICMS!==0){ echo "<tr class=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><td class=text-end>" .dec($difAliqICMS); echo "<tr class=fw-semibold><td><td><td>Total a conferir<td><td class=text-end>" .dec($difAliqICMS+$vNF); } echo "<tr class=fw-semibold><td>CodForn<td>CodProd<td>Produto<td>Qt<td class=text-end>Total"; $soma=0; $matriz=[]; foreach ($itens as $item) { // no campo codforn uso a primeira letra para identificar o fornecedor $codforn = $xNome[0] . $item->getElementsByTagName('cProd')->item(0)->textContent; $consulta=$mysqli->query("select codprod from tbprod where codforn like '%$codforn%' "); $codprod='<spam class=text-danger>Verificar</spam>'; if ($consulta->num_rows==1) { $codprod=$consulta->fetch_assoc()['codprod']; } $produto = $item->getElementsByTagName('xProd')->item(0)->textContent; $quantidade=$item->getElementsByTagName('qCom')->item(0)->textContent; if(is_numeric($codprod)){ $produtoDobrado = [510]; if(in_array($codprod,$produtoDobrado)){ $quantidade = 2 * $quantidade; } } $vICMSST = ($item->getElementsByTagName('vICMSST')->item(0)) ? $item->getElementsByTagName('vICMSST')->item(0)->textContent : null; $difAliqICMS=0; if($item->getElementsByTagName('CFOP')->item(0)->textContent==6102){ $vBC=$item->getElementsByTagName('vBC')->item(0)->textContent; $vICMS=$item->getElementsByTagName('vICMS')->item(0)->textContent; $difAliqICMS = intval(($vBC*$aliquotaInterna - $vICMS)*100)/100; } $vIPI=0; if($item->getElementsByTagName('vIPI')->item(0)){ $vIPI=$item->getElementsByTagName('vIPI')->item(0)->textContent; } $vProd = $item->getElementsByTagName('vProd')->item(0)->textContent; $valorTotal=$vProd+$vICMSST+$difAliqICMS+$vIPI; $soma += $valorTotal; $class="class='text-end'"; if(is_numeric($codprod)){ $custoAtual=intval($valorTotal/$quantidade*100)/100; $consulta=$mysqli->query("select custo from tbprod where codprod=$codprod"); $custoAnterior=$consulta->fetch_assoc()['custo']; if(abs($custoAnterior-$custoAtual)>0.02){ $class="class='text-end text-danger' onclick='atualizar($custoAtual,$custoAnterior,$codprod)'"; } } echo "<tr><td>" . $codforn; echo "<td>" . $codprod; echo "<td>" . substr($produto,0,25); echo "<td>" . intval($quantidade); echo "<td $class>" . dec($valorTotal); $matriz[]=['codpprod'=>$codprod,'qt'=>$quantidade,'subtotal'=>$valorTotal]; } ?> <tr class=fw-semibold><td><td><td>Total dos itens<td><td class=text-end><?=dec($soma)?> </table> <div class="w-50 m-auto"> Enviar tudo para o banco de dados <form action=nota_bd method=post> <input name=lcto placeholder="Número do Lançamento" required> <input type=hidden name=matriz value=<?=json_encode($matriz)?>> <input type=submit> </form> </div>
  15. Hoje o pessoal da contabilidade me pediu as notas fiscais que foram emitidas em abril. Eu fui na Bling, baixei o arquivo e mandei para a contabilidade. A seguir, eles me mandaram uma lista de notas fiscais que estavam faltando no arquivo, eu fui verificar, e eu vi que eram notas que não foram autorizadas pela Secretaria da Fazenda. Eu achei bacana o trabalho da contabilidade, e fiquei imaginando como fazer isso no PHP. Estudei os arquivos XML e eu vi que o número da NF está na posição 29,30,31,32,33,34 daquele monte de número que aparece no nome do arquivo, e assim eu montei o meu código PHP com a ajuda da Gemini: arquivo index.php <?php $diretorio = 'xml'; $contaArquivos = count(scandir($diretorio)) - 2; echo "Número de arquivos xml: $contaArquivos <br>"; $notasFiscais = []; $nfces = scandir('xml'); foreach($nfces as $nfce){ if($nfce !== '.' && $nfce !=='..' ){ $notasFiscais[]=intval(substr($nfce,28,6)); } } sort($notasFiscais); $primeiraNota=intval($notasFiscais[0]); $ultimaNota=intval($notasFiscais[$contaArquivos-1]); echo "primeira nota: $primeiraNota <br>"; echo "ultima nota: $ultimaNota <br>"; echo "notas faltantes: " . ($ultimaNota-$primeiraNota+1-$contaArquivos) . "<br>"; for($i=$primeiraNota;$i<=$ultimaNota;$i++){ if(!in_array($i,$notasFiscais)){ echo $i . "<br>"; } }
  16. 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>
  17. 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>
  18. 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]); }
  19. 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>
  20. 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.
  21. ** 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);
  22. 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')); }
  23. 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.
  24. 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);
  25. 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();
×
×
  • Criar Novo...