Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.623
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. 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." ";}}}
  2. 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.
  3. <?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.
  4. 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.
  5. 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>
  6. 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>
  7. 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).
  8. 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 } ?>
  9. <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.
  10. <?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?
  11. 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.
  12. 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>
  13. 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>
  14. 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.
  15. 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>";
  16. 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
  17. 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.
  18. 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>
  19. 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.
  20. Você viu o tamanho do campo senha na tabela usuários?
  21. 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')>";} ?>
  22. 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.
  23. O meu banco de dados já tem mais de 1.000 produtos, isso é muita coisa. O meu programa Orçamento tem condições de criar um novo produto, mas ao invés de criar um novo produto, eu decidi descontinuar um produto. Por exemplo, eu tenho um produto chamado beringela brasileira e outro chamado de beringela japonesa. Como eu não sei como assar uma beringela brasileira, eu decidi não mais comprar. Além de ser novato na programação eu também sou novato na cozinha, mas recentemente eu encontrei um novo produto chamado nigagori ou mais precisamente pepino japonês. Ao invés de criar um produto novo com o nome de nigagori, eu decidi usar o código da beringela brasileira. O meu programa Orçamento é capaz de mudar o nome, o custo, a unidade, o código de barra, a localização, o código utilizado pelo fornecedor, o NCM (o código de produtos do Mercosul), mas ele não é capaz de mudar a história do produto. Até ontem eu entrava no banco de dados e mudava a história do produto para um produto que eu chamei de Descontinuado. Isso é fácil de fazer pelo programa PhpMyAdmin. Mas ontem eu não consegui logar no PhpMyAdmin. Isso já aconteceu umas cinco vezes comigo nesses últimos três meses, quando decidi hospedar o meu banco de dados no Hostinger. Pensando nesse problema, eu criei um novo código chamado descontinuar.php, ele ficou assim <?php include('menu.php'); echo "<form>Digite o código do produto<input name=codprod onchange=submit()></form>"; if(isset($_GET['codprod'])){ $codprod=$_GET['codprod']; $query=$mysqli->query("select * from tbprod where codprod=$codprod"); $produto=$query->fetch_assoc()['prod']; echo $produto."<br>"; echo "<form>Confirme a descontinuição do produto de código <input name=confirma type=submit value=$codprod></form>";exit;} if(isset($_GET['confirma'])){ $codprod=$_GET['confirma']; $query=$mysqli->query("update tbhistprod set codprod=1854 where codprod=$codprod"); $query=$mysqli->query("update tbprod set prod=' Disponivel' where codprod=$codprod"); echo "<input type=submit value=Continuar onclick=location.replace('descontinuar.php')";} O programa é bem simples e agora o meu projeto Orçamento também pode descontinuar o produto. Esse é um código PHP, agora preciso também traduzir em Laravel que está em fase de teste. Agora, a minha preocupação é se eu não conseguir logar no meu projeto. Eu não tenho nenhum plano de contigência se a Hostinger me deixar na mão.
  24. Além do Laravel, eu tenho o mesmo projeto em PHP. No caso de um apresentar problema, peço para o usuário usar outra plataforma. No caso da busca da agulha no palheiro, hoje eu conheci o comando MySQL concat, a sintaxe dele é essa: $sql="select * from tbprod where concat (codprod,prod,codbar,codforn) like '%$busca%'";
  25. Eu faria assim: astudy.php <form> Digite o codigo do produto <input name=codigo onchange=submit()> </form> <?php $mysqli=new mysqli("localhost","root","","astudy"); if(isset($_GET['codigo'])){ $codprod=$_GET['codigo']; $query=$mysqli->query("select * from tbprod where codprod=$codprod"); $row=$query->fetch_assoc(); $produto=$row['prod']; $preço=$row['custo']; echo " Formulário de Atualização <form><table> <tr><th style=width:100;text-align:left>Campo<th align=left>Valor <tr><td>Codigo<td>$codprod<input type=hidden name=code value=$codprod> <tr><td>Produto<td>$produto <tr><td>Preço<td><input name=preço value=$preço onchange=submit()> </table></form>"; exit;} if(isset($_GET['code'])){ $codprod=$_GET['code']; $preço=$_GET['preço']; $query=$mysqli->query("update tbprod set custo=$preço where codprod=$codprod"); $queryconfirma=$mysqli->query("select * from tbprod where codprod=$codprod"); $row=$queryconfirma->fetch_assoc(); var_dump($row); echo "<input type=submit value=Recomeçar onclick=location.replace('astudy.php')>";}
×
×
  • Criar Novo...