Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.622
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. 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.
  2. 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.
  3. 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>
  4. 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>
  5. 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>
  6. 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>
  7. 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; ?>
  8. 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>
  9. 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>
  10. 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>
  11. 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>"; } }
  12. 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>
  13. 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>
  14. 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]); }
  15. 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>
  16. 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.
  17. ** 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);
  18. 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')); }
  19. 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.
  20. 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);
  21. 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();
  22. 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); } }
  23. 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:
  24. 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);
  25. 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.
×
×
  • Criar Novo...