Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.622
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Pela mensagens que você recebeu, quem não está chegando é o arquivo que foi selecionado. Para ajudar melhor, preciso do código load.php, login.php, e do formulário que chama profilePhoto.php
  2. Ontem eu vi pela internet o pregão 110/2024 no Diário Oficial de Diadema de 30/10/2024, é uma espécie de uma relação onde constam o nome de uma empresa (havia mais de uma empresa), o item, a quantidade e o preço unitário. Só que não havia o total de cada item e nem o total de tudo. Pedi ajuda para o PHP: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <div class="container mt-5"> <?php $arquivo="pregao_110_2024.txt"; $previa=fopen($arquivo,'r'); $pregao=fread($previa,filesize($arquivo)); fclose($previa); $itens=explode("Item",$pregao); $soma=0; foreach($itens as $item) { $partes=preg_split('/\. Qtd/',$item); preg_match('/Qtd\.: (\d+)\s*/', $item, $matchQtd); preg_match('/Vlr Unit\.: R\$ ([\d,]+)/', $item, $matchVlr); if(count($matchQtd)) { $qt=$matchQtd[1]; $preço=str_replace(['.',','],['','.'],$matchVlr[1]); echo "$partes[0] $qt x $preço = ".$qt*$preço."<br>" ; $soma +=$qt*$preço; } } echo "<br>Total Geral R$ " . number_format($soma,2,',','.') . "</div>";
  3. arquivo index.php <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <title>Calendário Simples</title> <script src="https://cdn.jsdelivr.net/npm/fullcalendar/index.global.min.js"></script> </head> <body> <div id="calendar" class='container mt-5'></div> <script> document.addEventListener('DOMContentLoaded', function() { var calendarEl = document.getElementById('calendar'); var calendar = new FullCalendar.Calendar(calendarEl, { locale: 'pt-br', buttonText: {today:'hoje',month:'mês',week:'semana',day:'dia'}, contentHeight:500, initialView: 'dayGridMonth', events: 'getEvents.php' }); calendar.render(); }); </script> </body> </html> arquivo getEvents.php <?php // mysql atividades(id int,title varchar,start datetime,end datetime) // (1,Escovar dente,2024-10-29 19:15:00,2024-10-29 19:20:00) // (2,Lavar prato,2024-10-30 07:01:00,2024-10-30 07:01:00) $conn=new PDO("mysql:host=localhost;dbname=teste","root",""); $stm=$conn->prepare("SELECT * FROM atividades ORDER BY id"); $stm->execute(); echo json_encode($stm->fetchAll(PDO::FETCH_ASSOC)); ?>
  4. Frank K Hosaka

    erro

    Esse não foi o meu caso, encontrei nesse endereço um código CodeIgnitor que apresentou o mesmo tipo de erro: https://github.com/cploutarchou/codeIgniter-menu-manager Segui o conselho do Copilot, e fui colocando uma variável publica em cada arquivo que o PHP reclamava que estava depreciado. Foi um trabalho de quase 15 minutos, e finalmente depois de 5 anos é que eu consegui executar um código PHP do Github aqui no meu notebook. Obrigado!
  5. Frank K Hosaka

    erro

    Para saber exatamente o que está acontecendo, eu precisaria no mínimo a listagem dos arquivos Loader.php, Template.php, Client.php e index.php, mas tudo indica que você atualizou o PHP para uma nova versão e muitas vezes a nova versão não dá suporte ao comando que havia no projeto. Já o Copilot acredita que o problema é exatamente a atualização do PHP para a versão 8.2 e isso afetou o CodeIgniter. Ele aconselha a fazer o quanto segue:
  6. Estou estudando JavaScript para iniciantes com a ajuda do monitor de 30 polegadas. Para botar o manual na tela, eu uso o navegador e o endereço ler.amazon.com.br. O JavaScript é bacana! Comecei a aprender a usar a função addEventListener. O autor tem razão, o único jeito de aprender alguma coisa é só fazendo os exercícios que o livro propõe. Agora estou estudando formulários. O problema é que o autor não usa CSS, pelo menos até onde eu li o manual. Assim, eu tomei a iniciativa de incluir o CDN do Bootstrap 5.3.3. Finalmente eu consegui criar uma moldura para o formulário! A classe form-control pode ser usado tanto no <input> bem como no próprio <form> Para tirar o formulário do canto esquerdo, basta usar um <div class="container">. Olha só que bacana: arquivo index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <title>Manipulando Campos</title> <script> document.addEventListener('DOMContentLoaded', function() { meuFormulario.addEventListener('submit',function(event) { mensagem="" event.preventDefault() if(nome.value=="") { mensagem='o Nome não pode estar vazio\n' } if(!email.value.includes('@') || !email.value.includes('.')) { mensagem=mensagem+'email inválido\n' } if(mensagem!=="") { alert(mensagem) } }) }) </script> </head> <body> <div class="container mt-5 w-25"> <form id="meuFormulario" class="form-control"> <label for="nome" class="form-label">Nome:</label> <input id="nome" name="nome" class="form-control"> <p></p> <label for="email" class="form-label">Email:</label> <input id="email" name="email" class="form-control"> <p></p> <input type="checkbox" id="meuCheckBox" name="meuCheckBox" class="form-check-input"> <label for="meuCheckBox" class="form-check-label">Aceito os termos</label> <p></p> <label for="meuSelect" class="form-label">Escolha uma opção:</label> <select id="meuSelect" name="meuSelect" class="form-select"> <option value="opcao1">Opção 1</option> <option value="opcao2">Opção 2</option> <option value="opcao3">Opção 3</option> </select> <p></p> <input type="submit" class="btn btn-primary"> </form> </div> </body> </html>
  7. Acho que você não está usando o meu código. O código que eu passei é auto-sustentável, ele não precisa de outros arquivos para funcionar. Caso você esteja tentando adaptar, eu posso ajudar mais se você me passar o código load.php e login.php. Se preferir, você pode zipar todo o projeto e mandar para o meu email frankhosaka@gmail.com
  8. Eu modifiquei o profilePhoto2.php, ele usa vários comandos que foram definidos em load.php e login.php, mas você não listou esses códigos aqui. Assim, a minha saída foi improvisar e criei um código que nem precisa do Ajax: ** atenção, aqui eu defini o diretório da minha pasta Astudy, não usei a sua estrutura de arquivos. O objetivo aqui é apresentar o conceito. <?php class Login { static function isLoggedIn() { return 14; } } $userid = Login::isLoggedIn(); if(isset($_FILES['file'])) { $imgName = $_FILES['file']['name']; $file = $_FILES['file']; $upload_dir = $_SERVER['DOCUMENT_ROOT']."/Astudy/".$userid."/profilePhoto/"; if(!file_exists($upload_dir ) && !is_dir($upload_dir )) { mkdir($upload_dir , 0777, true); } $upload_file = $upload_dir . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $upload_file)) { echo "Sucesso!"; } else { echo 'Erro ao salvar o arquivo.'; } } ?> <form method=post enctype=multipart/form-data> <input type="file" name="file"> <input type=submit> </form>
  9. A imagem não está na raiz do user, ele está na pasta user/profilePhoto. Quanto ao id, vou estudar o seu novo código, e retorno em seguida. Se tiver segundo turno na sua cidade, aconselho a votar agora, senão você vai acabar esquecendo do candidato que você escolheu. Até daqui a pouco.
  10. Eu sou novo no JavaScript, mesmo assim, eu acredito que o problema é lá no arquivo profilePhoto.php, deve ser ele que está duplicando os arquivos. Eu fiz um teste aqui, usando a pasta Astudy e dentro dele criei a pasta profilePhoto, usando um código HTML e outro PHP, ele não usa o código do usuário para renomear os arquivos, mas ele funciona. Espero que esses códigos ajudem você a montar o projeto do jeito que você espera: arquivo index.php <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>Upload de Arquivo com AJAX</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> </head> <body> <input type="file" id="file-upload"> <button id="upload-btn">Enviar Arquivo</button> <img id="uploaded-img" src="" alt="Imagem enviada"> <script> $(document).ready(function() { $('#upload-btn').click(function() { var file_data = $('#file-upload').prop('files')[0]; var form_data = new FormData(); form_data.append('file', file_data); $.ajax({ url: 'upload.php', // URL do script PHP para salvar o arquivo type: 'POST', data: form_data, contentType: false, processData: false, success: function(response) { $('#uploaded-img').attr('src', response); alert('Upload realizado com sucesso!'); }, error: function() { alert('Erro no upload do arquivo.'); } }); }); }); </script> </body> </html> arquivo upload.php <?php if (isset($_FILES['file'])) { $file = $_FILES['file']; $upload_dir = 'profilePhoto/'; $upload_file = $upload_dir . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $upload_file)) { echo $upload_file; // Retorna o caminho da imagem salva } else { echo 'Erro ao salvar o arquivo.'; } } else { echo 'Nenhum arquivo enviado.'; } ?>
  11. Encontrei a solução. Ao invés de quebrar a cabeça com o <thead>, eu fui trabalhar no <th> e deu certo! <table class='table table-hover table-sm'> <tr> <th class='bg-dark text-white border border-white'>Data Cadastro <th class='bg-dark text-white border border-white'>Posto Emissor <th class='bg-dark text-white border border-white'>Tipo Especialidade <th class='bg-dark text-white border border-white'>Especialidade <th class='bg-dark text-white border border-white'>Peso <th class='bg-dark text-white border border-white'>Altura <th class='bg-dark text-white border border-white'>Urgente <th class='bg-dark text-white border border-white'>Ação </table>
  12. Durante muito tempo, o Bootstrat tinha uma classe "thead-dark" que escurecia o cabeçalho de uma tabela, até chegar o 5.3.3. Agora a classe "thead-dark" não funciona. O 5.3.3 disse que inventou um novo atributo data-bs-theme="dark", ele funciona para toda <table>, mas não funciona para o <thead>. O único jeito é usar o antigo CSS convencional, mas ele só funciona se você não usar o Bootstrap na <table>. Isso explica porque muitos desenvolvedores vivem tristes, a vida deles é só cinza e lágrimas: <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>Exemplo de Tabela com Bootstrap</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> </head> <body> <table class="table"> <thead data-bs-theme="dark"> <tr><th>Nome</th></tr> </thead> <tbody> <tr><td>João</td></tr> </tbody> </table> <table> <thead style="background-color: #343a40; color: white;"> <tr><th>Nome</th></tr> </thead> <tbody> <tr><td>João</td></tr> </tbody> </table> </body> </html>
  13. Gostei desse trabalho! Eu aprendi bastante com ele. Pensei que era possível separar as consultas, mas não consegui o resultado desejado, as tabelas precisam ser ajuntadas mesmo. Gostaria de sugerir a seguinte nomenclatura nos campos das tabelas, ao invés de posto (id_posto,apelido_posto) o melhor é posto(id,apelido). Acrescentar um sufixo com o nome da tabela é redundante. Finalmente, a minha nova sugestão, preservando a sua estrutura de tabela: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <?php /* mysql guia (id_guia,dt_cadastro_guia,id_tipo,id_atend,id_paciente,peso_guia,alt_guia,urg_guia,id_posto) (1,2024-10-25,1,1,1,60,1.6,1,1)(2,2024-10-25,2,1,1,60,1.6,1,1)(3,2024-10-25,3,1,1,60,1.6,1,1) tipo_atend (id_tipo,nome_tipo)(1,Exame)(2,Consulta)(3,Procedimento) atend (id_atend,nome_atend)(1,Dr House) posto (id_posto,apelido_posto) (1,UBS Centro) paciente (id_paciente,nome_paciente)(1,Frank) */ $conn=new mysqli("localhost","root","","teste"); if(!isset($_GET['id'])) { ?> <div class='h-25'></div> <form class='form-control w-25 m-auto'> Digite o id do Paciente <p> <input name=id class=control> <p> <input type=submit class=control> </form> <?php exit; } $id = $_GET['id']; $previa=$conn->query("select * from guia g inner join paciente pac on pac.id_paciente = g.id_paciente inner join posto p on p.id_posto = g.id_posto inner join tipo_atend t on t.id_tipo = g.id_tipo inner join atend a on a.id_atend = g.id_atend where pac.id_paciente=$id"); if (!$previa->num_rows) { ?> <div class="w-50 m-auto"> <label class="mt-5 text-danger h3"> Nenhum paciente encontrado com o id <?=$id?>! </label> </div> <?php } else { $guia=$previa->fetch_all(MYSQLI_ASSOC); ?> <div class="container mt-5"> <div class="title"> <h3>Paciente <?=$guia[0]['id_paciente']." ".$guia[0]['nome_paciente']?></h3> </div> <table class='table table-hover table-sm'> <tr> <th class='bg-dark text-white border border-white'>Data Cadastro <th class='bg-dark text-white border border-white'>Posto Emissor <th class='bg-dark text-white border border-white'>Tipo Especialidade <th class='bg-dark text-white border border-white'>Especialidade <th class='bg-dark text-white border border-white'>Peso <th class='bg-dark text-white border border-white'>Altura <th class='bg-dark text-white border border-white'>Urgente <th class='bg-dark text-white border border-white'>Ação <?php foreach($guia as $guia): /* rotina a ser usada onde? $date = new DateTime($dt_cadastro=$linha['dt_cadastro_guia'] ); $interval = $date->diff( new DateTime( date('Y-m-d') ) ); */ ?> <tr> <td><?=$guia['dt_cadastro_guia']?> <td><?=$guia['apelido_posto']?> <td><?=$guia['nome_tipo']?> <td><?=$guia['nome_atend']?> <td><?=$guia['peso_guia']?> <td><?=$guia['alt_guia']?> <td><?=$guia['urg_guia']?> <td><a href="edtPaciente.php?id=<?=$guia['id_guia']?>">Editar</a> | <a href=pesqGuia.php>Guias</a> <?php endforeach; echo '</table></div>'; } ?>
  14. Raramente eu usei a função getElementById nos meus códigos de JavaScript, mas encontrei um caso particular em que ele é necessário: <!DOCTYPE html> <html> <head> <title>Exemplo DOM</title> <script> document.addEventListener('DOMContentLoaded',function() { let heading=document.getElementById('main-heading') heading.textContent="Olá mundo" }) </script> </head> <body> <h1 id="main-heading">Título Principal</h1> </body> </html> Se não fosse pelo hífen no id do marcador <h1> dava para dispensar a função getElementById.
  15. O problema está justamente no momento em que você pegou o nome do paciente no primeiro registro, restando apenas as outras guias para serem listadas. Para resolver isso, defini o $nome como o conjunto de todos os registros. Para pegar o nome do paciente, usei $nome[0]['nome_paciente'], onde [0] é o primeiro registro. Olhando o resultado final, eu senti uma falta danada do número da guia na relação. Ao invés de usar while, eu usei foreach: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <?php $conn=new mysqli("localhost","root","","teste"); if(!isset($_GET['id'])) { ?> <form> Digite o id do Paciente <input name=id> <input type=submit> </form> <?php exit; } $id = $_GET['id']; $result_guias = "SELECT pac.id_paciente, p.id_posto, t.id_tipo, a.id_atend, g.id_guia, pac.nome_paciente, p.apelido_posto, t.nome_tipo, a.nome_atend, g.dt_cadastro_guia, g.peso_guia, g.alt_guia, g.urg_guia FROM guia g INNER JOIN paciente pac ON pac.id_paciente = g.id_paciente INNER JOIN posto p ON p.id_posto = g.id_posto INNER JOIN tipo_atend t ON t.id_tipo = g.id_tipo INNER JOIN atend a ON a.id_atend = g.id_atend WHERE pac.id_paciente = '$id'"; $resultado_guias = mysqli_query($conn, $result_guias); $nome = $resultado_guias->fetch_all(MYSQLI_ASSOC); if (mysqli_num_rows($resultado_guias) == 0){ echo "<div class='form col-sm-4 offset-1'> <label style='padding-left:100px; margin-top:20px; color:red; font-size:20px'>Nenhuma guia encontrada!</label> </div>"; }else{ echo ' <div class="container" id="contcadPaciente"> <div class="title" id="divTitulo"> <h3>'.$_GET['id'].'</h3> <br> <h3>'.$nome[0]['nome_paciente'].'</h3> <br> </div> <div class="container"> <table class="table table-hover table-sm" id="tabela"> <thead class="thead-dark"> <tr> <th scope="col-sm-1" style="text-align: center; width:30px; color:#003893; font-size:12px">Data Cadastro</th> <th scope="col-sm-2" style="text-align: center; width:80px; color:#003893; font-size:12px">Posto Emissor</th> <th scope="col-sm-3" style="text-align: center; width:100px; width:100px; color:#003893; font-size:12px">Tipo Especialidade</th> <th scope="col-sm-3" style="text-align: center; width:100px; width:50px; color:#003893; font-size:12px">Especialidade</th> <th scope="col-sm-1" style="text-align: center; width:20px; color:#003893; font-size:12px">Peso</th> <th scope="col-sm-1" style="text-align: center; width:20px; color:#003893; font-size:12px">Altura</th> <th scope="col-sm-1" style="text-align: center; width:20px; color:#003893; font-size:12px">Urgente</th> <th scope="col-sm-1" style="text-align: center; color:#003893; font-size:12px">Ação</th> </tr> </thead>'; foreach($nome as $linha){ $date = new DateTime($dt_cadastro=$linha['dt_cadastro_guia'] ); $interval = $date->diff( new DateTime( date('Y-m-d') ) ); echo' <tbody class="" id="tbl_guia"> <tr> <td scope="row" style="text-align: center; width:30px; font-size:10px; color:#003893">'. $dt_cadastro = $linha['dt_cadastro_guia'].'</td> <td scope="row" style="text-align: center; width:80px; font-size:10px; color:#003893">'.$id_posto = $linha['apelido_posto'].'</td> <td scope="row" style="text-align: center; text-transform:uppercase; width:100px; font-size:10px; color:#003893">'.$id_tipo = $linha['nome_tipo'].'</td> <td scope="row" style="text-align: center; text-transform:uppercase; width:50px; font-size:10px; color:#003893">'.$id_atend = $linha['nome_atend'].'</td> <td scope="row" style="text-align: center; text-transform:uppercase; width:20px; font-size:10px; color:#003893">'.$peso = $linha['peso_guia'].'</td> <td scope="row" style="text-align: center; text-transform:uppercase; width:20px; font-size:10px; color:#003893">'.$alt = $linha['alt_guia'].'</td> <td scope="row" style="text-align: center; text-transform:uppercase; width:50px; font-size:10px; color:#003893">'.$urg = $linha['urg_guia'].'</td> <td width="15%" style="text-align: center; color:#003893; font-size:10px"><a href=edtPaciente.php?id='.$linha['id_guia'].'>Editar</a> | <a href=pesqGuia.php?id='.$linha['id_guia'].'>Guias</a> </tr> </tbody>'; } echo '</table>'; } ?>
  16. Depois que terminei de publicar a mensagem abaixo é que eu vi o erro, o problema é esse código: $estado=(isset($_GET['e'])) ? $_GET['e'] : "SP"; Eu escrevi "SP" e você escreveu "". Você precisa dar um jeito de definir o estado que você quer paginar através desse código: <li><a href="?pagina=<?=$pagina?>&e=<?=$estado?>"><?=$pagina?></a> Ou seja, não basta solicitar a página seguinte, você precisa informar ao PHP qual o estado com que você está trabalhando. ==================== Desconsiderar o código abaixo, ele está 100% errado == Testei o seu código, ele funciona. Eu não conhecia os métodos do mysqli que você usou, eu pensei que fosse PDO. Para testar o seu código, eu simplifiquei assim: <?php // mysql cidades(id int pk nn ai,nome varchar,uf varchar) // (1,Diadema,SP)(2,São Paulo,SP)(3,S Bernardo do Campo,SP) // (4,Mauá,SP)(5,Campinas,SP)(6,Jundiaí,SP) $conn=new mysqli("localhost","root","","teste"); $estado=(isset($_GET['e'])) ? $_GET['e'] : "SP"; $stmt=$conn->prepare("select * from cidades where uf=?"); $stmt->bind_Param("i",$estado); $stmt->execute(); $result=$stmt->get_result(); $porPagina=3; $totalRegistros= mysqli_num_rows($result); $totalPaginas = ceil($totalRegistros / $porPagina); $paginaAtual = isset($_GET['pagina']) ? $_GET['pagina'] : 1; $indicePrimeiroRegistro = ($paginaAtual - 1) * $porPagina; $resultadosPaginados = "SELECT * FROM cidades WHERE uf = ? ORDER BY nome ASC LIMIT $indicePrimeiroRegistro, $porPagina"; $stmt = $conn->prepare($resultadosPaginados); $stmt->bind_param('i', $estado); $stmt->execute(); $cidades = $stmt->get_result(); ?> <table> <tr><th>ID<th>Cidade do Estado de <?=$estado?><th>Opções <?php foreach($cidades as $cidade): ?> <tr><td><?=$cidade['id']?> <td><?=$cidade['nome']?> <td><a href=explodir.php>Explodir</a> <?php endforeach; ?> </table> <ul> <?php for ($pagina = 1; $pagina <= $totalPaginas; $pagina++) : ?> <li><a href="?pagina=<?=$pagina?>"><?=$pagina?></a> <?php endfor; ?> </ul>
  17. Usar JavaScript com PHP é uma coisa, mas com o Laravel é bem diferente. Precisei trabalhar com um marcador diferente para a rotina funcionar: <meta name="csrf-token" content="{{ csrf_token() }}"> os principais códigos são esses: arquivo resources > views > teste.blade.php @include('menuView') <meta name="csrf-token" content="{{ csrf_token() }}"> <script> function teste(codprod,custoAtual) { let csrfToken = document.querySelector('meta[name="csrf-token"]'). getAttribute('content'); let xmlhttp = new XMLHttpRequest(); let url = "estoqueTeste"; let formData = new FormData(); formData.append('codprod', codprod); formData.append('custoAtual',custoAtual); xmlhttp.open("POST", url, true); xmlhttp.setRequestHeader('X-CSRF-TOKEN', csrfToken); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { alert("custo atual é " + xmlhttp.responseText); } else if (xmlhttp.readyState == 4) { console.error("Erro: " + xmlhttp.statusText); } }; xmlhttp.send(formData); } </script> <p> Código do Produto <input id=codprod value=74> <p> Custo Atual <input id=custoAtual value=20> <p><input type=submit onclick=teste(codprod.value,custoAtual.value)> arquivo routes > web.php <?php Route::post('estoqueTeste',[Estoque::class,'teste']); Route::view('teste','teste'); arquivo app > Http > Controllers > Estoque.php <?php Class Estoque { function teste(Request $request) { tbprod::where('codprod',$request->codprod)->update(['custo'=>$request->custoAtual]); return tbprod::where('codprod',$request->codprod)->value('custo'); } }
  18. Estudando o JavaScript para iniciantes, percebi que usei errado o código nos últimos cinco anos. O JavaScript usa a palavra var ou let dentro de uma função para tornar a variável local, mas graças à minha preguiça de digitar eu sempre acabei criando uma variável global. Isso tem sérias implicações: <?php function variavel() { global $a, $b; $a=1; $b=2; } variavel(); echo $a; echo $b; ?> <script> function variable() { a=1 b=2 } variable() alert(a) alert(b) </script>
  19. Terminei o terceiro capítulo, ele fala de funções, de escopo e de ciclo. O código do escopo deveria apresentar erro, mas não apresentou. O código do ciclo deveria dar certo, mas não deu, enfim o JavaScript é como o PHP e o Laravel, ele funciona quando a temperatura externa está acima de 20o. C. function escopo (num) { if(true) { teste=12 } console.log(teste) } escopo(12) alert(teste) function ciclo() { for(i=1;i=10;i++) { console.log(i) } }
  20. Comprei o livro do Matheu Battist no Amazon.com.br e os dois primeiros capítulos já compensaram os R$ 8,90 que eu investi. Eu aprendi que não preciso criar um código JavaScript para testá-lo. O console do navegador foi inventado para esse propósito. O livro tenta ensinar a separar os códigos por arquivo, e eu achei muito curioso o autor colocar a conexão com o JavaScript na seção <head>. Eu fiz isso, e ele não funcionou. Eu tive que mudar a posição dele, assim: arquivo index.html <!DOCTYPE html> <html> <head> <meta charset="utf8"> <title>Teste JavaScript</title> </head> <body> <button id="myButton">Me Clique</button> </body> <script src="main.js"></script> </html> arquivo main.js myButton.addEventListener('click',function() { alert('Olá mundo!') }) O comando getElementById não funciona se a conexão ou o código JavaScript estiver no topo do HTML, enfim a posição do JavaScript é importante. Nos últimos cinco anos, eu sempre coloquei o código no topo da lista, mas ao invés de usar a função addEventListener, usava outra função. Mas enfim, o que eu mais gostei é que o livro consertou o meu VS Code. Eu fiz tanta baderna com as extensões do PHP e do Laravel que acabei tirando todas as extensões, agora consegui recuperar a facilidade de fazer o código HTML com a extensão IntelliCode (o livro chama erroneamente de Visual Studio IntelliCode). Os dois primeiros capítulos já valem os R$ 8,90 que a Amazon pede.
  21. Desde 1990 é que eu sonho em fazer um programa de orçamento no computador. Já se passaram vários anos, e até hoje eu não consegui. Hoje, o copilot.microsoft.com me ensinou um pouco de matemática e a função do PHP ceil (pegar o inteiro mais alto a partir de um valor em estudo), a equação dele é fantástica! No Basil, temos moeda de R$ 0,10, R$ 0,25, R$ 0,50 e R$ 1,00, não sei como o Haddad consegue passar essas moedas para o povo, uma vez que as agências presenciais são cada vez mais raras, e as que existem se recusam a oferecer trocados para os clientes. Para calcular o preço de venda, eu pensei em usar a função php round($preço,1), onde preço é igual a $custo * 1,1. O valor final da venda se ajusta às moedas disponíveis no Brasil. Por exemplo, limão kg custo 7,99, preço de venda 8,80. O problema é quando o cliente quer apenas 10 gramas do limão, isso dá 0,01 x 8,80 = 0,088 - onde arranjar o troco analógico para isso? Muito mais simples se a lei obrigasse a todos usarem o cartão de débito ou crédito. Pedi para o Copilot ajustar o preço de venda de acordo com a quantidade de tal maneira que o valor final da venda fosse múltiplo de R$ 0,10. Olha só que código bacana: <?php $pdo=new PDO("mysql:host=localhost;dbname=teste","root",""); $prod=$pdo->query("select * from tbprod where prod like '%limao%'") ->fetchAll(PDO::FETCH_OBJ)[0]; // 1 kg limão R$ 7,99 $preço = $prod->custo * 1.1; // 8.789 $preço = round($preço,1); // 8.80 $qt = 0.01; $preçoAjustado=ceil($preço*$qt/0.1)*0.1/$qt; // preçoAjustado = 10.00 echo "<br>$qt x $preçoAjustado = ". $qt * $preçoAjustado; // 0.10 // $qt = 1; $preçoAjustado=ceil($preço*$qt/0.1)*0.1/$qt; // preçoAjustado = 8.80 echo "<br>$qt x $preçoAjustado = ". $qt * $preçoAjustado; // 8.80 // $qt = 0.1; $preçoAjustado=ceil($preço*$qt/0.1)*0.1/$qt; // preçoAjustado = 9.00 echo "<br>$qt x $preçoAjustado = ". $qt * $preçoAjustado; // 0.90 // a função PHP ceil pega o inteiro mais alto do valor em estudo O problema é o Código de Defesa do Consumidor que me obriga a colocar o preço do quilo do limão na frente do balcão. O cliente pode tirar a foto do balcão e mostrar para o delegado o cupom que cobra o preço diferente e mandar eu para a cadeia. Agora eu entendo porque ninguém vende limão no Brasil, e tem um monte de gente querendo ser vereador, prefeito, deputado, senador e até presidente do Brasil.
  22. Eu criei uma session( ) com a chave vetor, mas depois da escolha do usuário, essa chave simplesmente desapareceu. Esse foi um erro bem difícil de achar. O código original era esse: if (count($aux) > 1) { session(['vetor'=> [$codforn, $dia, $qt, $codp, $total, $atual, $lcto]]); foreach ($aux as $x) { echo "<a href=estoqueIncluir?codprod=$x->codprod>$x->codprod $x->prod</a><br>"; } echo "existe mais de um produto com codforn $codforn, escolha um."; exit; } Na hora que o código foi direcionado para a função incluir, a chave vetor simplesmente desapareceu da session( ). Eu fiz uma bateria de teste, e o erro estava na última instrução. Usei o comando exit; Eu nunca tive problema com esse comando, só hoje é que deu esse bode. Para corrigir, eu fiz assim: return "existe mais de um produto com codforn $codforn, escolha um."; O return faz a mesma coisa que o exit, mas hoje eu aprendi que ele não detona o session( ) do Laravel.
  23. A melhor forma de evitar erro de digitação no <input> é usando o <input type=number>, mas eu queria usar o <input> para fazer cálculo, tipo 2,15+0,17, principalmente no Laravel. Com a ajuda do Copilot, cheguei no código a seguir. Note que sempre uso o arquivo index.php, isso é para agilizar o teste. No código a seguir o nome do arquivo é importante porque uso o nome do arquivo para voltar nele mesmo. arquivo index.php <?php if(isset($_GET['numero'])) { echo "resultado= ".$_GET['numero']."<p>"; echo "<input type=submit value='Novo Teste' onclick=location.replace('index.php')>"; exit; } ?> <script> function modificar() { event.preventDefault() numero.value=numero.value.replace(/,/g,'.') if(/^[0-9+\-*/().\s]+$/.test(numero.value)) { numero.value=eval(numero.value) myForm.submit() } else { numero.value="Erro de digitação!" } } </script> <form id=myForm onsubmit=modificar(numero.value)> <input id=numero name=numero autofocus> <p> <input type=submit> </form>
  24. Fazer orçamento na tela é mais ou menos difícil, botar no papel é bem mais complicado. O Eloquent é engenhoso, ele consegue ajuntar as tabelas através de relações definidos no Model. Para pegar essas informações, aí eu tive que improvisar: arquivo app > Models > tbpedido.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Carbon\Carbon; class tbpedido extends Model { use HasFactory; public $timestamps=false; protected $table="tbpedido"; protected $fillable=['ped','dia','vendido']; protected $primaryKey="ped"; function hist() { return $this->hasMany(tbhistped::class, 'ped'); } } arquivo app > Models > tbhistped.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbhistped extends Model { use HasFactory; protected $table="tbhistped"; protected $fillable=['ped','codprod','unitario','subtotal','qt']; const UPDATED_AT=null; const CREATED_AT=null; function produtos() { return $this->belongsTo(tbprod::class, 'codprod'); } } arquivo app > Models > tbprod.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbprod extends Model { use HasFactory; protected $table="tbprod"; const UPDATED_AT=null; const CREATED_AT=null; protected $fillable=['prod','custo','codforn','marg','loc','emb','un','cf','codbar','venda']; protected $primaryKey="codprod"; } arquivo app > Http > Controllers > Controlid.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbpedido; class Controlid { function pedido(Request $request) { $itens=tbpedido::with('hist.produtos')->where('ped',$request->pedido)->get(); $num_rows=count($itens); if($num_rows==0) { return " <script> if(confirm('Não há nada para imprimir')) { location.replace('?Orcamento.inicio.<?=$ped?>') } </script>"; } return view('controlidView',['itens'=>$itens,'ped'=>$request->pedido]); } } arquivo controlidView.blade.php @include('menuView') <table> <tr class=fw-semibold><td colspan=7>Quitanda do Frank <tr class=fw-semibold><td colspan=7>Pedido <?=$ped?> de <?=dbr($itens[0]->dia)?> @foreach($itens as $item) <div style=width:200:word-break:normal> <tr><td colspan=7><?=$item->hist[0]->produtos->prod?></div> <tr><td class=text-end><?=$item->hist[0]->qt?> <td class=text-end><?=$item->hist[0]->produtos->un?> <td>x<td class=text-end><?=dec($item->hist[0]->unitario)?> <td>=<td class=text-end><?=dec($item->hist[0]->subtotal)?> @endforeach <tr class=fw-semibold><td>Total<td><td><td><td><td class=text-end><?=dec($itens[0]->total)?> <tr class=h-2><td>--- </table> <script> cabecalho.style.display='none' window.print() window.onafterprint=function() { location.replace("orcamentoInicio?ped=<?=$ped?>") } </script>
×
×
  • Criar Novo...