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. Levei um tempão até encontrar a dica no Google: javascript - Loading an image to a <img> from <input file> - Stack Overflow Adaptando no meu código, ele ficou assim: <script> function onselec(event){ selectedFile=event.target.files[0] reader=new FileReader() imgtag=document.getElementById("cliente") imgtag.title=selectedFile.name reader.onload=function(event){imgtag.src=event.target.result} reader.readAsDataURL(selectedFile)} </script> <img src="fotos/padrão.jpg" height="190" width="150" id="cliente"> <p>Selecionar Foto <p><input type="file" name="foto" id=foto onchange=onselec(event)>
  2. O Bootstrap é bacana, mas na hora de baixar o exemplo e testar por aqui, é puro desespero. Tudo parece estático, nada se mexe. Para dar movimento, eu preciso consultar o Google. Hoje, por exemplo, eu queria azular as opções de barra de navegação, ao passar o mouse por cima deles. Eu tive a sorte de encontrar essa dica: css bootstrap use active in a list <li> - Stack Overflow E com ele, eu consegui fazer um sidebar básico com o Bootstrap 5.3: <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"> <style> ul.nav a:hover{background:blue} .bd-placeholder-img {font-size: 1.125rem;text-anchor: middle;-webkit-user-select: none; -moz-user-select: none;user-select: none;} @media (min-width: 768px) {.bd-placeholder-img-lg {font-size: 3.5rem;}} .b-example-divider {width: 100%;height: 3rem;background-color: rgba(0, 0, 0, .1); border: solid rgba(0, 0, 0, .15);border-width: 1px 0; box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);} .b-example-vr {flex-shrink: 0;width: 1.5rem;height: 100vh;} .bi {vertical-align: -.125em;fill: currentColor;} .nav-scroller {position: relative;z-index: 2;height: 2.75rem;overflow-y: hidden;} .nav-scroller .nav {display: flex;flex-wrap: nowrap;padding-bottom: 1rem; margin-top: -1px;overflow-x: auto;text-align: center; white-space: nowrap;-webkit-overflow-scrolling: touch;} .btn-bd-primary {--bd-violet-bg: #712cf9; --bd-violet-rgb: 112.520718, 44.062154, 249.437846; --bs-btn-font-weight: 600;--bs-btn-color: var(--bs-white); --bs-btn-bg: var(--bd-violet-bg); --bs-btn-border-color: var(--bd-violet-bg); --bs-btn-hover-color: var(--bs-white); --bs-btn-hover-bg: #6528e0;--bs-btn-hover-border-color: #6528e0; --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb); --bs-btn-active-color: var(--bs-btn-hover-color); --bs-btn-active-bg: #5a23c8;--bs-btn-active-border-color: #5a23c8;} .bd-mode-toggle {z-index: 1500;} </style> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="bootstrap" viewBox="0 0 118 94"><title>Bootstrap</title> <path fill-rule="evenodd" clip-rule="evenodd" d="M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z"> </path></symbol> <symbol id="home" viewBox="0 0 16 16"> <path d="M8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4.5a.5.5 0 0 0 .5-.5v-4h2v4a.5.5 0 0 0 .5.5H14a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146zM2.5 14V7.707l5.5-5.5 5.5 5.5V14H10v-4a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v4H2.5z" /> </symbol> <symbol id="speedometer2" viewBox="0 0 16 16"> <path d="M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z" /> <path fill-rule="evenodd" d="M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z" /> </symbol> <symbol id="table" viewBox="0 0 16 16"> <path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z" /> </symbol> <symbol id="people-circle" viewBox="0 0 16 16"> <path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z" /> <path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z" /> </symbol> <symbol id="grid" viewBox="0 0 16 16"> <path d="M1 2.5A1.5 1.5 0 0 1 2.5 1h3A1.5 1.5 0 0 1 7 2.5v3A1.5 1.5 0 0 1 5.5 7h-3A1.5 1.5 0 0 1 1 5.5v-3zM2.5 2a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.5 1.5 0 0 1 10.5 1h3A1.5 1.5 0 0 1 15 2.5v3A1.5 1.5 0 0 1 13.5 7h-3A1.5 1.5 0 0 1 9 5.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zM1 10.5A1.5 1.5 0 0 1 2.5 9h3A1.5 1.5 0 0 1 7 10.5v3A1.5 1.5 0 0 1 5.5 15h-3A1.5 1.5 0 0 1 1 13.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.5 1.5 0 0 1 10.5 9h3a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-3A1.5 1.5 0 0 1 9 13.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3z" /> </symbol> </svg> <div class="d-flex flex-column flex-shrink-0 p-3 text-bg-dark" style="width: 280px;"> <a href="#" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-white text-decoration-none"> <svg class="bi pe-none me-2" width="40" height="32"><use xlink:href="#bootstrap"/></svg> <span class="fs-4">Sidebar</span></a> <ul class="nav nav-pills flex-column mb-auto"> <li class="nav-item"> <a href="#" class="nav-link text-white" aria-current="page"> <svg class="bi pe-none me-2" width="16" height="16"><use xlink:href="#home"/></svg> Home</a></li> <li> <a href="#" class="nav-link text-white"> <svg class="bi pe-none me-2" width="16" height="16" role="link"><use xlink:href="#speedometer2"/></svg> Dashboard</a></li><li> <a href="#" class="nav-link text-white"> <svg class="bi pe-none me-2" width="16" height="16" role="link"><use xlink:href="#table"/></svg> Orders</a></li><li> <a href="#" class="nav-link text-white"> <svg class="bi pe-none me-2" width="16" height="16" role="tabpanel"><use xlink:href="#grid"/></svg> Products</a></li> <li> <a href="#" class="nav-link text-white"> <svg class="bi pe-none me-2" width="16" height="16" role="tabpanel"><use xlink:href="#people-circle"/></svg> Customers</a></li></ul>
  3. Eu criei o projeto PHP em 2020, antes disso ele se chamava projeto MS Access 1990. O MS Access já tem uma rotina pronta para autenticar a senha, esse não é o caso do PHP. No caso do PHP, eu fiz essa gambiarra: if(!$row){$_SESSION['mensagem']="email incorreto";header("location:index.php"); Ele nunca funcionou! Lá em 2022 eu comecei a estudar o Laravel e eu conheci um facilitador chamado middleware. Ele é bacana, bastante funcional, mas não me ajudou a consertar o projeto PHP, o middleware é tão obscuro quanto a rotina de autenticação do MS Access. Finalmente, em 2023, eu tomei coragem e usei o poderoso "var_dump(!$variavel);exit;" aqui e ali até achar o erro, até eu chegar nessa linha: if(!$row){$_SESSION['mensagem']="email incorreto"; header("location:index.php");var_dump($row);exit; Para a minha surpresa, a rotina funcionou, depois de três longos anos! É óbvio que não foi o var_dump que consertou o erro, mas sim o comando exit. Ou seja, o comando header não funciona, se você não fizer o programa parar. Que coisa!
  4. O projeto portaria - Google Drive contém vírus. Sem ele não dá apresentar o meu projeto alternativo, onde tentei achar uma solução para o problema do relatório da portaria. É uma pena.
  5. O meu irmão mandou um WhatsApp reclamando que não conseguia entrar no projeto PHP pelo tablet e nem pelo celular, disse que recebeu a mensagem 403. Entrei no portal da Hostinger, e fui até a pasta public_HTML, e a única coisa que eu achei de estranho é o arquivo .htacess, fiz uma cópia de segurança no meu notebook, e deletei. O projeto PHP voltou no ar. Eu fui testar o projeto em Laravel, um se chama laravel e outro teste, ambos estavam acessíveis. Ainda não sei o que é esse .htacess, o que encontrei dentro dele foi isso: RewriteEngine On RewriteRule ^$ http://127.0.0.1:80/ [P,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://127.0.0.1:80/$1 [P,L]
  6. Frank K Hosaka

    A classe

    Finalmente, eu consegui terminar a tradução do meu projeto em PHP para Laravel. Tudo o que eu precisava era criar uma classe no Laravel. O Laravel não permite criar uma classe dentro de outra classe. Eu tentei colocar num arquivo chamado Helpers.php, mas o Laravel não aceitou. O único jeito foi criar um controller, assim: php artisan make:controller vr Eu queria chamar a minha classe de var, mas o Laravel também não deixa. A seguir a listagem da classe vr, o controller do orçamento e seu respectivo blade: vr.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class vr extends Controller { public $ped; public $diaped; public $totalped; public $codp; public $pessoa; public $end; public $cnpj; public $tel; public $nota; public $codprod; public $prod; public $un; public $preço; public function getPed(){return $this->ped;} public function getDiaped(){return $this->diaped;} public function getTotalPed(){return $this->totalped;} public function getCodp(){return $this->codp;} public function getPessoa(){return $this->pessoa;} public function getEnd(){return $this->end;} public function getCNPJ(){return $this->cnpj;} public function getTel(){return $this->tel;} public function getNota(){return $this->nota;} public function getCodprod(){return $this->codprod;} public function getProd(){return $this->prod;} public function getUn(){return $this->un;} public function getPreco(){return $this->preço;} } ------------------------------------------------------------------ OrcamentoController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbsupervariavel; use App\Models\tbpedido; use App\Models\tbpessoa; use App\Models\vw_histped; use App\Models\tbprod; use App\Models\tbhistped; use Auth; class OrcamentoController extends Controller { public function orcamento(request $request){ $vr=new vr(); if($request->input('qt')){ $qt=$request->input('qt'); if($qt!=0){ $qt=fmt($qt); $texto=$request->input('texto'); $vetor=explode(",",$texto); $preço=$vetor[0]; $codprod=tbsupervariavel::where('codsuper',Auth::id())->value('codprod'); $ped=$vetor[1]; $un=$vetor[2]; $subtotal=$qt*$preço; tbhistped::create(['ped'=>$ped,'codprod'=>$codprod,'un'=>$un,'unitario'=>$preço,'subtotal'=>$subtotal,'qt'=>$qt]); $total=tbhistped::where('ped',$ped)->sum('subtotal'); tbpedido::where('ped',$ped)->update(['total'=>$total]);}} if($request->input('excluir')){ $id=$request->input('excluir'); $ped=$request->input('pedido'); tbhistped::destroy($id); $total=tbhistped::where('ped',$ped)->sum('subtotal'); tbpedido::where('ped',$ped)->update(['total'=>$total]);} if($request->input('produto')){ $produto=$request->input('produto'); $tamanho=strlen($produto); $posicao=strpos($produto,":"); $vr->codprod=substr($produto,$posicao+1,$tamanho-$posicao); tbsupervariavel::where('codsuper',Auth::id())->update(['codprod'=>$vr->codprod]); $produto=tbprod::where('codprod',$vr->codprod)->first(); $vr->prod=$produto->prod; $vr->un=$produto->un; $vr->preço=pvenda($produto->custo,$produto->marg);} if($request->input('anterior')){ $ped=$request->input('anterior'); if($ped>0){$ped--;} tbsupervariavel::where('codsuper',Auth::id())->update(['ped'=>$ped]);} if($request->input('novo')){ $pedido=tbpedido::orderBy('ped','desc')->first(); if($pedido->total!=0){ $pedido->ped++; tbpedido::create(['ped'=>$pedido->ped,'dia'=>now()]);} tbsupervariavel::where('codsuper',Auth::id())->update(['ped'=>$pedido->ped]);} tbsupervariavel::where('codsuper',Auth::id())->update(['end'=>'orcamento']); $vr->ped=tbsupervariavel::where('codsuper',Auth::id())->value('ped'); $vr->diaped=tbpedido::where('ped',$vr->ped)->value('dia'); $vr->totalped=tbpedido::where('ped',$vr->ped)->value('total'); $vr->codp=tbpedido::where('ped',$vr->ped)->value('codp'); if($vr->codp){ $pessoa=tbpessoa::where('codp',$vr->codp)->first(); $vr->pessoa=$pessoa->pessoa; $vr->end=$pessoa->end; $vr->cnpj=$pessoa->cnpj; $vr->tel=$pessoa->tel; $vr->nota=$pessoa->nota;} $histped=vw_histped::where('ped',$vr->ped)->get(); $prod=tbprod::orderBy('prod')->get(); return view('orcamento',compact('vr','histped','prod'));} } --------------------------------------------------------------------------------- orcamento.blade.php @include('menu') <script>document.title="Orçamento" btmenu.innerHTML='Barraca do Frank<br>Esquina da Magazine Luiza' </script> <div><table class='table table-striped'> <td><form><input type='submit' value='anterior'><input type='hidden' name='anterior' value={{$vr->ped}}></form> <td style=color:red>Pedido {{$vr->ped}} de {{dbr($vr->diaped)}} <td><form><input type='submit' value='novo'><input type='hidden' name='novo' value='novo'></form></table> <div><table class='table table-striped linha2'><th>Produto<th style=text-align:right>Qt<th>Un<th>Preço<th>Total @foreach($histped as $item) <tr> <td nowrap>{{$item->prod}} <td align=right> @if($item->qt==intval($item->qt)) {{$item->qt}} @else {{dec($item->qt)}} @endif <td><a href=?excluir={{$item->id}}&pedido={{$item->ped}}>{{$item->un}}</a> <td align=right>{{dec($item->unitario)}} <td align=right>{{dec($item->subtotal)}} @endforeach <tr> @if(!isset($_GET['produto'])) <td> <form> <input list=lsproduto name=produto placeholder=produto onchange=submit() size=40> <datalist id='lsproduto'> @foreach($prod as $pr) <option value='{{$pr->prod}} :{{$pr->codprod}}'> @endforeach </datalist> </form> @else <td>{{$vr->prod}} @endif @if(!isset($_GET['qt'])) <td align=right> <form> <input id=qt name=qt onchange=submit() size=1 placeholder=qt autofocus> <input type=hidden name=texto value="{{fmt($vr->preço)}},{{$vr->ped}},{{$vr->un}}"> </form> <td>{{$vr->un}}<td>{{$vr->preço}} @endif <tr><td> @if(empty($vr->codp)) <a href=pessoa>Selecione um cliente</a> @else <details> <summary><b>{{$vr->pessoa}}</b></summary> Endereço <b>{{$vr->end}}</b> <br> CNPJ <b>{{$vr->cnpj}}</b> <br> Telefone <b>{{$vr->tel}}</b> <br> Nota <b>{{$vr->nota}}</b> <br> <a href=pessoa>Mudar cliente</a> <br> <a href="pessoa?busca={{$vr->pessoa}}">Atualizar cliente</a> </details> @endif <td><td><td><td><b>{{dec($vr->totalped)}} </table> </div> O único problema desse código é que ele usa o método GET, o que deixa um monte de comandos na barra de navegação. Ou seja, se você atualizar o navegador, ele vai incluir o mesmo produto tantas vezes quanto você atualizar a tela do navegador. Para contornar isso, o pessoal recomenda usar o método POST, mas aí você não consegue enxergar coisa alguma na barra de navegação. Isso é um dilema difícil de resolver.
  7. Hoje eu encontrei uma dica nessa página php - Laravel filter a value in all columns - Stack Overflow, e eu criei esse método na classe PessoaController: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbpessoa; use Schema; class PessoaController extends Controller{ public function pessoa(Request $request){ if($request->input('busca')){ if(($request->input('busca'))[0]=="@"){ $busca=$request->input('busca'); $tamanho=strlen($busca); $busca=substr($busca,1,$tamanho-1); $query=tbpessoa::query(); $columns=Schema::getColumnListing('tbpessoa'); foreach($columns as $column){ $query->orWhere($column,'like','%'.$busca.'%');} $pessoas=$query->get(); return view('pessoa',compact('pessoas'));}} }
  8. Eu gosto bastante do Hostinger, ele me cobra R$ 23,00 por mês e assim consigo hospedar nele o meu banco de dados e 14 códigos em PHP. A conexão é estável, bem melhor que o meu notebook, que não é um servidor e usa o ngrok e a Claro, e só funciona quando não preciso. Mas ontem eu queria me aventurar mais, eu queria ver se era possível instalar o Laravel 10. O projeto inicial do Laravel vem com 9.000 arquivos e para arrumar tudo isso são necessários dois programas: o Composer e npm. Não é fácil usar esses programas no notebook, e muito menos na hospedagem. Apanhei muito para instalar o Composer no Hostinger. Já o npm foi bem mais difícil, mas no final do dia eu encontrei um tutorial: How to host a Node.js app on shared host | by Mayomi Ayandiran | Medium. Tentei ver os vídeos do YouTube bem como eu vi o manual do Laravel, mas eu não consegui aprender nada. Assim, usei o famoso método da tentativa e erro. Primeiro, eu zipei um Laravel 10 que tinha no meu notebook, e mandei o zip para o Hostinger, e lá descompactei. Na hora de entrar no projeto, eu recebi a mensagem 403, ou seja, eu não tenho autorização para entrar. Para resolver esse problema, eu fiquei imaginando se o PHP e o Laravel não é a mesma coisa. Então eu criei um arquivo chamado index.php com o comando echo "olá mundo!", e assim consegui entrar na pasta onde estava o Laravel, mas essa gambiarra não funcionou para entrar no Laravel. Então, eu decidi jogar o projeto fora, como eu faço no meu notebook. Mas no Hostinger, as coisas são diferentes. O Hostinger perguntou se eu tinha certeza que eu queria jogar o projeto fora, eu respondi sim, mas para a minha surpresa o Hostinger também jogou fora o banco de dados que estava vinculado no projeto. Esse é o grande problema do método da tentativa e erro, a gente só aprende depois de muita surra.
  9. Frank K Hosaka

    Tuning

    Ah, consegui achar o erro. Esqueci de fazer a prova dos nove! <?php for($i=1000;$i<=9999;$i++){ $j=intval($i/100); $k=intval(($i/100-$j)*100); $l=($j+$k)**2; if($l==$i){echo "$i => $j $k => ( $j + $k)**2= $l <br>";} if($l>$i){$i=(intval($i/100)+1)*100;if($i>9999){exit;}} } // resultado: 2025 => 20 25 => ( 20 + 25)**2= 2025 3025 => 30 25 => ( 30 + 25)**2= 3025 9801 => 98 1 => ( 98 + 1)**2= 9801
  10. Frank K Hosaka

    Tuning

    No fórum do DevMedia surgiu uma questão que queria todos os números dentro do intervalo 1000 a 9999 que pudesse satisfazer essa equação: AABB = (AA + BB)**2 O meu conhecimento em matemática é precário, o máximo que consegui resolver foi equação do 2o. grau com uma incógnita e mesmo assim quase repeti de ano. Então, usei o PHP e achei três soluções: <?php for($i=1000;$i<=9999;$i++){ $i=intval($i); $j=intval($i/100); $k=intval(($i/100-$j)*100); $l=($j+$k)**2; if($l==$i){echo "$i => $j $k => ( $j + $k)**2= $l <br>";} } // resultado: 2025 => 20 25 => ( 20 + 25)**2= 2025 3025 => 30 25 => ( 30 + 25)**2= 3025 9801 => 98 1 => ( 98 + 1)**2= 9801 Mas o rapaz disse que existe um outro método chamado tuning. Pesquisei no Google, e eu vi que tem algo a ver com a lentidão no banco de dados. Ou seja, eu preciso otimizar o programa para evitar o superaquecimento do processador. Então, fiz uma pequena alteração no programa, mas, para o meu azar, o novo programa encontrou 9 resultados. <?php for($i=1000;$i<=9999;$i++){ $j=intval($i/100); $k=intval(($i/100-$j)*100); $l=($j+$k)**2; if($l>$i){$i=(intval($i/100)+1)*100;if($i>9999){exit;}} if($l==$i){echo "$i => $j $k => ( $j + $k)**2= $l <br>";} } // resultado: 1600 => 15 25 => ( 15 + 25)**2= 1600 2025 => 20 25 => ( 20 + 25)**2= 2025 2500 => 24 26 => ( 24 + 26)**2= 2500 3025 => 30 25 => ( 30 + 25)**2= 3025 3600 => 35 25 => ( 35 + 25)**2= 3600 4900 => 48 22 => ( 48 + 22)**2= 4900 6400 => 63 17 => ( 63 + 17)**2= 6400 8100 => 80 10 => ( 80 + 10)**2= 8100 9801 => 98 1 => ( 98 + 1)**2= 9801 O algorítimo é o mesmo, a única diferença é que no segundo programa o processador trabalha menos, e isso não faz o menor sentido. Ou eu fiz uma tremenda besteira que não estou conseguindo enxergar?
  11. Encontrei o Biehl no fórum iMasters, e ele queria saber como salvar a ordem dos menus. Eu não sabia que era possível alterar a posição dos menus, mas o Biehl deixou o código JavaScript que faz essa mágica. Como eu tenho mais conhecimento na área de banco de dados, eu decidi ajudá-lo: <?php // tab_menu (menu_id, menu_nome, menu_order) $ggCon=new mysqli("localhost","root","","astudy"); if(!isset($_POST['recordsArray'])){goto inicio;} else { $VGT_posicoes=$_POST['recordsArray']; foreach ($VGT_posicoes as $menu_order => $menu_nome) { mysqli_query($ggCon, "update tab_menu set menu_order=$menu_order where menu_nome='$menu_nome'");}} inicio:?> <form method=post> <table id=table style=border:1> <?php $sqlVF = mysqli_query($ggCon, "SELECT * FROM tab_menu ORDER BY menu_order ASC"); while($linha = mysqli_fetch_array($sqlVF)){ $menu_id= $linha['menu_id']; $menu_nome= $linha['menu_nome']; $menu_order= $linha['menu_order']; echo "<tr><td><input id='recordsArray_$menu_id' name=recordsArray[] value='$menu_nome' onclick=getSelectedRow()>";} ?> </table> <input type=submit value=Salvar> </form> <button onclick="upNdown('up');">&ShortUpArrow;</button> <script> function getSelectedRow(){ for(var i = 1; i < table.rows.length; i++){ table.rows[i].onclick = function(){ if(typeof index !== "undefined"){ table.rows[index].classList.toggle("selected");} index = this.rowIndex; this.classList.toggle("selected");};}} function upNdown(direction){ rows = table.rows parent = rows[index].parentNode if(direction === "up"){ if(index!=0){parent.insertBefore(rows[index],rows[index - 1]);index--;}}} </script>
  12. CSS ainda é coisa nova para mim, eu estou no nível básico, ou seja, vou usando na base da tentativa e erro.
  13. Depois de três anos, finalmente consegui fazer um orçamento em JavaScript. O programa está incompleto, ele busca o produto pelo código, quando o correto é pela descrição. Ele não calcula o total do item e nem o total do orçamento. É um programa bem incompleto, mas pelo menos eu consegui fazer a metade do programa. A minha estimativa é que vou ter 100% do programa em 2026. <?php // tbprod (codprod,un,prod,custo,marg,codbar,loc,emb,cf,codforn,updated_at,created_at) $mysqli=new mysqli("localhost","root","","astudy"); $query=$mysqli->query("select * from tbprod"); $rows=$query->fetch_all(MYSQLI_ASSOC); $jrows=json_encode($rows); ?> <script> produtos=<?=$jrows?>; function ver(codprod){ prod=produtos.filter(function(produtos){return produtos.codprod == codprod}); inptcod.value=prod[0].prod preço.value=prod[0].custo qt.focus()} function fim(){ texto="<tr><td>"+inptcod.value+"<td>"+qt.value+"<td>"+preço.value linha.insertAdjacentHTML('beforebegin',texto) inptcod.value="" qt.value="" preço.value="" inptcod.focus()} </script> <table><th>Produto<th>Qt<th>Preço <tr id=linha><td><input id=inptcod onchange=ver(inptcod.value) placeholder="codigo do produto"> <td><input id=qt onchange=fim()> <td><input id=preço>
  14. Obrigado pela sirene. O site é bem grande, lamento por não poder ajudar. O css que trabalha com o webkit afeta muita coisa, e eu não tenho nenhuma ideia de como isolar, só posso desejar sorte e persevarança.
  15. <?php // no diretório /wamp64/www/astudy, usei o comando composer require mpdf/mpdf require_once __DIR__.'/vendor/autoload.php'; $mpdf=new \Mpdf\Mpdf(); $mysqli=new mysqli("localhost","root","","astudy"); $query=$mysqli->query("select * from tbprod limit 5"); $mpdf->WriteHTML('<table>'); while($row=$query->fetch_assoc()){ $mpdf->WriteHTML('<tr><td>'.$row['prod']); $mpdf->WriteHTML('<td align=right>'.$row['custo']);} $mpdf->WriteHTML('</table>'); $mpdf->Output(); Tentei usar o Bootstrap, mas não consegui.
  16. Foi por puro acidente que descobri que é possível usar a tela de consulta como a tela de atualização. Tudo que é preciso é de um formulário com um input. O problema é que a tela de consulta sempre apresentava os primeiros cinco itens da tabela de produtos. Eu precisava dar um jeito de manter o mesmo critério da consulta. Por exemplo, se eu estou atualizando o endereço do bacalhau na Geladeira n. 12 (abreviado em g12), eu gostaria que a consulta apresentasse o bacalhau novamente, agora com o endereço correto. Para resolver esse problema, eu usei a variável global $_SESSION, assim: <style> form{margin:0} .camufla {border:0;background:transparent} </style> <?php session_start(); $mysqli=new mysqli("localhost","root","","astudy"); if(isset($_GET['procurar'])){ $filtro="where prod like '%".$_GET['procurar']."%'"; $_SESSION['filtro']=$filtro;} else {$filtro="limit 5";} if(isset($_GET['local'])){ $local=$_GET['local']; $codprod=$_GET['codprod']; $query2=$mysqli->query("update tbprod set loc='$local' where codprod=$codprod"); $filtro=$_SESSION['filtro'];} $query=$mysqli->query("select * from tbprod $filtro"); echo "<form><input name=procurar></form>"; echo "<table><th>Produto<th>Local"; while($row=$query->fetch_assoc()){ echo "<form>"; echo "<tr><td>".$row['prod']."<td>"; echo "<input type=hidden name=codprod value=".$row['codprod'].">"; echo "<input size=2 name=local class=camufla value='".$row['loc']."'>"; echo "</form>";}
  17. Falei besteira no final da mensagem anterior. Eu disse que o route do tutorial estava mais legível, mas não está não. Eu tentei colocar o view('theme') depois do Auth::routes( ); mas isso não mudou em nada. Não sei exatamente para que serve a instrução Auth::routes( ). Para bloquear o acesso ao view('theme') eu tive que mudar o route e criar um controller para essa função, assim: routes/web.php <?php use Illuminate\Support\Facades\Route; Auth::routes(); Route::get('/', [App\Http\Controllers\TesteController::class,'theme']); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); app/Http/Controllers/TesteController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TesteController extends Controller { public function __construct(){$this->middleware('auth');} public function theme(){return view('theme');}} Hoje, eu aprendi como barrar o usuário. Tudo indica que a function __construct( ) tem prioridade maior do que a função que foi originalmente chamada, se ele estiver dentro da mesma classe.
  18. Hoje, encontrei uma dica no Google, que me ensinou a usar o MySQL. É possível editar a descrição diretamente no MySQL através do comando: update tabela set descricao=replace(descricao,"stringvelha","stringnova"); Isso é bem mais fácil que apelar para o PHP ou o Laravel.
  19. Ah, desculpe, entendi tudo errado. Acabei de fazer a pesquisa no Google e aprendi que responsivo é adequar o código HTML que seja legível na tela de um PC, de um tablete, de um smartphone. Eu acabei atrapalhando você, peço desculpas. Por enquanto, só sei usar o CSS estático. O Bootstrap tem recursos bem avançados que calculam a dimensão da tela do cliente e usa o cálculo para melhor apresentar a informação de acordo com a dimensão. Eu ainda não cheguei lá. No momento, só estou montando um projeto que se adapte na tela do celular, mas não estou conseguindo.
  20. O manual oficial do Laravel 10 começa apresentando o projeto Chirps ou o Kit Start, ambos instalam o Breeze no projeto, ele é um "facilitador" que loga, valida, cadastra novo usuário ou exclui o usuário. O problema é entender a gramática do blade.php, ele usa o estilo da Tailwind, e como eu não estou familiarizado com esse estilo, não sei o que posso mexer. Estou mais familiarizado com o estilo do Bootstrap. Por exemplo, para azular um texto eu faço assim <td class=text-primary>, pelo menos eu acho bem fácil consultar o Bootstrap na internet. Para usar o Bootstrap no meu projeto, eu criei um link dentro do menu.blade.php que é usado em todo o projeto. Ontem, no entanto, eu encontrei um tutorial, ensinando a instalar o Bootstrap no Laravel 9. O endereço dele é esse: https://www.itsolutionstuff.com/post/how-to-install-bootstrap-in-laravelexample.html Esse tutorial não funciona no Laravel 10. Eu criei um projeto chamado laravel no diretório downloads, esses foram os comandos que eu usei: cd downloads composer create-project laravel/laravel cd laravel composer require laravel/ui php artisan ui bootstrap php artisan ui bootstrap --auth npm install npm run build No tutorial, ele não diz para você mudar de diretório na linha de comando, depois que você cria o projeto. Ele também usa a gramática "npm run production", coisa que não funciona na versão que eu tenho. Com o que eu aprendi ontem, acredito que o "npm run dev" atualiza o navegador de tempo em tempo, já o "npm run build" obriga você a atualizar a tela do navegador, se você quiser ver o resultado das modificações que fez no código. Outra coisa que não funciona no tutorial é o theme.blade.php, eu tive que mudar assim: <!doctype html> <html> <head> <!-- Scripts --> <!--script src="{{ asset('js/app.js') }}" defer></script --> <!-- Styles --> <!-- link href="{{ asset('css/app.css') }}" rel="stylesheet" --> @vite(['resources/sass/app.scss', 'resources/js/app.js']) </head> <body> <p class="h1 text-primary">This is example from ItSolutionStuff.com</p> </body> </html> Ou seja, eu comentei os links, e introduzi um novo comando Blade @vite, principalmente porque não tem nada dentro do arquivo 'css/app.css'. O tutorial não explica como rodar o theme.blade.php - eu criei esse arquivo na pasta views, e alterei o routes/web.php assim: <?php use Illuminate\Support\Facades\Route; Route::get('/', function () {return view('theme');}); Auth::routes(); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Pelo menos a gramática do route não é tão assustador quanto o que aparece no projeto Chirps ou na hora de instalar o Breeze. Pelo que eu entendi nesse código, qualquer usuário pode ver a página theme, mas para ver os demais, primeiro o usuário precisa ser cadastrado.
  21. Eu não consegui instalar o Octane no meu projeto. Você tem um tutorial de como fazer isso?
  22. Ontem, eu estava consertando a tabela de produtos. Tinha muito item com essa descrição "produto pt10", eu mudei para "produto 10 pc". A sintaxe do PHP para fazer essa tarefa é: $novo=str_replace("pt10","10 pc",$descricao); O problema é que esse código não funciona se a descrição tiver "Pt10", "pT10","PT10", assim eu fiz uma sequência de casos, imaginando que uma delas iria funcionar: $novo=str_replace("pt10","10 pc",$descricao); $novo=str_replace("pT10","10 pc",$descricao); $novo=str_replace("Pt10","10 pc",$descricao); $novo=str_replace("PT10","10 pc",$descricao); Na prática, isso não deu certo. Tudo indica que um comando str_replace anula o trabalho de um str_replace anterior. Assim, usei o velho método da tentativa e erro, assim: <?php namespace App\Http\Controllers; use App\Models\tbprod; use Illuminate\Http\Request; class CorrigirController extends Controller { public function inicio(Request $request){ if($request->input('consertar')){ $descricao=$request->input('consertar'); $novo=str_replace("pt10","10 pc",$descricao); if($novo==$descricao){ $novo=str_replace("Pt10","10 pc",$descricao);} if($novo==$descricao){ $novo=str_replace("pT10","10 pc",$descricao);} if($novo==$descricao){ $novo=str_replace("PT10","10 pc",$descricao);} $codprod=$request->input('codprod'); tbprod::where('codprod',$codprod)->update(['prod'=>$novo]); } $itens=tbprod::where('prod','like','%pt10%')->get(); return view('corrigir',compact('itens'));} }
  23. Você pode mostrar como você definiu as variáveis $dadosbanner, $dadosbanner2 e $dadosbanner3? No meu caso eu criei uma classe chamada dadosbanner conforme a listagem mais acima, e $dadosbanner passou a ser uma instância daquela classe. Outra coisa errada que eu vi no código é o <a href="#">, ou seja, os slides não estão amarrados com os links.
  24. Estou começando a estudar. A primeira correção é $dadosbanner3->link3 e $dadosbanner3->img3, o correto é $dadosbanner->link3 e $dadosbanner->img3. A segunda correção é $dadosbanner2->img2 e $dadosbanner2->link_2 para $dadosbanner->img2 e $dadosbanner->img2. A terceira correção: você precisa tirar a vírgula depois de label#img-dot-3. Olha, os únicos erros que eu encontrei foram esses. O seu código é responsivo, tanto no notebook bem como no celular. Para testar o seu código, copiei três imagens na internet e salvei na pasta /img/banner como teste.jpg, teste1.jpg e teste2.jpg, e criei uma classe chamada dadosbanner( ), assim: <?php class dadosbanner { public $img; public $img2; public $img3; public $link_1; public $link_2; public $link_3; public function getImg(){return $this->img;} public function getImg2(){return $this->img2;} public function getImg3(){return $this->img3;} public function getLink1(){return $this->link_1;} public function getLink2(){return $this->link_2;} public function getLink3(){return $this->link_3;}} $dadosbanner=new dadosbanner(); $dadosbanner->img="teste.jpg"; $dadosbanner->img2="teste2.jpg"; $dadosbanner->img3="teste3.jpg"; $dadosbanner->link_1="uol.com.br"; $dadosbanner->link_2="facebook.com"; $dadosbanner->link_3="nyt.com"; ?> <style> .div-slider{width:auto;height: 400px;text-align: center;} .slides-front {padding: 0;width: 980px;height: 370px;display: block;margin: auto; position: relative;} .slides-front * {user-select: none;-ms-user-select: none; -moz-user-select: none;-khtml-user-select: none; -webkit-user-select: none;-webkit-touch-callout: none;} .slides-front input { display: none; } .slide-container { display: block; } .slide {top: 0;opacity: 0;width: 980px;height: 370px; display: block;position: absolute; transform: scale(0); transition: all .7s ease-in-out 0.1s;} .slide img {width: 100%;height: 100%;} .nav label {width: 150px;height: 100%;display: none; position: absolute;opacity: 0;z-index: 9;cursor: pointer; transition: opacity .2s;color: #FFF;font-size: 156pt; text-align: center;line-height: 380px;font-family: "Varela Round", sans-serif; background-color: rgba(255, 255, 255, .3); text-shadow: 0px 0px 15px rgb(119, 119, 119);} .slide:hover + .nav label { opacity: 0.5; } .nav label:hover { opacity: 1; } .nav .next { right: 0; } input:checked + .slide-container .slide { opacity: 1;transform: scale(1); transition: opacity 1s ease-in-out 0.1s;} input:checked + .slide-container .nav label { display: block; } .nav-dots {width: 100%;bottom: 9px;height: 11px;display: block; position: relative;text-align: center;} .nav-dots .nav-dot {top: 375px;width: 11px; height: 11px;margin: 0 4px;position: relative; border-radius: 100%;display: inline-block; background-color: rgba(0, 0, 0, 0.6);} .nav-dots .nav-dot:hover { cursor: pointer;background-color: rgba(0, 0, 0, 0.8);} input#img-1:checked ~ .nav-dots label#img-dot-1, input#img-2:checked ~ .nav-dots label#img-dot-2, input#img-3:checked ~ .nav-dots label#img-dot-3 { background: rgba(0, 0, 0, 0.8);} </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="div-slider"> <ul class="slides-front"> <input type="radio" name="radio-btn" id="img-1" checked=""> <li class="slide-container"> <div class="slide"> <div class="mg-b-10" align="center"><a href="#" class="view_data" id="<?php print $dadosbanner->link_1;?>"><img src="img/banner/<?php echo $dadosbanner->img;?>" class="img-fluid" /></a></div> </div> <div class="nav"> <label for="img-3" class="prev">‹</label> <label for="img-2" class="next">›</label> </div> </li> <input type="radio" name="radio-btn" id="img-2"> <li class="slide-container"> <div class="slide "> <div class="mg-b-10" align="center"><a href="#" class="view_data" id="<?php print $dadosbanner->link_2;?>"><img src="img/banner/<?php echo $dadosbanner->img2;?>" class="img-fluid" /></a></div> </div> <div class="nav"> <label for="img-1" class="prev">‹</label> <label for="img-3" class="next">›</label> </div> </li> <input type="radio" name="radio-btn" id="img-3"> <li class="slide-container"> <div class="slide"> <div class="mg-b-10" align="center"><a href="#" class="view_data" id="<?php print $dadosbanner->link_3;?>"><img src="img/banner/<?php echo $dadosbanner->img3;?>" class="img-fluid" /></a></div> </div> <div class="nav"> <label for="img-2" class="prev">‹</label> <label for="img-1" class="next">›</label> </div> </li> </ul> </div> <script> $(document).ready(function(){ var slids = $(".div-slider [type=radio]"); // busca os radios na div var slids_len = slids.length; // conta o número de radios var intervalo = 2; // intervalo em segundos function rodar(){ var slids_ativo = $(".div-slider [type=radio]:checked") .attr("id") .match(/\d+/)[0]; // pega o valor numérico do id do radio checado if(slids_ativo == slids_len) slids_ativo = 0; // se estiver no último slide, volta pro primeiro slids.eq(slids_ativo).prop("checked", true); // checa o radio da vez } var tempo = setInterval(rodar, intervalo*1000); // inicia o temporizador $(".div-slider").hover( function(){ // função quando entra o mouse clearInterval(tempo); // cancela o temporizador }, function(){ // função quando retira o mouse tempo = setInterval(rodar, intervalo*1000); // reinicia o temporizador } ); }); </script>
×
×
  • Criar Novo...