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. Comigo esse código traz tudo em ordem alfábetica.
  2. Faz quase duas semanas que eu encontrei um valor nulo no banco de dados, onde eu não esperava. No PHP, eu tinha o seguinte código: $vendido=date('Y-m-d'); $horavenda=date('Y-m-d H:i'); $query=$mysqli("update tbpedido set vendido='$vendido', 'horavenda'=$horavenda" where ped=2023); Não há como passar um valor nulo nessas condições. Depois de duas semanas, é que eu lembrei que o meu irmão tem acesso ao meu projeto Laravel, que basicamente é um xerox do projeto PHP. Mas não é. No controller eu encontrei isso: $vendido=date('Y-m-d H:i'); tbpedido::where('ped',2023)->update(['vendido'=>$vendido]); Ou seja, no Laravel eu esqueci de definir o valor da hora da venda, e foi assim que o banco de dados ficou com o valor nulo. Outro erro bastante grave é o princípio da atomicidade. Data da venda e hora da venda é a mesma coisa no mundo do banco de dados, não há porque ter dois campos para mostrar o mesmo valor. Para separar data da hora, isso dá para fazer com o comando: data da venda = date('d/m/Y',strtotime($vendido)) e hora da venda = date('H:i',strtotime($vendido)). Mesmo assim, estou contente por ter encontrado um erro em apenas duas semanas. Geralmente eu gastava vários meses.
  3. Ontem, eu recebi uma mensagem de erro nesse código: <?php $pedidos=[["id"=>1,"total"=>2.00,"data"=>"2023-07-27"], ["id"=>2,"total"=>10.00,"data"=>null], ["id"=>3,"total"=>5.00,"data"=>"2023-07-27"]]; echo "relatório de orçamentos <br><table><th>Pedido<th>Total<th>Data"; foreach($pedidos as $pedido){ echo "<tr><td>".$pedido['id']."<td>".$pedido['total']. "<td>".date('d/m/y',strtotime($pedido['data']));} // Deprecated: strtotime(): Passing null to parameter #1 ($datetime) // of type string is deprecated in C:\wamp64\www\astudy\index.php on line 8 Não descobri como apareceu o valor null na variável data. Para contornar o problema, eu tentei usar try {$dia=date('d/m/y',strtotime($pedido['data']));} catch (Exception $e){$dia="problema";} Não deu certo, a tela ficou com outras mensagens de erro. Assim, eu fiz outra gambiarra: <?php $pedidos=[["id"=>1,"total"=>2.00,"data"=>"2023-07-27"], ["id"=>2,"total"=>10.00,"data"=>null], ["id"=>3,"total"=>5.00,"data"=>"2023-07-27"]]; echo "relatório de orçamentos <br><table><th>Pedido<th>Total<th>Data"; foreach($pedidos as $pedido){ if($pedido['data']!==null){ $dia=date('d/m/y',strtotime($pedido['data']));} else { $dia="problema";} echo "<tr><td>".$pedido['id']."<td>".$pedido['total']. "<td>$dia";} e o relatório vai aparecer no final dessa mensagem. Ou seja, eu cai na segunda lei de Murphy, onde "a pressa é a inimiga da programação".
  4. <?php $texto='{"parentesco":"mãe","apelido":"moça"}'; $jtexto=json_decode($texto); // só funciona se o json for válido echo $jtexto->parentesco."<br>"; // mãe echo $jtexto->apelido; // moça $novo_texto = preg_replace(array("/(á|à|ã|â|ä)/","/(Á|À|Ã|Â|Ä)/","/(é|è|ê|ë)/", "/(É|È|Ê|Ë)/","/(í|ì|î|ï)/","/(Í|Ì|Î|Ï)/","/(ó|ò|õ|ô|ö)/","/(Ó|Ò|Õ|Ô|Ö)/", "/(ú|ù|û|ü)/","/(Ú|Ù|Û|Ü)/","/(não)/","/(não)/"), explode(" ","a A e E i I o O u U n N"),$texto); echo $novo_texto; // {"parentesco":"mae","apelido":"moça"} Note que não foi tirado o cedilha da moça. Eu fiz isso de propósito, para você entender a função preg_replace do PHP
  5. Hahahaha... eu li um pouco sobre API e tudo indica que esse recurso é para quem usa a hospedagem com o WordPress, onde você pode baixar o WP-CLI, e acessar os dados do site Word-Press, sem precisar usar o navegador. O meu plano é de pobre. Não dá para brincar com o Laravel e nem tem API nenhuma. O único jeito é rezar para você encontrar alguém aqui que ganha mais de R$ 1.320,00 por mês e que tenha experiência com Word Press e também tenha disposição para ajudá-lo. Milagre é difícil de acontecer, mas sempre existe uma possibilidade. Enquanto isso, use o seu domínio para compartilhar o PHP, pelo menos é isso que eu faço.
  6. Hahahaha... agora, consegui ver onde está o problema. Eu nunca usei uma API no hospedeiro. Eu não tenho nenhuma experiência nessa área. Eu lembro que apanhei muito quando estudei JavaScript, foi quase um ano apanhando, até aprender a montar um código em PHP que devolvesse os dados em json para o JavaScript jogar na tela. Eu desconfio que o raciocínio é o mesmo. O problema é ver quem manda as informações para o API ou ver como ele chega lá, se é que chega.
  7. Eu também sou novato na hospedagem. Eu queria usar o Laravel, mas eu não posso usar o comando npm na hospedagem tipo site do Hostinger. Quanto ao PHP, eu nunca tive problema. A minha sugestão agora é mudar o teste.php, assim: <?php $mysqli=new mysqli("localhost","userNameNoDominio","SenhaNoDominio","NomeDoBancoDeDadosNoDominio"); $query=$mysqli->query("select * from users"); $rows=$query->fetch_all(); var_dump($rows); e boa sorte, mas o mais importante é ver se você consegue abrir o banco de dados sem a ajuda do PHP, na rotina do gerenciador de banco de dados do hospedeiro.
  8. Esse é o código do teste.blade.php, onde uso o dialeto do Blade (o botão Modal) e o dialeto do Tailwinds (o modal na forma do título do texto): @vite(['resources/css/app.css', 'resources/js/app.js']) <pre class="w-1/2 mx-auto my-20"> O embaixador da União Europeia no Brasil, Ignacio Ybañez, refuta a ideia apresentada pelo presidente Luiz Inácio Lula da Silva de que democracia seja um conceito relativo. Ele faz questão de criticar a ditadura da Venezuela, aliada do governo brasileiro. “Para nós, a democracia não é relativa. Democracia existe ou não existe. Na Venezuela, não existe democracia. No Brasil, existe”, afirma o diplomata em entrevista à Coluna. “Eleições e o respeito aos direitos humanos são elementos essenciais na democracia. E isso não é cumprido na Venezuela”. </pre> <x-primary-button class="absolute left-80 ml-6" onclick="modal.className='absolute top-10 left-80 ml-6 bg-blue-700'"> {{ __('Modal') }} </x-primary-button> <div id=modal class=hidden onclick="modal.className='hidden'"> <h1 class=text-3xl>Democracia relativa</h1> </div> Esse é um código que eu consegui na base da tentativa e erro, eu queria alinhar o título do texto com o texto, mas o máximo que o Tailwind permitia era deslocar o título a 80 pixels a partir da margem esquerda ("left-80"). Para conseguir mais pixels, eu fiz uma gambiarra, eu usei o recurso margem esquerda assim "ml-6". Mas para isso funcionar, eu preciso usar o comando npm run dev ou npm run build, o que eu consigo fazer aqui no meu computador local. Esse não é o caso lá no Hostinger, a hospedagem do site que aluguei por R$ 23,00 por mês não permite usar o comando npm. Logo, o máximo que eu consegui hospedar no Hostinger foi um Laravel bem básico, ou seja, ele não tem o Breeze, o Blade do Breeze e muito menos o projeto Chirp. O meu Laravel no Hostinger é basicamente um xerox do projeto que eu fiz no PHP. Eu coloquei o CDN do Bootstrap no arquivo menu.php e carrego esse arquivo nos outros códigos. Para resolver o meu problema, eu só preciso mudar de plano, mudar para a hospedagem VPS. Eu não tenho a menor ideia de como o VPS funciona. Uma coisa é digitar npm aqui no computador local e outra bem diferente é digitar o comando lá no servidor. Antes de mudar de plano, estou estudando o Tailwind por aqui, até eu me sentir 2% seguro com um novo dialeto do CSS.
  9. Vamos por parte. Crie um arquivo chamado teste.php no diretório c:/wamp64/www, e escreva somente "olá mundo", e salve o arquivo se você não usar o VS Code. Vá no navegador, e escreva localhost/teste.php - você ainda vê error 500?
  10. Estudei o Codeigniter e para fazer a sua tarefa, comecei pelo MySQL, mudei ele assim: CREATE TABLE `vendas` ( `id` int NOT NULL AUTO_INCREMENT, `data` date DEFAULT NULL, `venda` float DEFAULT NULL, `forma_de_pagamento` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO `vendas` VALUES (37,'2023-07-01',15,'Dinheiro'),(38,'2023-07-02',10,'Dinheiro'), (39,'2023-07-03',25,'Dinheiro'),(40,'2023-07-04',25,'Cartão de Débito'), (41,'2023-07-05',20,'Cartão de Débito'),(42,'2023-07-06',40,'Cartão de Débito'), (43,'2023-07-07',20,'Cartão de Crédito'),(44,'2023-07-07',20,'Cartão de Crédito'), (45,'2023-07-08',20,'Cartão de Crédito'); e o Codeigniter ficou assim: app > Config > Routes.php ... use App\Controllers\Vendas; $routes->get('vendas',[Vendas::class,'index']); app > Controllers > Vendas.php <?php namespace App\Controllers; use App\Models\venda_model; class Vendas extends BaseController { public function index(){ $model=model(venda_model::class); $data=['vendas'=>$model->getVendas('2023-07')]; return view('vendas',$data);} } app > Models > venda_model.php <?php namespace App\Models; use CodeIgniter\Model; class venda_model extends Model { protected $table='vendas'; public function getVendas($data_agora){ return $this->select('sum(venda) as somavenda') ->select('forma_de_pagamento') ->where('data >=', "$data_agora-01") ->where('data <=', "$data_agora-31") ->groupBy('forma_de_pagamento')->findAll();} } app > Views > vendas.php <h1>Relatório de Vendas</h1> <table><th>Forma de Pagamento<th>Venda <?php foreach($vendas as $venda){ ?> <tr><td><?=$venda['forma_de_pagamento']?><td><?=$venda['somavenda']?> <?php } ?> E ele ficou assim:
  11. Eu pedi ajuda no Laracasts, e um rapaz me orientou a ler sobre Join no MySQL. Assim ao invés de fazer três consultas, dá para fazer tudo com apenas uma consulta, assim: select a.dia, a.lcto, a.contad, a.contac, a.valor, a.hist, b.descricao as descd, c.descricao as descc from tbdiario a join tbconta b on a.contad = b.conta join tbconta c on a.contac = c.conta order by docto limit 10
  12. Eu estudei um pouco de HTML no w3schools, e lá aprendi que muitos elementos do HTML têm o atributo title, e com ele é possível ver uma notificação, quando você passa o mouse sobre o elemento; pensando nisso, eu criei o seguinte código em PHP: <meta name="viewport" content="width=device-width, initial-scale=1.0"> <?php // tbdiario (docto,lcto,dia,contad,contac,valor,hist) // tbconta (conta,descricao) $mysqli=new mysqli("localhost","root","","laravel"); $query=$mysqli->query("select * from tbdiario limit 10"); $rows=$query->fetch_all(MYSQLI_ASSOC); echo "<table><th>Lcto<th>Débito<th>Crédito<th>Valor"; foreach($rows as $row){ $dia=$row['dia'];$lcto=$row['lcto'];$debito=$row['contad']; $credito=$row['contac'];$valor=$row['valor'];$hist=$row['hist']; $query2=$mysqli->query("select descricao from tbconta where conta=$debito"); $descD=$query2->fetch_assoc()['descricao']; $query3=$mysqli->query("select descricao from tbconta where conta=$credito"); $descC=$query3->fetch_assoc()['descricao']; echo "<tr><td title='$dia'>$lcto <td title='$descD'>$debito <td title='$descC'>$credito <td title='$hist'>$valor";} No notebook o programa funciona. Mas na hora de testar no celular, eu levei um susto, eu recebi a mensagem de que o Apache não permite o meu celular acessar a rede local. Eu fui lá no httpd-vhosts, e alterei a redação de 'Require local' para 'Require all granted'. Mesmo com acesso local, o meu S Pen do Note 10 (ele é um celular bem antigo e não é dobrável) não conseguiu fazer as notificações aparecerem. Eu encontrei um mouse com porta USB-C, mas as notificações não apareceram no celular. A Samsung está vendendo o ZFold4 por R$ 11.000,00 - já imaginou eu comprar um trem desse, e as notificações não aparecerem por lá? Mudando de assunto, note que no meu código tem três consultas no MySQL. Eu gosto do PHP devido a essa versatilidade, você não precisa se preocupar com "chave externa", "relacionamento" e "referência integral", ou seja, você pode fazer o que você quiser com o MySQL dentro do PHP. O problema é quando aparecer uma vaga na turma do MySQL e o examinador pedir para mostrar a conta devedora e a conta credora com as suas respectivas descrições. Eu não tenho a menor ideia de como fazer isso.
  13. Que coisa boa! Encontrei um tópico no fórum Laracasts que me ensinou como usar o Collections do Laravel: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbdiario; use App\Models\tbsupervariavel; use Auth; class DiarioController extends Controller { public function extrato(Request $request) { if($request->input('dia')){ tbsupervariavel::where('codsuper',Auth::id())->update(['dia'=>$request->input('dia')]);} $dia=tbsupervariavel::where('codsuper',Auth::id())->value('dia'); $extrato=tbdiario::where('dia',$dia)->get(); $somad=$extrato->sum(function($ext){if($ext->contad){return $ext->valor;}}); $somac=$extrato->sum(function($ext){if($ext->contac){return $ext->valor;}}); return view('diario',compact('extrato'),['somad'=>$somad,'somac'=>$somac]);} }
  14. Em 2020 comecei a estudar o PHP, e lá eu conheci o mysqli que o PHP usa para trabalhar com o banco de dados do MySQL. Em 2022 comecei a estudar o Laravel, e lá eu conheci o Eloquent, ele faz a mesma coisa que o mysqli do PHP mas usa uma gramática bem mais robusta, uma verdadeira obra de arte. O problema é: quantas vezes eu posso usar o mysqli ou o Eloquent? Como eu apanho muito para trabalhar com vetores, eu pedi para o mysqli ou o Eloquent olhar três vezes o banco de dados, uma vez para consultar os lançamentos do dia, outra vez para somar os débitos daquele dia e mais uma vez para consultar a soma dos créditos daquele dia. Eu acordei de madrugada, e decidi estudar os vetores do PHP, e lá vi array_sum, array_filter, array_column. Foram várias tentativas e erros e nenhuma deu certo, mas finalmente consegui achar uma solução: <?php // tbdiario (docto,lcto,dia,contad,contac,valor,historico) // docto : auto_increment, primary_key $mysqli=new mysqli("localhost","root","","laravel"); $query=$mysqli->query("select * from tbdiario where dia='2023-07-22'"); $extrato=$query->fetch_all(MYSQLI_ASSOC); $debito=[]; $credito=[]; foreach($extrato as $key=>$sub){ if($sub['contad']){$debito[]=$sub['valor'];} if($sub['contac']){$credito[]=$sub['valor'];}} var_dump(array_sum($debito),array_sum($credito)); E no Laravel, ficou assim: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbdiario; use App\Models\tbsupervariavel; use Auth; class DiarioController extends Controller { public function extrato(Request $request) { if($request->input('dia')){ tbsupervariavel::where('codsuper',Auth::id())->update(['dia'=>$request->input('dia')]);} $dia=tbsupervariavel::where('codsuper',Auth::id())->value('dia'); $extrato=tbdiario::where('dia',$dia)->get(); $debito=[]; $credito=[]; foreach($extrato->toArray() as $key=>$sub){ if($sub['contad']){$debito[]=$sub['valor'];} if($sub['contac']){$credito[]=$sub['valor'];}} $somad=array_sum($debito); $somac=array_sum($credito); return view('diario',compact('extrato'),['somad'=>$somad,'somac'=>$somac]);} } Se alguém sugerir usar a função soma no Collections do Laravel, eu tentei por dois anos e não consegui.
  15. Dessa vez deu certo! Consegui colocar o Teste3 debaixo da barra de navegação, o código completo do Teste3 segue adiante, o nome do arquivo é diario.blade.php, onde também consegui encontrar a classe "ps-5" do dialeto TailwindCSS, e com ele consegui afastar a coluna Valor da coluna Histórico que estava muito grudada um do outro. <x-app-layout> <script>mensagem.innerHTML="Lançamentos do dia {{$extrato[0]->dia}}"</script> <table class="w-1/2 mx-auto"> <th class="text-left">Lçto<th colspan=2 class=text-left>Contas <th>Valor<th class="text-left ps-5">Histórico @foreach($extrato as $lcto) <tr class="even:bg-white"><td>{{$lcto->lcto}} <td>{{$lcto->contad}}<td>{{$lcto->contac}} <td class="text-right">{{$lcto->valor}} <td class=ps-5>{{$lcto->hist}} @endforeach </table> </x-app-layout>
  16. O meu primeiro teste não deu certo. O meu erro é que eu não vi que haviam dois itens na primeira linha. Tive que fazer a conversão Laravel -> PHP e consegui esse código: <script src="https://cdn.tailwindcss.com"></script> <div class="min-h-screen bg-gray-100"> <nav class="w-1/2 h-10 mx-auto bg-white border-b border-gray-100"> <div class="flex justify-between h-10"> <div>Teste1a</div> <div>Teste1b</div> </div> <div id=mensagem class="bg-gray-300">Teste2</div> </nav> Teste3 </div> Para colocar o Teste3 debaixo do Teste2, tirei o "h-10" do TailwindCSS do <nav>. Vamos ver se dessa vez vai dar certo lá no Laravel.
  17. O portal do Laravel oferece o projeto Chirps com dois dialetos, o Blade e o Inertia. O Inertia é para quem domina o JavaScript com o dialeto do Vue ou React, e o Blade é para quem não domina nada, esse é o meu caso. Eu montei um código onde escrevi Teste1, Teste2 e Teste3. Eu esperava que um viesse debaixo do outro, mas no final o Teste3 ficou na mesma altura do Teste2. A pergunta mais óbvia é: como compartilhar o meu problema com o Script Brasil? A minha única saída foi transformar os arquivos layouts>app.blade.php e layouts>navigation.blade.php e transformar o meu problema em socorro.php: <script src="https://cdn.tailwindcss.com"></script> <div class="min-h-screen bg-gray-100"> <nav class="w-1/2 h-10 mx-auto bg-white border-b border-gray-100"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="flex justify-between h-10"> Teste1 </div> </div> <div id=mensagem class="bg-gray-300">Teste2</div> </nav> Teste3 Consegui reduzir o problema em apenas dois: o HTML e o dialeto TailwindCSS. Como eu não domino nenhum dos dois, usei o famoso método da tentativa e erro, ou seja, eu tirei o marcador <div> mais próximo do Teste1. E assim consegui colocar o Teste3 debaixo do Teste2, isso no PHP. Espero conseguir o mesmo resultado lá no Laravel.
  18. Eu coloquei os seguintes dados na master_table (id,tipo_peca,valor_defeito,tipo_defeito,classifica): (1,1,1,1),(2,2,2,2),(3,3,3,3) e o nível de defeito deu -178%,5% e 225%, e o JavaScript desenhou um monte de triângulos. O primeiro problema é a tabela. Vamos supor que a fábrica produz 1000 parafusos redondos e 1000 parafusos quadrados, e o pessoal do Controle e Qualidade encontrou 999 parafusos redondos com defeito mais 999 parafusos quadrados com defeitos, e eles classificaram 998 parafusos redondos como inúteis e 997 parafusos quadrados como inúteis, 1 parafuso redondo como recuperável e 2 parafusos quadrados como recuperáveis. Como colocar essa informação na tabela? Mesmo com tantos parafusos com tantos defeitos, o maior nível de defeito é 100%, logo essa equação tem problema: $defeitoLevel = (($row['nc_count']) / $row['total'] - $row['na_count']) * 0.025 + (($row['pc_count']) / $row['total'] - $row['na_count']) * 0.75 + (($row['fc_count']) / $row['total'] - $row['na_count']) * 1; $defeitoColor = ''; if ($defeitoLevel >= 0 && $defeitoLevel <= 0.3) {$defeitoColor = '#f5b7b1';} elseif ($defeitoLevel > 0.3 && $defeitoLevel <= 0.6) {$defeitoColor = ' #f7dc6f';} elseif ($defeitoLevel > 0.6 && $defeitoLevel <= 0.85) {$defeitoColor = '#58d68d';} elseif ($defeitoLevel > 0.85 && $defeitoLevel <= 1) {$defeitoColor = '#5dade2';} Tem um erro de digitação nesse código, você escreveu $defeitoNivel ao invés de $defeitoColor logo na primeira linha. Essa equação também é utilizada para alimentar os dados no JavaScript. Para testar o seu código, eu fiz algumas simplificações: <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <?php $conn=new mysqli("localhost","root","","laravel"); $sql="SELECT tipo_peca, COUNT(valor_defeito) AS total, SUM(CASE WHEN classifica = 1 THEN valor_defeito ELSE 0 END) AS na_count, SUM(CASE WHEN classifica = 2 THEN valor_defeito ELSE 0 END) AS nc_count, SUM(CASE WHEN classifica = 3 THEN valor_defeito ELSE 0 END) AS pc_count, SUM(CASE WHEN classifica = 4 THEN valor_defeito ELSE 0 END) AS fc_count FROM master_table GROUP BY tipo_defeito"; $result = $conn->query($sql); ?> <main> <h1>Dashboard</h1> <?php if ($result->num_rows > 0) { echo "<table> <th>Tipo_peca<th>Total<th>NaoAplica<th>Minimo<th>Grande<th>Inutilizável<th>Nível-%"; while ($row = $result->fetch_assoc()) { $defeitoLevel = (($row['nc_count']) / $row['total'] - $row['na_count']) * 0.025 + (($row['pc_count']) / $row['total'] - $row['na_count']) * 0.75 + (($row['fc_count']) / $row['total'] - $row['na_count']) * 1; $defeitoColor = ''; if ($defeitoLevel >= 0 && $defeitoLevel <= 0.3) {$defeitoColor = '#f5b7b1';} elseif ($defeitoLevel > 0.3 && $defeitoLevel <= 0.6) {$defeitoColor = ' #f7dc6f';} elseif ($defeitoLevel > 0.6 && $defeitoLevel <= 0.85) {$defeitoColor = '#58d68d';} elseif ($defeitoLevel > 0.85 && $defeitoLevel <= 1) {$defeitoColor = '#5dade2';} $defeitoLevel = round($defeitoLevel * 100); echo "<tr><td>" . $row['tipo_peca'] . " <td>" . $row['total'] . " <td>" . $row['na_count'] . " <td>" . $row['nc_count'] . " <td>" . $row['pc_count'] . " <td>" . $row['fc_count'] . " <td style='background-color: $defeitoColor; text-align: center;'>" . $defeitoLevel . "%";} echo "</table>";} else {echo "Nenhum registro encontrado";} $conn->close();?> <canvas id="radarChart"></canvas> <script> labels = [ <?php $result->data_seek(0); while ($row = $result->fetch_assoc()) { echo "'" . $row['tipo_peca'] . "',";} ?> ]; data = {labels: labels, datasets: [{label: 'Defeito Level', data: [ <?php $result->data_seek(0); while ($row = $result->fetch_assoc()) { $complianceLevel = (($row['nc_count']) / $row['total'] - $row['na_count']) * 0.025 + (($row['pc_count']) / $row['total'] - $row['na_count']) * 0.75 + (($row['fc_count']) / $row['total'] - $row['na_count']) * 1; echo $defeitoLevel . ",";} ?> ], backgroundColor: 'rgba(179, 181, 198, 0.2)', borderColor: 'rgba(179, 181, 198, 1)', pointBackgroundColor: 'rgba(179, 181, 198, 1)', pointBorderColor: "#fff", pointHoverBackgroundColor: "#fff", borderWidth: 8}]}; options = {scale: {angleLines: {color: 'black'}, ticks: {display: true,beginAtZero: true,min: 0,max: 100}}, plugins: {title: {display: true,text: 'Defeito Level', font: {size: 18}}}} ctx = document.getElementById('radarChart').getContext('2d'); new Chart(ctx, {type: 'radar',data: data,options: options}); </script>
  19. No ano passado, eu desisti de usar o <input list>. Ele é um dos recursos mais bacanas do HTML, mas eu não sabia como diferenciar a opção do que foi escolhido com o que foi digitado. Vamos supor que no banco de dados eu tenho limao e limão, mas o safado do usuário colocava laranja. Todo o meu código ficava travado, tudo porque a laranja não estava previsto no banco de dados, e assim não havia como fazer o orçamento. Hoje eu tive a brilhante ideia de como contornar o safado do usuário, eu coloquei um espaço na lista de opções. Agora eu sei quando o usuário escolheu uma opção ou inventou coisa que não foi previsto: <script> function ver(value){ escolhido.value="";digitado.value="" if(value[0]==" "){escolhido.value=value} else {digitado.value=value} ipfruta.value=""} </script> <?php $bd=["limão"=>2,"limao"=>1]; ?> <input list=fruta id=ipfruta onchange=ver(value)> <datalist id=fruta> <?php foreach($bd as $key=>$value){ echo "<option value=' $key $value'>";} ?> </datalist> <p>Escolhido<input id=escolhido></p> <p>Digitado<input id=digitado></p>
  20. Eu não consigo capturar a tela do Windows, eu queria mostrar todas as extensões necessárias para o PHP abrir o banco de dados, pelo menos eu sei que o pdo-mysql e o mysqli tem que estar selecionado. No Wampserve eu clico no ícone, vou em PHP, e de lá vejo as extensões. Ah lembrei que eu tenho um celular:
  21. Eu uso WampServe. Para acessar o banco de dados MySQL, eu uso MySQL Workbench ou o PhpMyAdmin. Você não consegue acessar nem pelo PhpMyAdmin?
  22. Hoje eu pedi ajuda para o Bard para escrever 'olá mundo' pelo CodeIgniter, mas o exemplo que ele apresentou apresenta uma nova classe com uma nova gramática que não tenho no projeto atual. Ainda não conheço nenhum dialeto do CodeIgniter. O mesmo problema enfrentei com o Laravel, até a semana passada eu só conhecia o dialeto blade. Nessa semana eu conheci o dialeto Inertia. O código que Bard mostrou para mim foi esse <?php if (!defined('BASEPATH')) { exit('No direct script access allowed');} class Home extends CI_Controller { public function index() { $this->load->view('welcome_message');} } Esse código não funciona no meu projeto do CodeIgniter, pois eu não tenho a classe CI_Controller, mas eu achei bacana a redação "$this->load->view()". A minha esperança é um dia escrever um código semelhante, o máximo que eu consegui até agora é escrever "return 'olá mundo'";
  23. Foi no fórum DevMedia é que vi um comentário sobre o Codeigniter (CodeIgniter4 User Guide — CodeIgniter 4.3.6 documentation) e assim descobri que em 2020 foi criado um novo framework para o PHP. Enquanto o Laravel ocupa 115 mb, já o CodeIgniter só ocupa 17 mb. É um framework ultraleve. Mas o tutorial é pouco amigável. Eu usei o pouco que eu sei de PHP e Laravel para testar o CodeIgniter. Eu fui na pasta C:/wamp64/www e lá executei o comando composer create-project codeigniter4/appstarter codeigniter. Para testar no navegador, eu usei esse comando localhost/codeigniter/public - isso vai forçar o WampServe abrir o arquivo index.php que está nessa pasta.
  24. Ontem eu vi o projeto Chirp do Laravel, mas dessa vez eu usei o caminho do Inertia/Vue, ele é completamente diferente do Blade, mas ambos terminam com a sofisticada rotina de notificação. O Chirp tem muita coisa para ensinar, e o máximo que eu consegui aprender é pegar as informações do <form> e mandar direto para o banco de dados para acrescentar ou editar. O Chirp tenta ensinar a autenticar e validar os dados, isso eu ainda não aprendi, mas o projeto Chirp é muito bacana, onde só você pode acrescentar, editar ou deletar as mensagens que são suas. A dos outros, você não pode fazer nada disso. Eu não consegui testar a rotina de notificação, pois ele pede para conectar o PHP no serviço de email, e isso eu ainda não sei fazer. O máximo que eu consegui com o PHP foi colocar o orçamento na tela do navegador. Agora estou pensando em pedir para o PHP transformar as informações da tela do navegador em pdf, pegar o número do celular do cliente e o mandar o pdf pelo WhatsApp. Alguém aqui já viu alguém tentando fazer essa mágica com o PHP ou Laravel?
×
×
  • Criar Novo...