Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.678
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. O Biehl não gostou da minha solução. Ele queria que eu usasse uma caixa <select> ao invés de quatro <input>. Assim, usei o meu famoso método científico da tentativa e erro para ver se eu consigo agradar o Biehl, mas desconfio que não vou conseguir. Mas, pelo menos, eu aprendo um pouco mais. <?php //tab_aprendiz(id,ref,cores)(1,555,verde)(2,555,azul) id=chave primária, auto-incrementa if (isset($_POST['enviar'])){ $conexaoBD=new mysqli("localhost","root","","laravel"); $cores=json_decode($_POST['cores']); $corprocurada=$cores[0]; $coralterada=$cores[1]; $sql="UPDATE tab_aprendiz SET cores='$coralterada' WHERE cores='$corprocurada'"; mysqli_query($conexaoBD,$sql); var_dump(mysqli_fetch_all(mysqli_query($conexaoBD,"select * from tab_aprendiz")));} ?> <form method=post> <select name=cores multiple size=4> <option value='["verde","vermelho"]'>verde->vermelho</option> <option value='["azul","amarelo"]'>azul->amarelo</option> <option value='["vermelho","verde"]'>vermelho->verde</option> <option value='["amarelo","azul"]'>amarelo->azul</option> </select> <input type="submit" name="enviar" value="Salvar"> </form>
  2. Depois de dois anos estudando o PHP, o HTML e o JavaScript, finalmente eu consegui montar um código para navegar entre os orçamentos. Até ontem, eu só tinha um botão para recuar um orçamento de cada vez. Com esse novo navegador eu posso recuar até 10 orçamentos, não preciso mais recuar dez vezes até chegar no orçamento desejado: <meta name="viewport" content="width=device-width, initial-scale=1"> <script> function mostrar(){navegacao.style="display:block"} function ocultar(){navegacao.style="display:none"} function anterior(ped){location.replace('?anterior='+ped)} function posterior(ped){ ped=ped+18 location.replace('?anterior='+ped)} </script> <div style='width:300;margin:0 auto'> <input type=submit value='Barra de Navegação do Orçamento' onclick=mostrar()> <?php $style="display:none"; $where=""; $mysqli=new mysqli("localhost","root","","laravel"); if(isset($_GET['anterior'])){ $anterior=$_GET['anterior']; $where="where ped <= $anterior"; $style="display:block";} $query=$mysqli->query("select * from tbpedido $where order by ped desc limit 10"); echo "<div id=navegacao style=$style><table><th>Dia<th>Pedido<th>Total"; while($row=$query->fetch_assoc()){ $ped=$row['ped']; echo "<tr><td>".$row['dia']; echo "<td><a href=?ped=$ped>$ped</a>"; echo "<td>".$row['total'];} echo "</table> <input type=submit value=anterior onclick=anterior($ped)> <input type=submit value=posterior onclick=posterior($ped)> <input type=submit value=cancelar onclick=ocultar()> </div></div>";
  3. Ontem eu encontrei o Biehl no fórum do iMasters, e ele perguntou para a plateia como fazer atualização múltipla. Ele queria mudar a cor verde para o vermelho e o azul para amarelo. Como eu sou bastante bitolado, eu logo queria responder que isso é impossível, que o MySQL foi projetado para fazer uma atualização de cada vez. O Google mostrou para mim que eu estava bastante errado: <?php // tb_aprendiz(id,cor)(1,vermelho)(2,amarelo) if(isset($_GET['cor'])){ $cor=$_GET['cor']; $cor1velho=$cor[0];$cor1novo=$cor[1]; $cor2velho=$cor[2];$cor2novo=$cor[3]; $mysqli=new mysqli("localhost","root","","laravel"); $query=$mysqli->query("update tab_aprendiz set cor = case cor when '$cor1velho' then '$cor1novo' when '$cor2velho' then '$cor2novo' else cor end");} ?> <form> <table><th>Cor Antiga<th>Cor Nova <tr><td><input name=cor[] required><td><input name=cor[] required> <tr><td><input name=cor[] required><td><input name=cor[] required> <tr><td><input type=submit> </form>
  4. Aqui está o código corrigido: <?php // mysql tbpalavras (id,palavra); tbfrases (id,frase) $mysqli=new mysqli("localhost","root","","laravel"); $query=$mysqli->query("select palavra from tbpalavras"); $rows=$query->fetch_all(MYSQLI_ASSOC); $palavras=[]; $palavras[]="_"; // gambiarra do Frank foreach($rows as $row){ $palavras[]=$row['palavra'];} $query=$mysqli->query("select frase from tbfrases"); while($row=$query->fetch_assoc()){ $frase=$row['frase']; $vetores=explode(" ",$frase); foreach($vetores as $vetor){ $subvetor=$vetor; $subvetor=str_replace('.','',$subvetor); $subvetor=str_replace(',','',$subvetor); $subvetor=str_replace(';','',$subvetor); if(array_search($subvetor,$palavras)){ echo "<b>$vetor </b>";} else { echo $vetor." ";}}}
  5. Essa é uma solução bem ruim, mas funciona: <?php $mysqli=new mysqli("localhost","root","","laravel"); $ped=$_GET['pedido']; $sql="select * from tbpedido inner join tbhistped on tbpedido.ped = tbhistped.ped inner join tbprod on tbprod.codprod = tbhistped.codprod where tbpedido.ped=$ped"; $query=$mysqli->query($sql); $rows=$query->fetch_all(MYSQLI_ASSOC); $num_rows=mysqli_num_rows($query); if($num_rows==0){ echo "<script>if(confirm('Não há nada para imprimir')) {location.replace('orcamento.php')} else {location.replace('orcamento.php')}</script>";} Quando comecei a estudar o JavaScript, o máximo que eu aprendi foi usar o comando alert( ), o problema é que ele não pára o código PHP. Assim eu fui obrigado a aprender o que é modal. Só depois de dois anos (ou seja, hoje) é que aprendi um novo comando no JavaScript chamado confirm, ele é capaz de parar o código PHP no meio do caminho. O único problema é que ele tem duas opções, Ok ou Cancelar. Para ambos casos, eu mandei o usuário para a mesma página.
  6. <?php namespace Hcode; class Model { private $values = []; public function __call($name,$args){ $method = $name; $fieldName = $args[0]; if(isset($args[1])){$value=$args[1];} switch($method){ case "get": return $this->values[$fieldName]; break; case "set": $this->values[$fieldName]=$value; break;}} public function getValues() { return $this->values;} public function setValues($arg){ $this->values=$arg;}} $teste=new Model(); $teste->setValues(["alpha"=>1,"beta"=>2,"gama"=>3]); var_dump($teste->getValues()); var_dump($teste->get('alpha')); $teste->set('alpha',8); var_dump($teste->getValues()); Eu gostei dessa função do constructor, eu ajeitei tudo na base da tentativa e erro. A minha dificuldade foi o número de parâmetros, o get pede um parâmetro, e o set pede dois parâmetros. Para evitar reclamação, usei a função isset. Quanto à função setData eu tive a mesma mensagem, afirmando que ela não é mais usada desde o PHP 7.4, mas eu creio que a função setValues que publiquei serve para o mesmo propósito.
  7. Eu tenho um código em Laravel que faz uma enorme lista de produtos vinculados. Para saber se o custo do produto vinculado está com o valor esperado, eu fiz um código assim: if($precocalculado==$precovinculado){echo "ok";} else {echo "problema";} A maior parte da listagem tem um monte de "ok", mas sempre tem um ou outro que tem "problema". Não há como pedir para o Laravel ou o PHP procurar a palavra "problema" na página do HTML, mas encontrei na internet uma dica bacana em JavaScript, assim <script>window.find("problema")</script> É um programa bem simples e prático. Ele não só procura a palavra, mas também indica aonde está a palavra procurada.
  8. Não sei fazer uma âncora com o elemento <a> e o elemento <div> como foi enunciado. Eu geralmente uso o elemento <form> e <select> assim: <form> <select name=selecao onchange=submit()> <option>1 queijo</option> <option>2 queijos</option> <option>3 queijos</option> <option>4 queijos</option> </select> </form> <?php if(isset($_GET['selecao'])){ echo "a opção escolhida foi ".$_GET['selecao'];} Para implantar um buscador, precisamos de um banco de dados do tipo MySQL, mais ou menos assim: <?php $mysqli=new mysqli("localhost","root","","laravel"); echo "<form><input name=busca onchange=submit()></form>"; if(isset($_GET["busca"])){ $criterio=$_GET['busca']; $query=$mysqli->query("select * from tbprod where prod like '%$criterio%' limit 5"); $rows=$query->fetch_all(MYSQLI_ASSOC); var_dump($rows);} --------------------------------------------------------------------------------------------- No caso de você querer usar o HTML como o seu banco de dados, nesse caso, só o JavaScript é que pode ajudar: <style>div {display:none;background:lightgray}</style> <script> function mostrar(escolha){ e=document.getElementById(escolha) e.style='display:block' if(escolha=="frutas"){ legumes.style='display:none';proteinas.style='display:none'; fr.style='background:yellow';le.style='background:white'; pr.style='background:white'} if(escolha=="legumes"){ proteinas.style='display:none';frutas.style='display:none'; fr.style='background:white';le.style='background:yellow'; pr.style='background:white'} if(escolha=="proteinas"){ frutas.style='display:none';legumes.style='display:none'; fr.style='background:white';le.style='background:white'; pr.style='background:yellow'}} </script> <a id=fr onclick='mostrar("frutas")'>frutas</a><br> <a id=le onclick='mostrar("legumes")'>legumes</a><br> <a id=pr onclick='mostrar("proteinas")'>proteinas</a><br> <div id=frutas> <p>Abacate <p>Maçã <p>Pera </div> <div id=legumes> <p>Repolho <p>Alface <p>Pepino </div> <div id=proteinas> <p>Carne Moída <p>Sobrecoxa de Frango <p>Sardinha </div>
  9. A impressora térmica não é nada fácil, o máximo que eu consegui foi conectar o Windows na impressora com a ajuda do driver fornecido pelo Control Id. Não existe driver para o Android. No Google encontrei várias dicas, a mais interessante é instalar um servidor no Windows e um outro aplicativo no Android, mas eu não consegui baixar o aplicativo, ele não é compatível com o meu celular. Também vi vários textos falando do ESC/PSO no PHP, mas ele é muito técnico. Assim, eu usei o meu método de tentativa e erro para imprimir com o pouco que eu sei de PHP, HTML e JavaScript, ele ficou assim: <?php $mysqli=new mysqli("localhost","root","","diario"); function dec($num) { if (empty($num)) {$fmt="";} else {$fmt = number_format($num,2,',','.'); return $fmt;}} function df($data) {$fmt = date('d/m/Y',strtotime($data)); return $fmt;} $css="align=right"; $ped=$_GET['pedido']; $sql="select * from tbpedido inner join tbhistped on tbpedido.ped = tbhistped.ped inner join tbprod on tbprod.codprod = tbhistped.codprod where tbpedido.ped=$ped"; $query=$mysqli->query($sql); $rows=$query->fetch_all(MYSQLI_ASSOC); $ped=$rows[0]['ped']; $dia=df($rows[0]['dia']); echo "<table> <tr><td colspan=7>Quitanda do Frank <tr><td colspan=7>Pedido $ped de $dia"; foreach($rows as $row){ $prod=$row['prod']; echo "<div style=width:200:word-break:normal><tr><td colspan=7>$prod</div>"; echo "<tr><td $css>".dec($row['qt'])."<td $css>".$row['un']."<td>x<td $css>". dec($row['unitario'])."<td>=<td $css>".dec($row['subtotal']);} $total=dec($rows[0]['total']); echo "<tr><td><b>Total<td><td><td><td><td $css><b>$total</table></div>"; ?> <script> window.print() </script>
  10. Eu usei o painel dessa impressora, e defini a ethernet e o WiFi assim: IP 192.168.000.038 - Máscara sub-rede 255.255.254.000 - Gateway 192.168.000.001 - Porta de impressão: 9003 - DHPC desligado autenticação WPA2, Nome do Sinal Claro_2g, Senha 1234, IP 192.168.000.038 - Máscara sub-rede 255.255.255.000 - Gateway 192.168.000.001 - Porta de impressão: 9003 - DHPC ligado Usei o PHP assim: <?php header("192.168.0.38:9003"); e não aconteceu nada. Eu usei o navegador assim 192.168.0.38:9003 e a impressora soltou o papel escrito assim: GET / HTTP/1.1 host: 192.168.0.38: 9003 Connection: keep-alive Cache-Control: max-age-0 Upgrde-Insecure-requests: 1 etc etc etc A conclusão que eu cheguei é que é possível imprimir do HTML para a impressora local, mesmo usando um celular. O problema é que eu não sei absolutamente nada de HTML e assim não sei como usar o PHP para criar um arquivo HTML. Para contornar o problema, eu instalei o controlador da impressora no Windows, selecionei uma parte da página do navegador e pedi para imprimir. Isso é simples e prático, o problema é que só o Windows é que é capaz de fazer isso, já o celular não tem esse recurso. Ainda não descobri se existe um meio de imprimir com o Android, não achei um controlador para Print Id Touch no Play Store ou pedir para o Windows compartilhar a impressora (isso ainda não tentei).
  11. O código a seguir é uma gambiarra, o propósito dele é mostrar como a frente do caixa "seleciona" o produto, em seguida "pega" a quantidade para finalmente mostrar os dados de um único item. Esse código só permite incluir um único item, num único pedido. Para melhorar, eu preciso de mais tempo e recur$o. <?php /* mysql: schema=laravel, usuario root, sem senha produtos (id int,descricao varchar(45),preço float) usuarios (id int,nome varchar(45)) pedidos (id int) orcamentos (id int,idusuario int,idpedido int,idproduto int,quantidade float,preço float,subtotal float) */ $mysqli=new mysqli("localhost","root","","laravel"); session_start(); $_SESSION['codusuario']=1; // isso precisa ser definido na tela de login, não aqui. $codusuario=$_SESSION['codusuario']; $query=$mysqli->query("select * from produtos order by descricao"); $produtos=$query->fetch_all(MYSQLI_ASSOC); ?> <form> <select name=codigo onchange=submit()> <option>Selecione o produto</option> <?php foreach($produtos as $produto) { echo "<option value=".$produto['id'].">".$produto['descricao']."</option>";} ?> </select> </form> <?php if(isset($_GET['codigo'])){ $codigo=$_GET['codigo']; $query=$mysqli->query("select * from produtos where id=$codigo"); $produto=$query->fetch_assoc(); $descricao=$produto['descricao']; $preço=$produto['preço']; $_SESSION['codigo']=$codigo; $_SESSION['descricao']=$descricao; $_SESSION['preço']=$preço; ?> <table> <tr><th>Código<th>Descrição<th>Quantidade<th>preço <tr><td><?=$codigo?><td><?=$descricao?><td> <form style=margin:0> <input name=quantidade size=2 onchange=submit()> </form> <td><?=$preço?> </table> <?php } if(isset($_GET['quantidade'])){ $quantidade=$_GET['quantidade']; $idpedido=1; // rotina precisa ser melhorada para definir número do pedido $codsuario=$_SESSION['codusuario']; $codigo=$_SESSION['codigo']; $descricao=$_SESSION['descricao']; $preço=$_SESSION['preço']; $id=1; // rotina precisa ser melhorada para definir o id do orçamento $subtotal=$quantidade*$preço; $mysqli->query("insert into orçamentos (id,idpedido,idusuario,quantidade,idproduto,preço,subtotal) values ($id,$codigo,$codusuario,$quantidade,$preço,$subtotal)"); // falta conferir se esse código deu certo ?> <table> <tr><th>Código<th>Descrição<th>Quantidade<th>preço<th>Subtotal <tr><td><?=$codigo?><td><?=$descricao?><td><?=$quantidade?><td> <?=$preço?><td><?=$subtotal?> </table> <?php } ?>
  12. <form> <input name=codigo placeholder="codigo do produto"> <input name=quantidade placeholder="quantidade"> <input type=submit> </form> <?php $mysqli=new mysqli("localhost","root","","laravel"); if(isset($_GET['codigo']) { $usuario=1; $codigo=$_GET['codigo']; $quantidade=$_GET['quantidade']; $query=$mysqli->query("insert into orcamento (idusuario, idproduto, quantidade) values ($usuario,$codigo,$quantidade)");} Esse código é bem simples, não usa o JavaScript, mas mostra como é possível usar somente o PHP para guardar a informação no banco de dados. Ele não oferece a possibilidade do usuário escolher o produto, o código presume que o usuário sabe o código do produto. Quando você escreveu o código SELECT * FROM produtos WHERE emitente='$emitente' eu logo vi que o problema não está na frente do caixa, mas sim lá atrás. Ninguém vai criar o campo emitente na tabela de produtos. Sem um banco de dados organizado, é impossível pedir qualquer coisa para o PHP. No código que vou publicar no próximo post, vou tentar resolver o problema na frente do caixa.
  13. <?php $json=json_decode('{"parc":10,"parc1":20}'); $parc=isset($json->parc) ? $json->parc : 0; $parc1=isset($json->parc1) ? $json->parc1 : 0; $parc2=isset($json->parc2) ? $json->parc2 : 0; $parc3=isset($json->parc3) ? $json->parc3 : 0; echo "A soma das parcelas deu ".$parc+$parc1+$parc2+$parc3; Se não houver nenhuma parcela, a primeira instrução terá que ser escrita assim: $json=json_decode(''); É possível melhorar esse código?
  14. Desde 1990 é que venho sonhando em montar um programa que faça um orçamento. A grosso modo, orçamento nada mais é que uma tabuada do tipo Preço vezes Quantidade. Por exemplo, um quilo de Sonho de Valsa custa R$ 64,00, logo dois quilos custam R$ 128,00, e assim por diante. O problema é vender o produto. Na hora que o semáforo fecha e eu ofereço o meu saco para o condutor, ele diz que não quer o meu saco, mas apenas um bombom. Para resolver esse tipo de problema, a Lacta criou dois códigos de barra. O saco do bombom recebeu o código 7 896019 602006 e o bombom 7893 9301, ou seja, é fácil identificar o produto pelo código da embalagem. O problema é o princípio da atomicidade. No banco de dados você só pode ter um código para cada produto, e um saco de bombom ou um bombom é a mesma coisa. Passeando pelas lojas, eu vi que os programadores inventaram uma gambiarra chamada "outros doces", coisa de R$ 2,00. No meu caso, eu inventei o múltiplo, um código para o saco com o custo de R$ 64,00 e outro código para o bombom a R$ 64,00 / 45 = R$ 1,42. Ontem, eu tentei fazer uma relação do múltiplo, mas eu queria colocar o bombom em vermelho e o saco em preto. Eu tentei usar o Bootstrap assim: <table class="table table-striped"> <tr class="text-danger"><td>{{$prod}}<td>{{$custo}} Só que esse código não funcionou, eu perdi o sábado inteiro para procurar a solução e não achei, até que um rapaz me pediu para usar a célula <td> e não a linha <tr>, e o código ficou assim <tr><td class="text-danger">{{$prod}}<td class="text-danger">{{$custo}} O código ficou longo, mas consegui avermelhar o texto do bombom. Fiquei imaginando se eu não podia simplificar a redação, procurei novamente a internet, e eu não achei nada, apenas isso: @php($gambiarra="td class='text-danger'") <table class="table table-striped"> <tr><{{$gambiarra}}>{{$prod}}<{{$gambiarra}}>{{$custo}} Isso me deu um enorme peso na consciência: quem vai conseguir entender o meu código? Outro problema é se o condutor me pedir apenas a metade do bombom e não o bombom inteiro.
  15. Consegui resolver: Ao invés de avermelhar os textos que estão numa linha <tr>, o melhor é avermelhar os textos que estão em cada célula <td>, assim: <html> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script> <div style='width:200;margin:0 auto'> <table class="table table-striped"> <tr><td class=text-danger>Vermelho <tr><td class=text-danger>Vermelho <tr><td class=text-danger>Vermelho </table> </div>
  16. Esse código não funciona: <html> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous"> <div style='width:200;margin:0 auto'> <table class="table table-striped"> <tr class=text-danger><td>Vermelho <tr class=text-danger><td>Vermelho <tr class=text-danger><td>Vermelho </table></div> Eu não queria jogar fora o Bootstrap e tentar montar uma tabela zebrada através do PHP, a manutenção do código é muito trabalhosa. A minha solução foi esquecer que estamos na era do HTML 5, e usei o marcador <font>. O VS Code alerta que o marcador não está previsto no HTML 5, mas foi o único jeito que encontrei para resolver o problema. Ou tem outra solução? <html> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous"> <div style='width:200;margin:0 auto'> <table class="table table-striped"> <tr><td><font color=red>Vermelho <tr><td><font color=red>Vermelho <tr><td><font color=red>Vermelho </table></div>
  17. Ontem eu usei o método Find do Laravel pela primeira vez, e eu gostei muito dele, e só agora é que eu consigo enxergar a diferença entre o PHP e o Laravel. Para saber a descrição de um produto, a gramática do MySQL é Select produto from tabela_produto where codigo = @codigo. A gramática do PHP é assim $query=$mysqli->query("select produto from tabela_produto where codigo = $codigo"); E a gramática do Laravel é assim $produto=tabela_produto::where('codigo',$codigo)->value('produto'); O problema dessa gramática é que ele sempre precisa estar conectado no banco de dados. Tanto o PHP quanto o Laravel são capazes de jogar toda a tabela de produtos no terminal do cliente. A pergunta é: como o cliente vai consultar a tabela? No caso do PHP, o desenvolvedor vai precisar da tecnologia do JavaScript. Mas o Laravel já tem uma gramática mais robusta, olha só que bacana: Model class tbprod extends Model{ use HasFactory; protected $table="tbprod"; protected $fillable=['prod','custo','codforn','marg','loc','emb','cf','codbar']; protected $primaryKey="codprod"; public function vinculados(){return $this->hasMany(tbprod::class,'codforn','codforn');}} Controller Public Function inicio(Request $request){ $produtos=tbprod::all(); $vinculados=tbprod::with('vinculados')->where('codforn','like','{%')->orderBy('prod')->get(); return view('multiplo',compact('produtos','vinculados')); } Blade <table class="table table-striped"> @foreach($vinculados as $vinc) <tr><td>Produto Principal<td>{{$produtos->find(json_decode($vinc->codforn)->cod)->prod}} <tr><td>Produto Vinculado<td>{{$vinc->prod}} @endforeach </table> Eu adaptei o meu código baseado numa sugestão do Lary do Laracasts, mas ele apagou a sugestão, e assim não sei se é necessário a "relação" vinculados que foi definido no Model. O importante é o arquivo blade, onde usei pela primeira vez o método find. A tabela produto tem o campo codforn, por exemplo, "banana dúzia", codprod=15, codforn=1234. Depois eu criei o produto "banana peça", codprod=16, codforn='{"cod":15,"conv":12}'. A banana peça está amarrado com o código 15. Para saber quem era o código 15, eu forçava o Blade a conectar com o banco de dados assim {{app\models\tbprod::where('codprod',$codprod)->value('prod')}} e essa conexão era repetida tantas vezes para quantos produtos vinculados houvesse. Já o find faz o mesmo serviço, mas sem precisar de nenhuma conexão.
  18. Foi em 2020 que eu comecei a estudar o HTML, ele é um texto, mas usa alguns marcadores que ajuda o navegador a colocar os elementos aqui e ali. Mas eu progredi muito pouco, só aprendi a usar <table><th><td>. Logo no começo o pessoal do fórum Script Brasil pegou no meu pé, pedindo para que eu usasse </table></th></td>. Eu não dei a menor importância, pois o navegador nunca reclamou comigo. Mas hoje eu precisava dar um jeito de agrupar informação e também apresentar os detalhes. Não dá para usar o <details> pois ele só aceita uma informação, não mais do que isso. Eu preciso apresentar um monte de informação tanto no agrupamento bem como no detalhe. Ou seja, eu não tenho outra escolha senão aprender a criar uma tabela dentro da outra. Uma tabela tem o resumo do agrupamento. Por exemplo, Pedido 12 R$ 500,00. Pedido 13 R$ 50,00. e assim por diante. Assim que o usuário clicar no Pedido 12, o navegador vai mostrar uma outra tabela que mostra os produtos que fazem parte daquele pedido. Nesses três anos, eu tentei, tentei e tentei, mas a informação apareceu todo embaralhado. Só hoje é que eu encontrei um tutorial bacana que resolveu o meu problema. Tudo o que eu tenho que fazer é escolher uma célula <td>. Uma tabela comum é assim <table><tr><td>texto<td>texto <tr><td>texto<td>texto</table>. A escolha mais óbvia é o primeiro <td> do segundo <tr>. Assim, eu montei a minha nova tabela assim: <table><tr><td>texto<td>texto <tr><td><table>...</table><td><td>. Estou muito contente, depois de três anos, aprendi um pouco mais de HTML! <style> .esconde {display:none} .mostra {display:block} </style> <script> function alterna(e){ if(e.className=="esconde"){e.className="mostra"} else {e.className="esconde"}} </script> <table><tr><th>Grupo<th>Total<th>Obs <?php for($i=1;$i<=5;$i++){ $id="t".$i;$k=$i*1000;$l=random_int(1,500); echo " <tr onclick=alterna($id)><td>grupo $i<td>$k<td>$l <tr><td><table id=$id class='esconde'><td><td>"; for($j=1;$j<=3;$j++){ echo " <tr><td>sub $j<td>sub $j<td>sub $j";} echo "</table>";} echo "</table>";
  19. Hoje precisei dar uma olhada no manual do Laravel para ver se havia a possibilidade de fazer uma consulta agrupamento e uma consulta seleção ao mesmo tempo para a mesma tabela. Isso é possível sim, o problema é que o campo que precisava agrupar estava no formato yyyy-mm-dd h:i. Para mudar o formato no meio de uma consulta, isso é bem complicado, assim estou pensando em mudar o campo em duas partes, um campo para date e outro para time, claro que isso é um desperdício de recurso. Outra alternativa é eu "injetar" a gramática do PHP no Laravel, ou seja, vou pedir para fazer uma consulta no Controller e outra no Blade. Isso também é desperdício de recurso. Mas no manual eu consegui encontrar um tópico interessante. Eu pensei que os campos created_at e updated_at eram obrigatórios para trabalhar com o motor do Eloquent, e assim eu criei esses dois campos em várias tabelas para continuar com o meu estudo no Laravel. Só que eu nunca usei esses campos, eu só tenho dois usuários usando o meu projeto, eu não preciso de tanto detalhe na tabela para trabalhar. A dica é pedir para o Eloquent não trabalhar com esses dois campos, definindo a propriedade $timestamps para false para cada model que você precisa trabalhar. Eloquent: Getting Started - Laravel - The PHP Framework For Web Artisans
  20. Eu tenho a tabela pedidos com datas e o número do pedido. Eu queria agrupar o número dos pedidos por data. Eu fiz uma bela gambiarra, misturando a gramática do Laravel com a gramática do PHP. Funcionou, mas eu pedi ajuda no Laracasts. A solução do Lary é muito mais elegante que a minha. Só que apareceu um outro colaborador, propondo resolver tudo na base das Collections. Os Collections não funcionaram comigo, mas a mensagem do Lary desapareceu. O Lary é a Inteligência Artificial do Laracasts. O problema do Laracasts é que não dá para editar o Post, mas o Lary conseguiu até excluir! Que coisa! Mesmo assim, eu consegui adaptar a sugestão do Lary no meu código que ficou assim: Model tbpedido.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbpedido extends Model { use HasFactory; protected $table="tbpedido"; public function details() {return $this->hasMany(tbpedido::class,'dia','dia');} } -------------------------- PedidoController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbpedido; class PedidoController extends Controller { public function group(){ $groups=tbpedido::groupBy('dia')->select('dia')->get(); $details=tbpedido::with('details')->get(); return view('groups',compact('groups','details')); } } ----------------------------- groups.blade.php <table><th>Dia<th>Pedido @foreach($groups as $group) <tr><td>{{$group->dia}} @foreach($group->details as $detail) <td>{{$detail->ped}} @endforeach @endforeach </table> A minha solução também funciona, mas vou morrer de vergonha se eu publicar aqui.
  21. Consegui copiar quase tudo, mas o meu melhor trabalho está na gambiarra que eu fiz na caixa de busca: navbar.php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <nav class="navbar navbar-expand-lg bg-body-tertiary"> <div class="container-fluid"> <a class="navbar-brand" href="#"><img src=https://logopng.com.br/logos/ifood-43.png width=80 height=40></a> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav me-auto mb-2 mb-lg-0"> <li class="nav-item"> <a id=inicio class="nav-link" aria-current="page" href="inicio">Inicio</a></li> <li class="nav-item"> <a id=restaurante class="nav-link active" aria-current="page" href="restaurante">Restaurantes</a> </li> <li class="nav-item"> <a id=mercado class="nav-link" aria-current="page" href="produto">Mercados</a></li> <form class="d-flex" role="search"> <i class="input-group-text"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16"> <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/> </svg><input class="border-0 bg-transparent" placeholder="Busque por item ou loja" style=outline:none></i></form> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> Contagem - MG </a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="#">Action</a></li> <li><a class="dropdown-item" href="#">Another action</a></li> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item" href="#">Something else here</a></li> </ul></li> <li class="nav-item"><a class="nav-link" href="#">Link</a></li> <li class="nav-item"><a class="nav-link" href="#">Link</a></li> </ul></div></div></nav></nav> ------------------------------------------------------------------------------- produto.php <?php include('navbar.php'); echo "<div style='width:500;margin:0 auto;margin-top:50'>"; echo "Beringela <br>"; echo "Abacaxi <br>"; echo "</div>"; ?> <script> inicio.className="nav-link" restaurante.className="nav-link" mercado.className="nav-link active" </script> ------------------------------------------------------------------------------- inicio.php <?php include('navbar.php'); echo "<div style='width:500;margin:0 auto;margin-top:50'>"; echo "Aqui é o <br>"; echo "começo de tudo <br>"; echo "</div>"; ?> <script> inicio.className="nav-link text-danger" restaurante.className="nav-link" mercado.className="nav-link" </script> ------------------------------------------------------------------------------- restaurante.php <?php include('navbar.php'); echo "<div style='width:500;margin:0 auto;margin-top:50'>"; echo "Bar do Zé <br>"; echo "Bar da Esquina <br>"; echo "</div>"; ?> <script> inicio.className="nav-link" restaurante.className="nav-link text-danger" mercado.className="nav-link" </script>
  22. O notebook do meu irmão é muito velho e o sistema é o Windows 10. Eu estava com muito receio. Lá em 2020, eu gastei duas semanas para instalar o WampServer no meu notebook, usando vários tutoriais que encontrei no Google. Dessa vez, eu não usei nenhum tutorial. Baixei o programa principal, mas a velocidade do download era de 300 kb/s. É difícil dizer se a baixa velocidade era causada pela idade do notebook, ou pela distância do WiFi (o notebook estava a 10m do modem) ou se esse negócio de fibra ótica é mais uma conversa para o boi dormir. Na hora de instalar, o WampServe disse que precisa do Microsoft Visual C++. Lá tem um enorme relação de versões, eu só peguei o último, e a instalação terminou sem nenhum trauma. Ativei o servidor, abri o navegador e escrevi localhost, e lá apareceu a tela de apresentação. Pelo ícone do servidor eu abri o PhpMyAdmin e de lá importei o banco de dados do orçamento. No diretório C:\Wamp64\www eu abri um diretório chamado frank e joguei nele todos os códigos em PHP que compõe o meu projeto de orçamento. Finalmente, mudei o nome do index.php do diretório www para index original.php, no lugar coloquei um novo index.php assim: <?php header('location:/frank/index.php'); O meu irmão usa o projeto Orçamento através da internet. Eu instalei o WampServe, o banco de dados e os meus códigos em PHP no computador do meu irmão só por precaução. Espero que ele não use.
  23. Você viu o tamanho do campo senha na tabela usuários?
  24. Eu fiz o teste por aqui, e eu não consegui passar pelo password_verify. Depois de muito apanhar eu vi que o tamanho do campo senha na tabela usuarios estava assim var(50), quando o correto é var(255). Eu ajuntei os seus códigos e eu fiz apenas um só com o nome de index.php: <form method=post> <input name=email placeholder=email value="frankhosaka@gmail.com"> <input name=senha placeholder=senha value="1234"> <input type=submit> </form> <?php session_start(); $pdo=new PDO("mysql:host=localhost;dbname=astudy","root",""); //$email='frankhosaka@gmail.com'; //$hash=password_hash('1234',PASSWORD_DEFAULT); //$stmt=$pdo->prepare("insert into usuarios (email,senha) values (?,?)"); //$stmt->execute([$email,$hash]);exit; $message = ''; if ($_SERVER['REQUEST_METHOD'] == 'POST'){ $email = $_POST['email']; $password = $_POST['senha']; try { $query = "SELECT * FROM usuarios WHERE email = ?"; $stmt = $pdo->prepare($query); $stmt->execute([$email]); $user = $stmt->fetch();} catch (Exception $e){ echo $e->getMessage(),'\n'; } if ($user && password_verify($password, $user['senha'])) { $_SESSION['user_id'] = $user['id']; $_SESSION['user_name'] = $user['nome']; $_SESSION['access_level'] = $user['acesso_nivel']; echo "<form><input type=submit name=testar value=testar onclick=submit()></form>"; } else { $message = 'Erro! E-mail ou senha inválidos.';}} if(isset($_GET['testar'])){ echo "id: ".$_SESSION['user_id']."<br>"; echo "user_name: ".$_SESSION['user_name']."<br>"; echo "access_level: ".$_SESSION['access_level']."<br>"; echo "<input type=submit value='Novo Teste' onclick=location.replace('index.php')>";} ?>
  25. Sim, ele é amargo. Mas eu frito em fatias em um pouco de azeite, adiciono dois copos de água se usar dois nigagori, adiciono um pacote de Hondashi e uma colher de missô, deixo cozinhar por 10 ou 15 minutos, ele tem que ficar mole. Hoje eu fiz a versão descontinuar no Laravel: Controller: aqui usei a gambiarra da session para poder passar o valor de uma variável de uma instrução para outra public function descontinuar(Request $request){ $produto=null; if($request->input('codprod')){ $codprod=$request->input('codprod'); $produto=tbprod::where('codprod',$codprod)->value('prod'); session(['codprod'=>$codprod]);} if($request->input('confirmar')){ $codprod=session('codprod'); tbhistprod::where('codprod',$codprod)->update(['codprod'=>1854]); tbprod::where('codprod',$codprod)->update(['prod'=>' disponivel']);} return view('descontinuar',['produto'=>$produto]);} Blade: @include('menu') <br> <form>Código do produto <input name=codprod onchange=submit() autofocus></form> @if($produto) Confirmar a descontinuação do produto: {{$produto}} <form><input type=submit name=confirmar value=Confirmar onclick=submit()></form> @endif Note que esse não é um belo código Laravel, mas ele funciona.
×
×
  • Criar Novo...