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. Boa tarde, Wash, Eu fiz o seguinte código que chamei de _1.php: <form action='<?php $_PHP_SELF ?>' method='POST'> Senha <input id='senha' name='senha' autocomplete='off'> <script>senha.focus();</script> </form> <?php if (isset($_POST['senha'])) {if ($_POST['senha']==1045) {echo "parabéns";}} ?> Ele funciona, o problema é que o input que pede a senha fica visível na tela. O jeito mais fácil de eliminar isso é chamando outra página. Gostaria de saber se existe algum macete para apagar o input e permanecer na mesma página _1.php, depois de entrar a senha correta. Obrigado pela dica do POST. ---------------------------------- Em tempo, consegui resolver o problema: _1.php <body> <form action='<?php $_PHP_SELF ?>' method='POST'> Senha <input id='senha' name='senha' autocomplete='off'> <script>senha.focus();</script> </form></body> <?php if (isset($_POST['senha'])) {if ($_POST['senha']==1045) {echo "<script>document.body.innerHTML='';</script> acesso liberado!";}} ?>
  2. Hoje estudei o meu index.php, e eu vi na barra de endereço index.php?senha=1045 depois que eu digitei a senha correta. Eu fiquei perplexo e fiquei me perguntando como esconder a última parte do endereço "senha=1045". Pesquisei o Google, encontrei um camuflador, mas achei aquilo muito complicado. Assim eu decidi fazer o meu próprio código. Ele é bem meia boca, mas pelo menos não aparece mais "senha=1045" na barra de endereço. index.php <meta name="viewport" content="width=device-width, initial-scale=1"> <?php $html="<table><form action='produto.php'><input type='submit' value='Produtos'></form>" ."<form action='fornecedores.php'><input type='submit' value='Fornecedores'></form>" ."<form action='pagar.php'><input type='submit' value='Pagar'></form>" ."<form action='orcamento.php'><input type='submit' value='Orçamento'></form>" ."<form action='entraproduto.php'><input type='submit' value='Entrar Produto'></form>" ."<form action='diario.php'><input type='submit' value='Diario'></form></table><br><br>"; if (substr($_SERVER["REQUEST_URI"],-9)<>"bem-vindo") { $senha=$_GET['senha'] ?? null; if (empty($senha)) {echo '<form>Senha: <input name="senha" id="senha" onchange="submit()" autocomplete="off"></form><script>senha.focus()</script>';} else {if ($senha==1045) {header('location:index.php?bem-vindo');} else { header('location:index.php');}}} else {echo $html;} ?>
  3. Hoje tomei coragem e fui pesquisar o que é JSON e o Googe indicou a seguinte página: O mínimo que você precisa saber sobre JSON para ser um bom programador! (https_dicasdeprogramacao.com.br) Lá encontrei o seguinte código: var texto = '{"atributo1": "valor 1", "atributo2": 23}'; var objeto = JSON.parse(texto); console.log(objeto); Criei o teste.php assim: <?php echo "<script>var texto='{'atributo1':'valor 1','atributo2':23}'; var objeto=JSON.parte(texto); console.log(objeto);</script>"; Como era de esperar, não apareceu nada na tela do navegador. Fiquei imaginando que o meu erro foi trocar as aspas duplas por aspas simples no código PHP. Mesmo assim, perguntei ao Google o que é console.log. E o Google informou que o console não tem nada a ver com o navegador, ele é uma janela exclusiva do desenvolvedor, e o desenvolvedor só chega nessa janela se usar o botão direito do mouse em quaquer parte do navegador e usar o comando inspecionar. Em seguida o navegador abre um novo painel, onde no topo tem a opção Bem-Vindo >>. Clicando no ícone >> é que apareceu a opção Console. O Console é cheio de mensagens. Para apagar todas as mensagens encontrei um ícone que parece com o "proibido estacionar". Mas ele continuou recebendo mensagens. Logo ao lado do "proibido estacionar" encontrei a opção de filtros. Pedi para só filtrar por informações. E assim eu comecei a testar o código exemplo. Enfim, eu aprendi que o Console é o melhor lugar para testar os códigos em Java. E também vi que não é possíve ficar trocando aspas duplas por simples nem no Java e nem no PHP, logo os dois códigos têm que ficar isolados, não dá para embrulhar um dentro do outro.
  4. Eu fiz uma pesquisa no Google para ver se é possível para o Android ver a pasta C:/wamp64/www/frank/ no notebook através do PHP e da internet. Eu consegui fazer o download. Para modificar o arquivo eu usei o bloco de notas nativo do Gereciador de Arquivo + instalado no Android. Também consegui montar o código para o upload, ou seja, fiz um código para o Android gravar no notebook. Tudo foi copiado do Google, eu fiz algumas modificações. É possível que o código não dê certo para você, principalmente se tiver configurações mais seguras no Apache. Mas se funcionar, essa é uma boa hora para você se preocupar com segurança. No meu caso, estou só aprendendo a usar o PHP, agora posso usar tanto o Windows bem como o Android. No caso do Windows estou usando o Notepad++. No caso do Android ainda não achei nenhum bom editor de PHP. download.php <meta name="viewport" content="width=device-width, initial-scale=1"> <?php $path = "c:/wamp64/www/frank/"; $arquivo = $_GET['arquivo'] ?? null; if (empty($arquivo)) {;} else { $file = $path.$arquivo;; header("Expires: 0"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $ext = pathinfo($file, PATHINFO_EXTENSION); $basename = pathinfo($file, PATHINFO_BASENAME); header("Content-type: application/".$ext); header('Content-length: '.filesize($file)); header("Content-Disposition: attachment; filename=\"$basename\""); ob_clean(); flush(); readfile($file); exit;} $diretorio = dir($path); echo "Lista de arquivos do diretório '<strong>".$path."</strong>':<br/>"; while($arquivo = $diretorio -> read()){echo "<a href='download.php?arquivo=$arquivo'>".$arquivo."</a><br/>";} $diretorio -> close(); ?> upload.php <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- O tipo de encoding de dados, enctype, DEVE ser especificado abaixo --> <form enctype="multipart/form-data" action="upload.php" method="POST"> <!-- MAX_FILE_SIZE deve preceder o campo input --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- O Nome do elemento input determina o nome da array $_FILES --> Enviar esse arquivo: <input name="userfile" type="file" /> <input type="submit" value="Enviar arquivo" /> </form> <?php if (isset($_FILES['userfile']['name'])) { $uploaddir = 'c:/wamp64/www/frank/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {echo "Arquivo válido e enviado com sucesso.\n";} else {echo "Possível ataque de upload de arquivo!\n";} echo 'Aqui está mais informações de debug:'; print_r($_FILES); print "</pre>"; } ?>
  5. Eu tenho um código PHP que esbarrou em três <input>. Ele funciona bem se eu trabalhar com a tecla [TAB], o problema é que eu sempre esbarro na tecla [ENTER] e aí o PHP solta um monte de mensagens de erro. A minha saída foi estudar o JavaScript. O Google tem dezenas de exemplos, tentei adaptar aqui no notebook, mas nada deu certo. JavaScript é muito, mas muito difícil. Na base da tentativa e erro, cheguei nesse código HTML: <body onLoad="document.f1.n1.focus()"> <form name="f1" action="teste.php"> <input name="n1" onchange="document.f1.n2.focus();"> <input name="n2" onchange="document.f1.n3.focus();"> <input name="n3" onchange="document.f1.submit();"> </form> </body> Encontrei códigos com o marcador <script>, mas não consegui fazer funcionar.
  6. Isso requer um bom conhecimento de Java Script, CSS e HTML, o que não é o meu caso. Por enquanto, só sei fazer gambiarra com PHP, e o meu código ficaria assim, supondo que todas as informações estão no MySQL, na tbprod que tem os campos prod, categoria e subcategoria: subgrupo.php <?php $mysqli=new mysqli("servidor","usuario","senha","bancodedados"); $grupo = $_GET['grupo'] ?? null; if (empty($grupo)) { echo "Selecione o subgrupo<br><br>"; $query = $mysqli->query("select categoria as grupo from tbprod group by categoria order by grupo"); while ($row = $query->fetch_assoc()) {$grupo = $row['grupo']; echo "<a href=subgrupo.php?grupo=$grupo>$grupo</a><br>";}} else {$subgrupo = $_GET['subgrupo'] ?? null; if (empty($subgrupo)) { echo "Categoria $grupo<br><br>"; echo "Selecione o subgrupo<br>"; $sql="select subcategoria as subgrupo from tbprod where categoria='$grupo' group by subcategoria order by subgrupo"; $query = $mysqli->query($sql); while ($row = $query->fetch_assoc()) {$subgrupo = $row['subgrupo']; echo "<a href=subgrupo.php?grupo=$grupo&subgrupo=$subgrupo>$subgrupo</a><br>";} echo "<br><form action=subgrupo.php'><input type='submit' value='voltar'>";} else {echo "Categoria $grupo - Subcategoria $subgrupo<br><br>"; $sql="select * from tbprod where subcategoria = '$subgrupo' order by prod"; $query = $mysqli->query($sql); $row = $query->fetch_assoc(); while ($row = $query->fetch_assoc()) {echo $row['prod']."<br>";} echo "<br><form action='subgrupo.php'><input type='hidden' name='grupo' value=$grupo><input type='submit' value='voltar'></form>";}}
  7. Hoje eu aprendi um pouco de CSS com a ajuda do Fórum. No PHP, eu precisava apresentar seis células, todas alinhadas pela direita, menos a segunda. A gambiarra que eu fiz foi essa: <style>table.td {text-align='right';} </style> <?php ... echo "<table class='td'>"; echo "<tr><td>$primeiro</td><td align='left'>$segundo</td><td>$terceiro</td><td>$quarto</td><td>$quinto</td><td>$sexto</td></tr>"; ... ?>
  8. raio.php <?php $raio = $GET_['raio'] ?? null; if (empty($raio)) {;} else { $mysqli=new mysqli("servidor","usuario","senha","bancodedados"); $query = $mysqli->query("select taxa from tbraio where raio=$raio"); $row = $query->fetch_assoc(); $taxa = $row['taxa']; echo "a taxa é de $taxa para um raio de $raio km";} echo "<form action='raio.php'>"; echo "Qual a distância em km daqui até o cliente? <input name='raio'>"; echo "</form>"; ** eu não testei, espero que funcione. Esse código é muito ruim. Como é que o safado do atendente vai saber quantos quilometros tem da Rua Direita até a Rua Esquerda?
  9. Nossa, que vergonha. Tudo não passou de erro de digitação, e o pior é que estou usando uma técnica que foi condenada pelo comitê do HTML. Agradeço pela aula de CSS. Eu presumo que só é possível definir uma tabela por HTML. Ou é possível criar mais de uma tabela para a mesma HTML?
  10. Eu sou péssimo em HTML. O marcador <td align='right'> funciona que é uma maravilha, o problema é quando ele encontra o resultado de uma equação no PHP, ele manda para o lado left. Não sei como resolver o problema. <?php $qt = 10; echo "<table><tr><th>Quantidade</th><th>X</th><th>Quantidade</th><th>=</th><th>Total</th></tr>"; echo "<tr><td align='right'>$qt</td><td></td><td align='right'>$qt</td><td></td><td align='riqht'>".$qt*$qt."</td></tr>"; echo "<tr><td align='right'>$qt</td><td></td><td align='right'>$qt</td><td></td><td align='riqht'>".strval($qt*$qt)."</td></tr></table>";
  11. Isso é coisa de profissional! O problema é que eu não entendo nada de HTML e CSS, você pode notar que os meus scripts são pobres e bem rudimentares. A minha preocupação é fazer com que tudo caiba dentro do celular, de preferência no modo retrato. Enfim, estou fazendo só gambiarra com o PHP. Por exemplo, eu chamei index.html de _3.php, app.js de _2.php e api de _1.php. É óbvio que eu precisei fazer um monte de martelada. No _3.php mudei o <form action='_1.php' method='post'> bem como <script src='_2.php'>. Certamente, isso é uma tremenda violação da boa prática de programação, claro que a principal vítima sou eu mesmo, mas como o computador aceita qualquer coisa, eu vou dando asas para as minhas fantasias. Gostei do CSS da formatação da digitação em tempo real, ele é muito engenhoso. Também gostei do api (eu chamei de _1.php), não sabia que o php podia chamar o json com o verbo die e apresentar a resposta na mesma tela do front-end. Isso abre um enorme universo de possibilidades, uma vez que é impossível fazer paineis na tela só com o PHP. Enfim, quero agradecer pelos códigos, certamente isso me incentiva a estudar o HTML e o CSS.
  12. <?php // o nome desse scrypt é padronizadescricao.php // essa rotina transforma descrição do tipo "CABO DE ENXADA" em "Cabo de Enxada" echo "<form action='padronizadescricao.php'>"; echo "<input name='texto'>"; echo "</form>"; $texto = $_GET['texto'] ?? null; if (empty($texto)) {;} else { echo "$texto<br>"; $texto = strtolower($texto); $vetor = explode(" ",$texto); echo $texto; echo "<pre>"; print_r($vetor); echo "</pre>"; foreach ($vetor as $key => $subtexto) { if (in_array($subtexto,["de","da","do"])) {;} else { $vetor[$key] = ucfirst($subtexto); echo "$subtexto => $vetor[$key]<br>"; }} $texto = implode(" ",$vetor); echo "<br>-----------<br>"; echo $texto;}
  13. A sua listagem está incompleta ou tem uma sintaxe que eu ainda não conheço. A seguir uma lista de como obter os dez primeiros itens da tbprod. <?php $mysqli = new mysqli("localhost","root","hacker","diario"); $produtos = $mysqli->query("select * from tbprod where codprod < 10"); while ($carpro = $produtos->fetch_assoc()) { echo $carpro['codprod']." - ".$carpro['prod']."<br>";} Claro que você não quer ver os dez primeiros itens do tbprod. Estou presumindo que você tem uma nota fiscal e você quer armazenar no seu banco de dados, só não sei como você conseguiu botar os dados da nota fiscal num vetor. Supondo que você conseguiu o CFOP, o codforn, NF, codprodforn, qt, desc, unitario, total de uma tbNF, eu faria assim: <?php $mysqli = new mysqli("localhost","root","hacker","diario"); $itemNF = $mysqli->query("select * from tbNF") While ($item = $itemNF->fetch_assoc()) { $sql = "insert into tbhistprod (CFOP,codforn,NF,codprodforn, qt, desc, unitarioi, total) values ("; $sql .= ".$item['CFOP'], $item['codforn'], $item['NF'], $item['codprodforn'],$item['qt'],$item['desc'],"; $sql .= "$item['unitario'], $item['total']"; $inserir = $mysqli->query($sql); } Não sei se esse código funciona, mas é mais ou menos por aí que faria a inclusão de novos itens. No caso de você não ter uma tbNF e quer colocar a NF na unha, o jeito é ter duas páginas PHP: página1.php <?php echo <form action='pagina2.php'> echo "<input name='CFOP'> etc... etc... echo "<input name='total'> echo "<input type='submit' value='Confirmar'> echo "</form> página2.php <?php $CFOP = $_GET['CFOP']; etc... etc... $total = $_GET['total']; $mysqli = new $mysqli("localhost","root","hacker","diario"); $itemNF = $mysqli->query("Insert into tbhistprod (CFOP, etc, etc) values ($CFOP, etc etc)"; header("location:pagina1.php"); Nesse caso, cada item da NF terá que entrar um de cada vez.
  14. Supondo que o código está numa página php chamada _teste.php, eu faria assim: <form action="_teste.php"> <input type="text" name="nome"><br><br> <select name="sexo" multiple> <option value="feminino">feminino</option> <option value="masculino">masculino</option> <option value="na">na</option> </select> <br><br><input type="submit" value="Confirmar"> </form> <?php $nome=$_GET['nome'] ?? null; $sexo=$_GET['sexo'] ?? null; If (empty($nome)) {;} else { echo "$nome, sexo: $sexo";} ?> Ou seja, os marcadores <input> e <select> mandam para a página _teste.php os valores introduzidos pelo usuário, mas eles precisam ser delimitados pelo marcador <form>. Na página _teste.php, o PHP pega os valores através do comando $_GET. Espero que isso ajude.
  15. Eu usei o seu código e chamei de _teste.php, fiz pequenas modificações, e ele ficou assim <?php echo "<form action='_teste.php'>"; echo "<input type='time' name='hour'><br><br>"; echo "<input type='number' name='mult'>"; echo "<input type='submit' value='Confirmar'>"; echo "</form>"; $hour = $_GET['hour'] ?? null; $mult = $_GET['mult'] ?? null; if (empty($hour)) {;} else { $minutodecimal = date('i',strtotime($hour))/60 * $mult; $hours = date('H',strtotime($hour)) * $mult; $soma = $hours + $minutodecimal; $minutopadrao = round(($soma - intval($soma))*60,0); echo "Total de horas $hour x $mult = ".intval($soma).":".sprintf('%02s',$minutopadrao); }
  16. Essa não é uma tarefa fácil, mas fiquei curioso com o comando explode, não sei como ele funciona. Assim, eu montei o seguinte código <meta name="viewport" content="width=device-width, initial-scale=1"> <?php //$produtos = explode(";", $prod['descricaoProduto']); //foreach ($produtos as $key => $value) {$artigos = find_all('cadastroartigos', $key); // foreach ($artigos as $akey => $avalue) { // if ($avalue['descricaoProduto'] == $key) { // $avalue['precoCusto']= $prod['preço']; // update('cadastroartigos',$key, $cavalue); $mysqli=new mysqli("localhost","root","hacker","diario"); $query = $mysqli->query("select * from tbprod"); $row = $query->fetch_assoc(); $produtos=explode(";", $row['prod']); echo "<pre>"; print_r($produtos); echo "</pre>"; ?> mas o máximo que eu consegui fazer é criar o vetor $produtos com apenas o primeiro registro da tbprod. Ou seja, a primeira coisa a fazer é esquecer o comando explode, ele não serve para nada no contexto. O certo é pegar uma caneta e um papel e montar o esquema na mão, assim: 1. Pegar a tbcompra 2. Pegar a tbprod 3. Mostrar na tela do PHP a tbcompra junto com o preço da tbprod, e botar o preço em vermelho se for diferente 4. Ao invés de atualização automática, o certo é deixar para o usuário decidir se vai atualizar o preço (por exemplo, a Petrobras baixou o preço da gasolina, não há porque você baixar também, uma vez que o estoque anterior ainda está lá no tanque). 5. Estudar o PHP (ele é apenas um montador de HTML) e ver como é possível o usuário escolher o código do produto e atualizar o preço assim que o usuário selecionar o código.
  17. Até onde eu sei o include só preserva as variáveis que foram utilizadas no script anterior para o atual. Por exemplo: pagina1.php $mysqli=new mysqli("localhost","root","hacker","diario"); $query = $mysqli->query("select * from tbsupervariavel"); $linha = $query->fetch_assoc(); pagina2.php include 'pagina1.php' $mes=$linha['mesapurado']; $ano=$linha['anoapurado']; Nesse caso o vetor $linha foi criado na primeira página, mas está sendo usado na segunda. Não sei se é possível trazer a função de um MySQL dentro do PHP, mas já ouvi falar de incluir procedure do MySQL no PHP nesse link: https://smallbusiness.chron.com/call-stored-procedure-php-mysql-28881.html
  18. Eu trabalho com o MySQL, mas ainda não montei nenhuma procedure, o máximo que eu fiz foi criar um view para não ter o trabalho de formatar valores, mas depois eu vi que é mais negócio trabalhar com uma function do php. O meu trabalho com o MySQL dentro do PHP é mais ou menos assim: $mysqli=new mysqli("localhost","root","hacker","diario"); $query = $mysqli->query("select * from tbsupervariavel"); $linha = $query->fetch_assoc(); $mes=$linha['mesapurado']; $ano=$linha['anoapurado']; Resumindo, eu conecto, escolho uma tabela e eu vou trabalhando com o primeiro registro que aparecer na consulta. Esse é um exemplo bem simples. O chato são aquele monte de tabelas que são conectados entre si, nesse caso eu peço ajuda para o MS Access para escrever em SQL o que vem depois da palavra select para usar no PHP. Ou seja, o PHP é o meu ambiente para procedure. Se isso não ajudou você, encontrei a seguinte página que fala sobre o assunto (em MySQL): https://smallbusiness.chron.com/call-stored-procedure-php-mysql-28881.html
  19. Boa noite, wash, Usei o comando, <meta name="viewport" content="width=device-width, initial-scale=1"> <?php echo "<pre>"; print_r($_SERVER); echo "</pre>"; ?> Esses são os vetores que achei mais interessante [HTTP_SEC_CH_UA_MOBILE] => ?0 (não tenho isso no celular) [SERVER_ADDR] => ::1 (é igual nos dois) [SERVER_NAME] => localhost (esse é o nome do servidor no notebook, já no celular aparece o endereço no formato ipv6 fornecido pelo ngrok. Eu não vejo como diferenciar o notebook do celular pelo vetor $_SERVER, já o mobile_detect já me ajuda a identificar o notebook e o celular. O mobile_detect também é capaz de identificar o modelo do celular, isso ajuda se houver celulares de modelos diferentes.
  20. A minha primeira tentativa falhou, mas hoje eu consegui criar um novo usuário com a ajuda do editor SQL do Workbench, assim create user 'note'@'localhost'; grant all privileges on diario . * to 'note'@'localhost'; flush privileges Tudo indica que a minha primeira tentativa não deu certo porque eu esqueci de colocar ponto e vírgula, mesmo nos comandos que eu já havia executado. Mas ainda não sei como usar a nova conta para entrar no MySQL Workbench. Para saber se a nova conta funciona, eu usei o PHP. <?php $mysqli = new mysqli("localhost","note","","diario"); $query = $mysqli->query("select * from tbdiario"); $teste = $query->fetch_assoc(); echo $teste['hist']; ?> E o teste funcionou usando o notebook bem como o celular na rede 4G. O meu desafio é saber se o PHP é capaz de saber quem é o notebook (usuário 'root') e quem é o celular (usuário 'note'), e assim criar novos registros na tabela de pedidos com os campos usuário, número do pedido, total do pedido e data do pedido, sem eu precisar usar a rotina do login. Note que não há nenhuma senha nessa história, a minha prioridade é fazer os códigos funcionarem. O problema da segurança vou deixar para depois. ------------------------- Achei a solução em Mobile Detect - lightweight PHP class for detecting mobile devices (including tablets), ele resolve o meu problema. Ele sabe quem é o computador e quem é o phone. No phone, ele conseguiu identificar o aparelho. Se acrescentar mais um computador ou um o mesmo tipo de aparelho, aí a única solução é usar a rotina do login.
  21. Recentemente eu criei um programa chamado orçamento com o PHP e o MySQL. O programa é uma simples tabuada, onde z = x * y. Ou seja, a minha tabela de dados é só assim: dados [ produto, preço ] Ele funciona se eu usar o celular OU o notebook, mas não os dois ao mesmo tempo. Para evitar o conflito entre o celular e o notebook, estou pensando em trabalhar com conta de usuário, um para o celular e outro para o notebook. Eu nunca mexi com conta de usuário. A minha dúvida é quanto a base dados, eu devo modificar a tabela de dados assim [usuário, produto, preço] ou não devo mexer em nada, e deixo banco de dados se virar sozinho?
  22. Eu faria assim: pegaremail.php <? echo "<form action='pegarprefixo.php'>Digite email<input name='email'></form>"; pegarprefixo.php <? $email = $_GET['email'] ?? null; if (empty($email) {echo "você não digitou nada!";} else { $pos=strripos("@",$email); if ($pos==0) {echo "$email - email inválido!";} else {$prefixo = substr($email, 1, $pos-1); echo "Olá Sr $prefixo!";}}
  23. Isso é um tremendo erro de lógica. Testei várias vezes até o código funcionar. Mas esqueci de testar quando o usuário entra pela primeira vez, aonde esqueci de definir a variável $pec que é o motor de todo o programa. Que mancada! Eu peço sinceras desculpas. Para contornar o problema paliativamente, digite orcamento.php?ped=1 na barra de endereços. Agradeço por testar o meu programa. Quanto à criação das tabelas, nunca passou na cabeça fazer tal tarefa dentro do orçamento.php. Isso é um outro erro de lógica, eu jamais iria imaginar que alguém teria coragem de testar o meu código, mas isso vai além da minha capacidade. O MySQL ainda é novo para mim. O meu maior problema hoje é saber como conectar as chaves das tabelas e criar a integridade referencial e impedir que as subtabelas fiquem órfãs da tabelas principais. O máximo que posso fazer é consertar o erro de lógica, e publicar o orçamento.php 3.0 assim que ficar pronto, por enquanto, obrigado por tudo e por prestigiar o meu código com o seu tempo. ----------------------------- A seguir a listagem do orcamento.php 3.0, corrigindo o erro da definição do $ped. <meta name="viewport" content="width=device-width, initial-scale=1"> <?php function dec($num) {$fmt = number_format($num,2,',','.'); return $fmt;} function deca($num) {$fmt = str_replace(',','.',$num); return $fmt;} function df($data) {$fmt = date('d/m/Y',strtotime($data)); return $fmt;} $codprod=$_GET['codprod'] ?? null; $com=$_GET['com'] ?? null; $id=$_GET['id'] ?? null; $ped=$_GET['ped'] ?? null; $mysqli=new mysqli("localhost","root","","diario"); //rotina para um novo pedido (regra: não abrir novo pedido se o anterior não foi utilizado) if (empty($com)) {;} else {if ($com=='novo') { $query=$mysqli->query("select * from tbpedido order by codped desc"); $row = $query->fetch_assoc(); $ultped = $row['codped']; $totalped = $row['totalped']; if ($totalped>0){ $dia=date('Y-m-d'); $ultped = $ultped + 1; $query=$mysqli->query("insert into tbpedido (codped,dia) values ($ultped,'$dia')");} header('location:orcamento.php?ped='.$ultped);}} //rotina para um pedido anterior if (empty($com)){;} else {if ($com=='anterior') { if ($ped>1) {$ped=$ped-1;header('location:orcamento.php?ped='.$ped);}}} //rotina para excluir item do orçamento if (empty($com)){;} else {if ($com=='dec') { $query=$mysqli->query("delete from tbhistped where id=$id"); $query=$mysqli->query("select sum(subtotal) as total from tbhistped where codped = $ped"); $total = $query->fetch_assoc()['total']; $total=round($total,2); $query=$mysqli->query("update tbpedido set totalped = $total, dia = '".date('Y-m-d')."' where codped = $ped");}} //rotina para incluir item no orçamento if (empty($com)){;} else {if ($com=='adc') { $qt=deca($_GET['qt']); $codprod = $_GET['codprod']; $unitario = $_GET['unitario']; $subtotal = round($qt * $unitario,2); $query=$mysqli->query("insert into tbhistped (codped,qt,codprod,unitario,subtotal) values ($ped,$qt,$codprod,$unitario,$subtotal)"); $query=$mysqli->query("select sum(subtotal) as total from tbhistped where codped = $ped"); $total = $query->fetch_assoc()['total'];$total=round($total,2); $query=$mysqli->query("update tbpedido set totalped = $total, dia = '".date('Y-m-d')."' where codped = $ped"); header('location:orcamento.php?ped='.$ped);}} //rotina para selecionar um produto if (empty($com)) {;} else {if ($com=='slc') { $sql="select * from tbprod order by prod"; $proc = $_GET['proc'] ?? null; if (empty($proc)) {;} else { if (strlen($proc) > 1) {$sql="select * from tbprod where prod like '%$proc%' order by prod"; if ($proc[0]=="@"){$proc=substr($proc,1); $sql="select * from tbprod where codforn like '%$proc%' order by prod";}} else {$sql="select * from tbprod where prod like '$proc%' order by prod";}} echo "<form action='orcamento.php'><br>Procurar: "; echo "<input name='proc' autocomplete='off' value=$proc ><input type='hidden' name='com' value='slc'></form>"; echo "<table><tr><th>Código</th><th>Descrição</th></tr>"; $query=$mysqli->query($sql); while($linha = $query->fetch_assoc()) { $codprod = $linha['codprod']; $codprod = "<a href=orcamento.php?codprod=$codprod&ped=$ped>".$linha['codprod']."</a>"; echo "<tr><td align='right'>$codprod</td><td>".$linha['prod']."</td></tr>";} echo "</table>"; exit;}} // definir a variável $pec onde ele é igual a 1 se a tbpedido estiver vazia, caso contrário assume o último pedido. if (empty($ped)) { $query = $mysqli->query("select * from tbpedido"); $num_rows = $query->num_rows; if ($num_rows==0) {$query=$mysqli->query("insert into tbpedido (codped,dia) values (1,date(now()))");$ped=1;} else {$query = $mysqli->query("select * from tbpedido order by codped desc");$ped=$query->fetch_assoc()['codped'];}} $query = $mysqli->query("select * from tbpedido where codped=$ped"); $row = $query->fetch_assoc(); $dia = df($row['dia']); $totalped = $row['totalped']; if (empty($totalped)) {$totalped=0;} echo "<table><tr><font color=red>Pedido $ped de $dia, Total R$ ".dec($totalped)."</tr>"; echo "<tr></font><br>Para excluir item do pedido, selecione a unidade do item </tr>"; echo "<tr><td><form action='orcamento.php'><input type='submit' name='com' value='novo'><input type='hidden' name='com' value='novo'></form></td>"; echo "<td><form action='orcamento.php'><input type='submit' name='com' value='anterior'><input type='hidden' name=ped value=$ped></form></td></tr></table>"; echo "<table><tr><th>Produto</th><th>Qt</th><th>Un</th><th>Preço</th><th>Total</th></tr>"; $sql="SELECT tbhistped.id,tbhistped.codped, tbhistped.codprod, tbhistped.qt as qt, tbhistped.unitario as unitario, tbhistped.subtotal,"; $sql.="tbprod.prod as prod, tbprod.un as un "; $sql.="FROM tbhistped INNER JOIN tbprod ON tbhistped.codprod = tbprod.codprod and tbhistped.codped = $ped ORDER BY tbhistped.id"; $query = $mysqli->query($sql); while ($row = $query->fetch_assoc()) { $un = $row['un']; $un = "<a href='orcamento.php?com=dec&ped=$ped&id=".$row['id']."'>$un</a>"; echo "<tr><td>".$row['prod']."</td><td align=right>".dec($row['qt'])."</td><td>$un</td><td align=right >".dec($row['unitario']); echo "</td><td align=right>".dec($row['subtotal'])."</td></tr>"; } if (empty($codprod)) { echo "<tr><td><a href='orcamento.php?com=slc&ped=$ped'>Selecione o produto</a></td></tr>";} else { $query = $mysqli->query("select * from tbprod where codprod=$codprod"); $row=$query->fetch_assoc(); $custo = $row['custo']; echo "<tr><td>".$row['prod']."</td><td>"; echo "<form action='orcamento.php'><input name='qt' autocomplete=off width=5><input type='hidden' name='codprod' value=$codprod>"; echo "<input type='hidden' name='com' value='adc'><input type='hidden' name='unitario' value=$custo>"; echo "<input type='hidden' name='ped' value=$ped></td><td>".$row['un']."</td><td align=right>".dec($row['custo'])."</td></td>";} ?>
  24. Inclui a rotina de novo orçamento, e a versão 2.0 ficou assim: <meta name="viewport" content="width=device-width, initial-scale=1"> <?php function dec($num) {$fmt = number_format($num,2,',','.'); return $fmt;} function deca($num) {$fmt = str_replace(',','.',$num); return $fmt;} function df($data) {$fmt = date('d/m/Y',strtotime($data)); return $fmt;} $codprod=$_GET['codprod'] ?? null; $com=$_GET['com'] ?? null; $id=$_GET['id'] ?? null; $ped=$_GET['ped'] ?? null; $mysqli=new mysqli("localhost","root","","diario"); //rotina para um novo pedido (regra: não abrir novo pedido se o anterior não foi utilizado) if (empty($com)) {;} else {if ($com=='novo') { $query=$mysqli->query("select * from tbpedido order by codped desc"); $row = $query->fetch_assoc(); $ultped = $row['codped']; $totalped = $row['totalped']; if ($totalped>0){ $dia=date('Y-m-d'); $ultped = $ultped + 1; $query=$mysqli->query("insert into tbpedido (codped,dia) values ($ultped,'$dia')");} header('location:orcamento.php?ped='.$ultped);}} //rotina para um pedido anterior if (empty($com)){;} else {if ($com=='anterior') { if ($ped>1) {$ped=$ped-1;header('location:orcamento.php?ped='.$ped);}}} //rotina para excluir item do orçamento if (empty($com)){;} else {if ($com=='dec') { $query=$mysqli->query("delete from tbhistped where id=$id"); $query=$mysqli->query("select sum(subtotal) as total from tbhistped where codped = $ped"); $total = $query->fetch_assoc()['total']; $total=round($total,2); $query=$mysqli->query("update tbpedido set totalped = $total, dia = '".date('Y-m-d')."' where codped = $ped");}} //rotina para incluir item no orçamento if (empty($com)){;} else {if ($com=='adc') { $qt=deca($_GET['qt']); $codprod = $_GET['codprod']; $unitario = $_GET['unitario']; $subtotal = round($qt * $unitario,2); $query=$mysqli->query("insert into tbhistped (codped,qt,codprod,unitario,subtotal) values ($ped,$qt,$codprod,$unitario,$subtotal)"); $query=$mysqli->query("select sum(subtotal) as total from tbhistped where codped = $ped"); $total = $query->fetch_assoc()['total'];$total=round($total,2); $query=$mysqli->query("update tbpedido set totalped = $total, dia = '".date('Y-m-d')."' where codped = $ped"); header('location:orcamento.php?ped='.$ped);}} //rotina para selecionar um produto if (empty($com)) {;} else {if ($com=='slc') { $sql="select * from tbprod order by prod"; $proc = $_GET['proc'] ?? null; if (empty($proc)) {;} else { if (strlen($proc) > 1) {$sql="select * from tbprod where prod like '%$proc%' order by prod"; if ($proc[0]=="@"){$proc=substr($proc,1); $sql="select * from tbprod where codforn like '%$proc%' order by prod";}} else {$sql="select * from tbprod where prod like '$proc%' order by prod";}} echo "<form action='orcamento.php'><br>Procurar: "; echo "<input name='proc' autocomplete='off' value=$proc ><input type='hidden' name='com' value='slc'></form>"; echo "<table><tr><th>Código</th><th>Descrição</th></tr>"; $query=$mysqli->query($sql); while($linha = $query->fetch_assoc()) { $codprod = $linha['codprod']; $codprod = "<a href=orcamento.php?codprod=$codprod&ped=$ped>".$linha['codprod']."</a>"; echo "<tr><td align='right'>$codprod</td><td>".$linha['prod']."</td></tr>";} echo "</table>"; exit;}} $query = $mysqli->query("select * from tbpedido"); $num_rows = $query->num_rows; if ($num_rows==0) {$query=$mysqli->query("insert into tbpedido (codped,dia) values (1,date(now()))");$ped=1;} $query = $mysqli->query("select * from tbpedido where codped=$ped"); $row = $query->fetch_assoc(); if (empty($ped)) {$ped = $row['codped'];} $dia = df($row['dia']); $totalped = $row['totalped']; if (empty($totalped)) {$totalped=0;} echo "<table><tr><font color=red>Pedido $ped de $dia, Total R$ ".dec($totalped)."</tr>"; echo "<tr></font><br>Para excluir item do pedido, selecione a unidade do item </tr>"; echo "<tr><td><form action='orcamento.php'><input type='submit' name='com' value='novo'><input type='hidden' name='com' value='novo'></form></td>"; echo "<td><form action='orcamento.php'><input type='submit' name='com' value='anterior'><input type='hidden' name=ped value=$ped></form></td></tr></table>"; echo "<table><tr><th>Produto</th><th>Qt</th><th>Un</th><th>Preço</th><th>Total</th></tr>"; $sql="SELECT tbhistped.id,tbhistped.codped, tbhistped.codprod, tbhistped.qt as qt, tbhistped.unitario as unitario, tbhistped.subtotal,"; $sql.="tbprod.prod as prod, tbprod.un as un "; $sql.="FROM tbhistped INNER JOIN tbprod ON tbhistped.codprod = tbprod.codprod and tbhistped.codped = $ped ORDER BY tbhistped.id"; $query = $mysqli->query($sql); while ($row = $query->fetch_assoc()) { $un = $row['un']; $un = "<a href='orcamento.php?com=dec&ped=$ped&id=".$row['id']."'>$un</a>"; echo "<tr><td>".$row['prod']."</td><td align=right>".dec($row['qt'])."</td><td>$un</td><td align=right >".dec($row['unitario']); echo "</td><td align=right>".dec($row['subtotal'])."</td></tr>"; } if (empty($codprod)) { echo "<tr><td><a href='orcamento.php?com=slc&ped=$ped'>Selecione o produto</a></td></tr>";} else { $query = $mysqli->query("select * from tbprod where codprod=$codprod"); $row=$query->fetch_assoc(); $custo = $row['custo']; echo "<tr><td>".$row['prod']."</td><td>"; echo "<form action='orcamento.php'><input name='qt' autocomplete=off width=5><input type='hidden' name='codprod' value=$codprod>"; echo "<input type='hidden' name='com' value='adc'><input type='hidden' name='unitario' value=$custo>"; echo "<input type='hidden' name='ped' value=$ped></td><td>".$row['un']."</td><td align=right>".dec($row['custo'])."</td></td>";} ?>
  25. Obrigado Iowys. dec é a função que pega o valor do MySQL e apresenta de forma abrasileirada o número para o usuário. deca faz o contrário, pega o número abrasileirado do usuário e transforma no formato que o MySQL espera. df pega a data do MySQL e abrasileira no padrão "dia/mês/ano". varchar(30) define o campo como alfa numérico com no máximo 30 posições na tabela MySQL. Se o campo tiver 5 caracteres, ele vai ocupar exatamente 5 caracteres. Já o char(30) vai ocupar todas as 30 posições dentro do HD, não importa se você não usou todo o espaço alocado. Fiz o teste no meu celular, e encontrei um tremendo erro logo na primeira linha. O marcador <meta> não pode ser definido dentro do script <?php ?>, ele tem que vir antes do script. Do jeito que está, o usuário vai enxergar pouca coisa no celular. É assim que vou aprendendo HTML, tem coisas que não dá para fazer com o poderoso echo do PHP. Quanto a nomenclatura, você está coberto de razão. Mas eu cansei de brigar com o PHP, quanto mais você escreve mais o PHP encontra erro, assim estou apelando para palavras bem curtas, nada descritivas, impossíveis de reduzir. Eu escrevia CodFornecedor, CodFornec, CodForn, e de tanta advertência que recebi do PHP, decidi escrever tudo em minúsculo e assim decidi por codforn tanto no nome do campo quanto na variável. Mas o PHP é muito chato, ele não aceita eu escrever $_get, ele me obriga a escrever $_GET. Mas eu fui honesto. Eu comecei o título alertando que o meu código é um péssimo exemplo de programação.
×
×
  • Criar Novo...