Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.211
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Esse é um tema clássico, mas eu não consegui resolver em 2020, quando entrei aqui no Fórum Script Brasil. Eu tenho uma tabela de 2.000 produtos, uma parte representa coisas que eu consumo e outra parte é revenda. Para separar os dois, a alternativa que eu encontrei foi filtrar os produtos que foram registrados de acordo com a classificação contábil da conta estoque. Mas ontem encontrei um debate de como filtrar os produtos por categoria no fórum iMasters. Eu não sei se consegui resolver o problema do rapaz, mas eu gostei da minha solução. Ele usa a função assíncrona do JavaScript, assim: teste.php <script> function java(escolhido){ fetch("pag2.php?categoria="+escolhido) .then(response => {return response.text()}) .then(texto => {mensagem.innerHTML = texto})} </script> <select id=categoria onchange=java(value)> <option>Selecione uma opção</option> <option>Básica</option> <option>Eventual</option> </select> <div id=mensagem style="margin-top:100px"></div> pag2.php <?php $categoria=$_GET['categoria']; if($categoria=="Básica"){ ?> <select> <option>Selecione uma opção</option> <option>Caneta</option> <option>Lápis</option> <option>Borracha</option> </select> <?php } if($categoria=="Eventual"){ ?> <select> <option>Selecione uma opção</option> <option>Baton</option> <option>Preservativo</option> </select> <?php } Esse é um código bem pequeno, mas acho que pode ajudar quem usa a categoria na tabela de produtos.
  2. Eu tentei fazer um código mais simples: <?php class Conexao { private static $pdo; public static function getConnection(){ if(!self::$pdo){ self::$pdo=new pdo("mysql:host=localhost;dbname=laravel","root","");} return self::$pdo;}} try { $Conexao = Conexao::getConnection();var_dump($Conexao); $sql = "INSERT INTO FLE ( FLE_DTHR_CHEGADA ) VALUES ( GETDATE())"; $stmt = $Conexao->prepare($sql); $stmt->execute(); echo "Atualização bem-sucedida";} catch (Exception $e) {echo $e->getMessage();} ?> mas na hora de executar, eu tive essa mensagem: SQLSTATE[42000]: Syntax error or access violation: 1305 FUNCTION laravel.GETDATE does not exist
  3. Boa pergunta, eu sei que ele foi condenado a 20 anos e um mês de cadeia, por ter conseguido burlar vários celulares no apogeu do Lava Jato, mas não consegui o endereço da penitenciária. Desconfio que é Brasília. O trabalho dele é ótimo, ele foi até requisitado pelo presidente anterior e dizem que ele conseguiu criar um ato de prisão para um juiz federal; enfim os melhores programadores estão atrás das grades e os que nem sabem como ligar o computador estão nos fóruns.
  4. Eu usei o método da tentativa e erro. Mudei o nome da pasta a_study para astudy. O Google Chrome consegue abrir localhost/astudy sem nenhum problema, o que não é o caso do Edge que muda o endereço para https://www.localhost/astudy. Tudo indica que se trata de implicância do navegador do Windows 11, logo a melhor solução é limpar o cache dele. O problema é ter que redefinir um monte de privilégios do tipo entrar no Script Brasil sem precisar passar pela sabatina do login, agora feito em quatro etapas além de acertar aqueles quadros de motos, faixa de pedestre e assim vai. Outro meio de fazer a pasta astudy funcionar dentro do Edge foi através do servidor php, eu uso o comando php -S localhost:8000, e no Edge eu consigo entrar na pasta com o comando localhost:8000.
  5. Eu tenho um projeto chamado orçamento no Laravel e no PHP. Apesar dos programas serem quase iguais, a verdade é que tem muitas diferenças que eu queria eliminar. Por exemplo, o Laravel usa datalist na pasta das Views que contém os formulários, e o PHP só tem um botão que conduz o usuário para ir até outra página para pesquisar o produto. Eu coloquei o datalist no PHP, e em menos de meia hora, o meu irmão reclamou que o programa não funciona. Fui lá verificar e não funciona mesmo. O datalist foi criado em 2014. O iPad 1.0 foi criado em 2010, esse equipamento é muito antigo. Eu pedi para o meu irmão jogar fora, mas alega que não tem recurso para comprar um novo. Resultado: vou ter que mexer tanto no projeto em PHP bem como no Laravel, tenho que considerar tanto os equipamentos novos que suportam o <datalist> bem como os mais antigos. Fazer programa para uso próprio é difícil. Fazer programa para terceiros é muito mais difícil.
  6. Não é uma boa ideia colocar todas as classes num só arquivo. O Lúcio sugeriu trabalhar com o endereço absoluto através dessa variável: $path=$_SERVER['DOCUMENT_ROOT'].'/pastaDoProjeto/MVC'; Eu pensei fazer isso através do comando do PHP define, mas a constante desaparece toda vez que você submete um formulário. A sugestão do Barder é de criar o arquivo config.php (onde é definido o path), ela é muito boa, se você precisar criar vários projetos com nomes diferentes. Não é o meu caso. Então decidi trabalhar com o endereço absoluto desde o index.php até cada uma das classes. Nas classes, eu fiz assim: <?php class LoginController { private $path; public function __construct(){ $this->path=$_SERVER['DOCUMENT_ROOT'].'/campbets';} public function login($mensagem=null,$nome=null) { require_once "$this->path/Models/Times.php"; $times=(new Times)->listaTimes(); require_once "$this->path/Views/viewLogin.php";} }
  7. No meu diretório forum, coloquei o arquivo index.php e com ele coloquei dois .jpg, e o código ficou assim: <?php session_start(); if(isset($_POST['totalPaginas'])){ $images=$_SESSION['images']; $totalPaginas=$_POST['totalPaginas']; $pagina=$_POST['pagina']; $pagina++; if($pagina>$totalPaginas){echo "Não tem mais";exit;} goto gambiarra;} ?> <pre> A história de como transformei o meu amigo de infância numa garota </pre> <?php $dir='/wamp64/www/forum'; if (is_dir($dir)) { $images=[]; $files = scandir($dir); foreach ($files as $file) { $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); // Verifica se a extensão corresponde a um formato de imagem comum if (in_array($extension, ['jpg', 'jpeg', 'png', 'gif', 'bmp'])) { $images[]=$file;}}} else { echo "O diretório não existe.";exit;} $_SESSION['images']=$images; $totalPaginas=count($images)-1; $pagina=0; gambiarra: ?> <form method=post> <img src=<?=$images[$pagina]?> width=400 height=400> <input type=hidden name=totalPaginas value=<?=$totalPaginas?>> <input type=hidden name=pagina value=<?=$pagina?>><br><br> <input type=submit value=Próximo> </form>
  8. Eu cansei de ver os tutoriais espalhados na internet e também das sugestões do Bard. Eu estou indignado. Eu sou o único usuário no planeta que não pode escrever "localhost/astudy" no navegador. Agora, para contornar o problema estou escrevendo "localhost/a_study". Claro que dá para resolver isso com um curso de pós graduação de WampServe ou Windows 11, mas a minha meta era estudar o MVC. Assim, a minha saída para estudar o MVC é esquecer os tutoriais. Nada de mexer no .htacess, nada de mexer no Composer, nada de copiar o Router.php do Bard, e nada de criar as pastas Controllers, Models e Views. Assim, tudo o que restou na pasta a_study foi o index.php. Logo, é nele que vou começar o meu segundo código MVC. Todos os tutoriais usam o método POST. Só que eu não consigo enxergar nada no cabeçalho do navegador. Como sou novato no MVC, nada me impede de usar o método GET. Eu consegui colocar algumas classes dentro do index.php, mas eu não consegui criar uma classe que simulasse um formulário em HTML. Tentei fazer assim: classe viewLogin { private $viewLogin; public function __construct() { $this->viewLogin = "<form><input name=nome></form><?=$mensagem?>";} e o PHP reclamou que a variável $mensagem não estava definida. Eu não tive outra escolha senão criar o arquivo viewLogin.php com o HTML correspondente. Dentro do index.php eu não preciso mais usar o comando require_once ou include, eu já vou direto na classe assim: (new LoginController)->login(); E assim, consegui montar o meu segundo arquivo painel.php, ou seja, em menos de duas horas eu consegui o que eu não consegui em todo mês. Mas na medida que o index.php foi expandindo, eu fiquei imaginando como evitar de escrever if(isset($_GET['key'])){...} para cada formulário que eu ia criando, eu queria a um GET para todos os formulários, inclusive um para o próprio index.php que não tem nenhum GET. Olha só como ficou bacana: index.php <?php if($_GET==null){(new LoginController)->login();exit;} switch(key($_GET)){ case 'nome': (new LoginController)->verifica();break; case 'nomeTime': (new Times)->incluir();break; case 'alterarTime': (new Times)->alterar($id,$nome,$email,$senha,$telefone);break; case 'excluirTime' :(new Times)->excluir($id,$nome);break;} class LoginController { public function login($mensagem=null,$nome=null) { $times=(new Times)->listaTimes(); require_once 'viewLogin.php';} public function verifica(){ $nome=$_GET['nome']; $senha=$_GET['senha']; if($nome==' NOVO CADASTRO'){ require_once 'viewTimeCadastrar.php';exit;} if($senha!==(new Times)->senha($nome) || $senha=null){ $times=(new Times)->listaTimes(); $mensagem="Senha não bate!"; require_once 'viewLogin.php';exit;} require_once 'viewPainel.php';}} class Conexao { private $conexao; public function __construct(){ $this->conexao=new mysqli("localhost","root","","u835212901_campbets");} public function consulta($sql) { $query=$this->conexao->query($sql); return $query->fetch_all(MYSQLI_ASSOC);} public function modifica($sql){ return $this->conexao->query($sql);} } class Times { public function incluir(){ $nome=$_GET['nomeTime']; $email=$_GET['email']; $senha=$_GET['senha']; $telefone=$_GET['telefone']; $sql="insert into times (nome,email,senha,telefone) values ('$nome','$email','$senha','$telefone')"; $fetch=(new Conexao)->modifica($sql); $mensagem="Cadastro do time $nome efetuado"; require_once 'viewLogin.php';} public function listaTimes(){ $fetch=(new Conexao)->consulta("select * from times order by nome"); return json_decode(json_encode($fetch));} public function senha($nome){ $fetch=(new Conexao)->consulta("select senha from times where nome='$nome'"); return $fetch[0]['senha'];} public function excluir($id,$time){ (new Conexao)->modifica("delete from times where id=$id"); $mensagem="time $time retirado do banco de dados"; require_once 'viewLogin.php';} public function alterar($id,$nome,$email,$senha,$telefone){ (new Conexao)->modifica("update times set nome=$nome, email=$email, senha=$senha,telefone=$telefone where id=$id"); $mensagem="time $nome atualizado"; require_once 'viewLogin.php';} } class jogadores { public function incluir(){ require_once 'viewCadastrarJogador.php';} public function alterar(){} public function excluir(){} } É óbvio que isso é um péssimo exemplo de programação, mas foi assim que comecei a aprender a usar o PHP em 2020. Tudo na base da tentativa e erro.
  9. Faz duas semanas que tento fazer esse código funcionar, e hoje ele funcionou sem nenhuma explicação. Eu montei os códigos em três arquivos no diretório raiz, são eles: index.php <?php require 'LoginController.php'; (new Login)->contagem(); ======================================= LoginController.php <?php Class Login{ public function contagem($contagem = 0){ $contagem++; require_once 'LoginView.php';} } if(isset($_POST['contagem'])){ $contagem=$_POST['contagem']; (new Login)->contagem($contagem);} ============================================= LoginView.php <form method=post> <h1><?=$contagem?></h1> <input type=hidden name=contagem value='<?=$contagem?>'> <input type=submit> </form>
  10. Eu não vejo como conciliar essa procedure que você passou com a primeira procedure que você apresentou: $sql = $conn->prepare("call procedure (?, ?, ?)"); $sql->bind_param("sss", $conta, $date1, $date2); principalmente o "sss". Pelo que entendi na nova procedure existem 6 tabelas (tabela1, tabela1_historico, tabela2, tabela2_historico), mas todos com os mesmos campos. Tem como passar o exemplo de apenas um único registro, com identificador, col1, ..., col5, data?
  11. O problema é o planejamento. O objetivo é criar palpites que não foram repetidos. Vamos supor que a loteria seja de apenas um número, logo, os possíveis palpites são necessariamente 10: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Mas, na vida real, a Caixa Econômica lhe concede o direito de concorrer com dois palpites, desde que pague um pouco mais. Logo, os palpites podem ser 0,1 - 0,2 - 0,3 - 0,4 - 0,5 - 0,6 - 0,7 - 0,8 - 0,9, depois tem a fila do 1,0, 1,2, 1,3, 1,4 e assim por diante. Só com dois números os palpites são bem grandes. Imagine fazer um programa que trabalha com um palpite que sorteia seis números, mas o apostador pode jogar com até quinze números. Se o jogador pode jogar até 15 palpites, não faz sentido trabalhar com um campo de apenas 6 números, daí porque trabalhei com vetor, ele é bem flexível, ele aumenta e diminui de acordo com as necessidades. Já um banco de dados com 15 campos pré definidos ocupa o mesmo espaço que os vetores, graças à tecnologia do Varchar(), ou seja, os campos também são flexíveis. O problema é que o autor do projeto não quer os palpites não se repitam ao que já foi sorteado. Voltando à nossa primeira loteria, vamos supor que o número sorteado foi 1 no sorteio anterior. Faz sentido eu desconsiderar os palpites 1,0 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 só por que um dois palpites já foi sorteado? E quem é o matemático que afirmou que um número já sorteado não vai se repetir nunca mais?
  12. Hoje decidi trabalhar no arquivo Router.php que o Barder passou para mim. Com ajuda do echo e var_dump, eu consegui fazer a seguinte gambiarra: index.php <?php require_once 'Router.php'; require_once 'HomeController.php'; // o router precisa de todas as classes $router = new Router(); $router->addRoute('/', 'HomeController', 'index'); $uri=$_SERVER['REQUEST_URI']; // $uri='/a_study/' $tamanho=strlen($uri); $uri=substr($uri,8,$tamanho); // $uri="/" $route = $router->getRoute($uri); if ($route) { $controller = $route['controller']; $method = $route['method']; (new $controller)->$method();} ========================================================================== Router.php <?php class Router{ private $routes = []; public function addRoute($url, $controller, $method){ $this->routes[$url] = [ 'controller' => $controller, 'method' => $method,];} public function getRoute($url){ if (array_key_exists($url, $this->routes)) { return $this->routes[$url];} else { return null;}} } ============================================================================= Homepage.php <div style='width:500px;margin:0 auto;margin-top:100px'> <form method=post action=HomeController.php> Nome <input name=nome> <input type=submit> </form> <h1><?=$mensagem?> </div> ============================================================================ HomeController.php <?php class HomeController{ public function index($mensagem = null){ require_once 'homepage.php';} } if($_POST){ $mensagem="Seu nome é ".$_POST['nome']; (new HomeController)->index($mensagem);} Depois de duas semanas apanhando com tentativa e erro, finalmente consegui montar o meu primeiro MVC com um router que funciona (claro que se trata de uma enorme gambiarra, mas eu não tenho mais o problema da nova tela se agregar à tela anterior. Hoje também perguntei ao Barder se ele não tinha um código básico de MVC com router, e não é o que danadinho tem! O código dele é super bacana, mas não contempla uma rotina para processar resposta do usuário. Mas eu estou contente, agora vou dormir mais tranquilo!
  13. No MySQL: CREATE TABLE `beijos` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `data` date NOT NULL, `beijos` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; INSERT INTO `beijos` VALUES (1,'2022-02-05',60),(2,'2022-03-09',80),(3,'2023-08-01',150), (4,'2023-08-02',250),(5,'2023-07-03',50),(6,'2023-07-05',60),(7,'2023-08-17',65),(8,'2023-08-20',183); No PHP: <?php $mysqli=new mysqli("localhost","root","","laravel"); $query=$mysqli->query("SELECT month(data) as mes, year(data) as ano, sum(beijos) as total from beijos group by month(data),year(data) order by data"); $rows=$query->fetch_all(MYSQLI_ASSOC); foreach($rows as $row){ echo $row['ano']." ".$row['mes']." ".$row['total']."<br>";} resultado: 2022 2 60 2022 3 80 2023 7 110 2023 8 648
  14. Ainda não consegui encontrar um router para funcionar o meu código MVC; existem vários na Internet, mas a grande maioria não funciona (mais provavelmente eu não sei como fazer funcionar). O último que visitei é bem bacana: coffeecode/router - Packagist - eu tentei procurar a página HTML no projeto dele, e eu não achei. O rapaz teve a audácia de montar a página HTML dentro de uma classe! Fui tentar fazer o teste, agora respeitando a tecnologia do namespace do PHP, mas nada deu certo, nada funcionou. Eu preciso de um router simples, que faça a personalização onde for necessária. Então joguei fora todo o projeto, ou seja, eu fui no gerenciador de arquivos e exclui a pasta. Mas na hora de criar novamente a pasta astudy, eu não consegui mais acessar pelo navegador. Toda vez que digitava "localhost/astudy", o navegador mudava para https://www.localhost/astudy". Isso é bem embaraçoso, acredito que isso é preço que a gente paga por instalar o .htaccess que estraga o Apache, o Windows, o Navegador, o sistema de busca do Google. O Bard me levou até o arquivo hosts dentro de um dos subdiretórios do System32 do Windows, eu consegui editar "127.0.0.1 localhost/astudy" mas não consegui salvar, mesmo eu sendo o administrador. Já faz duas semanas que estou nessa agonia. O MVC é um padrão de programação, onde você trabalha com classes. O problema é na hora de chamar uma pagina HTML através de qualquer comando PHP (include, require, header), ele ajunta a visão anterior com uma nova visão que você gostaria de mostrar. Para resolver isso, a solução encontrada é o router. O menor router que eu encontrei foi com o Bard, o código só tem 20 linhas, mas não sei como fazer funcionar. A grande maioria leva você até a classe desejada. O problema é na hora do HTML submeter o formulário: a maior parte dos tutoriais não falam nada. Outros aconselham a usar o framework Symfony, e existem esses samaritanos que mostram packages bacanas, mas na hora de usar, você fica perdida, e não encontra nenhum debate sobre o projeto do Gifthb ou coisa parecida. É um pesadelo! O mais lógico é ir direto para o Laravel, o probema é que lá é tudo mágica, eu acho bacana a funcionalidade dele, principalmente o Eloquent. Agora, fazer uma conexão entre o Laravel e o MySQL através do Artisan, isso para mim é muito obscuro. Já estudar o MVC abriu uma nova perspectiva para mim, desde 1990 é que ouço falar em classe, mas só com o MVC é que foi possível ver na prática o poder da lógica da programação, o único problema é que não tem nenhum tutorial que explique como montar um router que funcione e nem estrague o seu computador e sua paciência.
  15. Para ajudá-lo melhor, preciso da estrutura da tabela que você está usando bem como a lista da procedure dentro do banco de dados, eu não consegui imitar o seu código aqui no meu PC, e se possível com alguns dados da tabela também.
  16. Encontrei um outro tutorial, dessa vez ele usa o Simfony, onde você precisa usar o Composer várias vezes, depois de testar e fazer alguns ajustes, eu subi tudo de uma vez no Hostinger. E funcionou sem nenhum problema. How to build a simple PHP MVC framework - Giuseppe Maccario A grande vantagem desse tutorial é que você não precisa ativar o servidor do PHP para poder usá-lo no computador local.
  17. O plano que uso no Hostinger é de hospedagem de site, ou seja, não dá para usar o npm. Por outro lado, o meu projeto não precisa do npm. Todos os códigos foram feitos na unha. A única coisa que não é minha é o arquivo router.php que coloquei na pasta Controllers. Eu copiei do Bard. O código a seguir funciona no computador local, mas você precisa ativar o servidor do PHP assim: php -S localhost:8000 No navegador, você escreve localhost:8000 O servidor vai buscar o index.php, o index.php vai passar todo o comando para o router, e o router é que faz todo o espetáculo do MVC acontecer. Assim, eu acho que o correto é chamar o MVC de MVC-r, sem o router o MVC não faz o menor sentido. Agora, como fazer isso funcionar no Hostinger, isso é um problema bem sério. Se eu não conseguir, o jeito é abandonar o MVC-r para sempre. index.php <?php require 'Controllers/router.php'; $router=new Router(); $router->run(); ================================================================= Views/menu.php <!DOCTYPE html> <html lang="en"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>projeto php</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script> <script> var lçto = ""; var descrição = "" function lançar(id,jd) {lçto=id; descrição=jd;} function registro(id,jd) {eleconta=document.getElementById(lçto); eledescrição = document.getElementById(descrição); eleconta.value=id; eledescrição.innerHTML=jd;} </script> <style> a:link,a:visited{text-decoration:none;color:blue} a:hover{text-decoration:underline;color:#f00} a:active{text-decoration:none} body{margin:auto;max-width:500px} .desktop{display: none;position:fixed;overflow:auto;background:lightgray} form{margin: 0} .desktop2 {display:none;background-color:lightblue;position:fixed;z-index:1;left:30%;top:10%; padding:10px;width:40%;height:85%;overflow:auto;} .flutua{position:relative;left:80%} .linha{line-height:0px;min-height:0px;height:0px} .linha2{line-height:20px;min-height:20px;height:20px} .linha3{line-height:10px;min-height:10px;height:10px;font-size:12} .menu {position: relative;display: block;left:1%} .menu2 {position:relative;z-index:2} .movel {display:none; position:fixed; background-color:lightgray; border:1px solid;top:10;left:10} .movel2 {display:none;background-color:lightgray;position:fixed;z-index:1;left:10%;top:10%} .se {display:flex} summary{list-style:none} td{white-space: nowrap} </style> <header id=cabecalho class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> Projeto PHP <div class="dropdown"> <button type="button" class="btn btn-outline-primary dropdown-toggle" data-bs-toggle="dropdown" id=btmenu> Menu <?=Date('H:i')?> </button> <ul class="dropdown-menu"> <li><a class="dropdown-item" href=orcamento>Orçamento</a></li> </ul> </div> </header> ============================================================================================================== Views/login.php <!DOCTYPE html> <html lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Projeto PHP</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"> <style> html,body {height: 100%} body {display: flex;align-items: center;padding-top: 40px;padding-bottom: 40px;background-color: #f5f5f5;} .form-signin {max-width: 330px;padding: 15px;} .form-signin .form-floating:focus-within {z-index: 2;} </style> <body class="text-center"> <main class="form-signin w-100 m-auto"> <form method=post> <h1 class="h3 mb-3 fw-normal">Projeto PHP</h1> <div><?=$mensagem?></div> <div class="form-floating"> <input type="email" class="form-control" name=email placeholder="name@example.com" value='<?=$value?>' autofocus required> <label for="floatingInput">Email</label> </div> <div class="form-floating"> <input type="password" class="form-control" id="floatingPassword" placeholder="Senha" name="senha" required> <label for="floatingPassword">Senha</label> </div> <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button> </form> </main></body></html> ================================================================================================================= Models/conexao.php <?php class conexao{ private $conexao; function __construct(){ $host='localhost'; $user='root'; $password=''; $db='laravel'; $this->conexao=new mysqli($host,$user,$password,$db); return $this->conexao;} function root(){ return $_SERVER['DOCUMENT_ROOT']."/astudy/";} function consulta($sql){ // retorna vários registros try {$query=$this->conexao->query($sql); $rows=$query->fetch_all(MYSQLI_ASSOC); return $rows;} catch(Exception $e){echo $e->getMessage();exit;}} function unico($sql){ // retorna um registro $rows=$this->consulta($sql); if($rows==null){return 0;} return $rows[0];} function atualiza($sql){ try {$this->conexao->query($sql);} catch(Exception $e){echo $e->getMessage();exit;}} function render($viewName, $data = []) { $viewFile=realpath('.')."/Views/$viewName.php"; extract($data); require $viewFile;} } ============================================================================= Controllers/router.php <?php class Router { private $routes = [],$controle; public function __construct(){ require 'Controllers/controle.php'; $this->controle=new controle(); $this->addRoute('GET','/',function(){ $this->controle->inicio();}); $this->addRoute('POST','/',function(){ $this->controle->login();}); $this->addRoute('GET','/orcamento',function(){ $this->controle->orcamento();}); } public function addRoute($method, $path, $handler) { // $method is the HTTP method (e.g., GET, POST, PUT, DELETE) // $path is the route path (e.g., '/', '/about', '/contact') // $handler is the route handler (a callable function or object) $this->routes[$method][$path] = $handler;} public function run() { // Get the current request method and path $method = $_SERVER['REQUEST_METHOD']; $path = $_SERVER['REQUEST_URI']; // Find the matching route $route = $this->routes[$method]; if (!array_key_exists($path, $route)) { throw new Exception('No route found for method ' . $method . ' and path ' . $path);} // Call the route handler $handler = $route[$path]; $handler();}} ============================================================================= Controllers/controle.php <?php class controle{ private $conexao; public function __construct(){ require_once 'Models/conexao.php'; $this->conexao=new conexao(); return $this->conexao;} public function inicio(){ date_default_timezone_set('America/Sao_Paulo'); $inicio=date('H:i'); return $this->conexao->render('login',['mensagem'=>$inicio,'value'=>'']);} public function login(){ $email=$_POST['email']; $senha=$_POST['senha']; unset($_POST); $row=$this->conexao->unico("select * from users where email='$email'"); if(!$row||$row==0){ $this->conexao->render('login', ["mensagem"=>"Email $email incorreto!","value"=>$email]);exit;} $dbSenha=$row['password']; if(!password_verify($senha,$dbSenha)){ $this->conexao->render('login', ['mensagem'=>'Senha incorreta!','value'=>$email]);exit;} session_start(); $_SESSION['nome']=$row['name']; $_SESSION['id']=$row['id']; unset($_GET); $this->conexao->render('menu');exit;} public function orcamento(){ echo "projeto em andamento..."; } }
  18. Eu usei o arquivo index.php para chegar no controlador, usando o método da tentativa e erro. Eu fiquei muito contente, quando vi o controlador gerenciando a rotina do login. No tempo do PHP, eu usei a gambiarra do $_SESSION, é uma enorme confusão. Já o método "render" do MVC é muito mais prático. Se o usuário digitou o email ou a senha de maneira errada, você pode colocar primeiro a mensagem em uma variável local e em seguida chamar a rotina de login, onde ele vai apresentar a mensagem usando apenas a variável local. A ideia é simples, o problema é como codificar. Resolvido isso, pedi para o controlador renderizar a rotina de opções, onde tem um monte de <a ref= etc>, mas na hora que selecionei a opção orçamento, eu acabei voltando na rotina de login. Eu fiquei pasmo. Eu escrevi no arquivo index.php o seguinte: var_dump('index'), e ele me confirmou que eu sempre volto no arquivo index.php, toda vez que eu seleciono a opção "orçamento". Eu perdi o dia inteiro para saber como é possível chegar no arquivo index.php. Só pela meia noite é que vi o problema. Eu usei o método get na rotina das opções para tentar voltar no controlador, mas o get não era executado, ao invés disso ele abria o arquivo index.php. No php convencional, o método get jogava no cabeçalho do navegador coisa do tipo opcoes.php?orcamento. Mas o MVC é diferente, ele escreve assim /?orcamento, e assim descobri como o index.php voltou no meio da história. O index.php é o único que está sozinho no diretório raiz. Hoje de manhã, eu lembrei do Laravel. Perguntei para o Barder se é possível imitar o Laravel na famosa rotina routes. O Barder disse que sim. Basta eu eu criar o arquivo routes.php, chamar esse arquivo dentro da rotina principal, e ativar o servidor PHP. Eu fiquei pasmo, eu nem sabia que existia o servidor PHP. Já estou estudando o MVC já faz duas semanas e não sei onde encontrar forças para procurar o tal do servidor PHP. Se eu conseguir achar esse servidor, certamente vou fazer o teste da tentativa e erro aqui no meu PC. Se der certo, vou fazer o teste lá no Hostinger.
  19. Eu fiz assim: ... foreach($array as $key => $account){ if($key!==0){ $spreadsheet->createSheet($key); $sheet=$spreadsheet->getSheet($key);} else { $sheet=$spreadsheet->getActiveSheet();} $sheet->setTitle($account); ... Mas fiquei curioso com a consulta do PDO. Tem jeito de publicar a estrutura do banco de dados e a procedure?
  20. Uma possível solução é deixar tudo na mão do controlador, até mesmo para você ir de um view para outro. Se um view quiser ir para outro, primeiro tem que pedir a benção do controlador, assim: index.php <?php require_once 'Controller/controle.php'; $controle=new controle(); $controle->inicio(); ================================================== View/inicio.php <?php if(isset($_POST['lista'])){ require_once root.'/Controller/controle.php'; $controle=new controle(); $controle->listar(); exit;} ?> <div style="width:500px;margin:0 auto;margin-top:200px"> <form method=post> <input type=submit name=lista value="Ver 5 clientes"> </form> </div> =================================================== View/lista.php <?php if(isset($_POST['voltar'])){ require_once root.'/Controller/controle.php'; $controle=new controle(); $controle->inicio();} ?> <table><th>ID<th>Cliente <?php foreach($clientes as $cliente): echo "<tr><td>$cliente->codp<td>$cliente->pessoa"; endforeach; ?> </table> <form method=post> <input type=submit name=voltar value=Voltar> </form> ==================================================== Model/conexao.php <?php define('root',realpath('.')); class conexao{ private $conexao; function __construct(){ $host="localhost"; $user="root"; $password=""; $dbname="laravel"; $this->conexao=new mysqli($host,$user,$password,$dbname);} function consulta($sql){ try {$query=$this->conexao->query($sql); $rows=$query->fetch_all(MYSQLI_ASSOC); return json_decode(json_encode($rows));} catch(Exception $e){ echo $e->getMessage()."<br> conexao->consulta $sql";exit;}} } ========================================================================== Controller/controle.php <?php class controle{ private $conexao; function __construct(){ require_once realpath('.').'/Model/conexao.php'; $this->conexao=new conexao;} function listar(){ $sql="select * from tbpessoa limit 5"; $clientes=$this->conexao->consulta($sql); require_once root.'/View/lista.php';} function inicio(){ require_once root.'/View/inicio.php';} }
  21. Semana passada, eu prometi ajudar o Lúcio a desenvolver um programa para um campeonato de tacos, usando o MVC do PHP. O problema é que eu não sabia nada de MVC. Então eu peguei esse tutorial: MVC e PHP: Conceito de MVC e sua funcionalidade usando o PHP (devmedia.com.br). Eu gostei do tutorial e fui adaptando ao novo estilo de codificar, mas na medida que fui avançando fui encontrando vários erros difíceis de corrigir. Hoje decidi codificar o tutorial, e eu fui encontrando os mesmos erros que o PHP apontou nos meus códigos. Aqui está o código corrigido do tutorial. No tutorial, o rapaz usa a variável $_REQUEST, mas ela é totalmente desnecessária. O rapaz tenta listar os clientes do banco de dados. Eu consegui chegar na listagem, o que eu não esperava é o formulário de apresentação do index.php estar junto com a listagem. O problema é mais grave do que imaginei. Eu não sei como corrigir, e nem sei se é possível fazer o MVC no PHP. index.php <?php if(isset($_GET['class'])){ $classe=$_GET['class']; $metodo=$_GET['acao']; $classe.='Controller'; require_once 'Controller/'.$classe.'.php'; $obj=new $classe(); $obj->$metodo();} ?> <form> classe <input name=class value=Cliente> metodo <input name=acao value=listar> <input type=submit> </form> =============================================== View/cliente_view.php <!DOCTYPE HTML PUBLIC "-//3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; chrset=UTF-8"> <title>Implementando MVC</title> </head> <body> <table> <tr> <th>ID</th> <th>Cliente</th> </tr> <?php foreach($jclientes as $cliente): ?> <tr> <td><?php echo $cliente->codp; ?></td> <td><?php echo $cliente->pessoa; ?></td> </tr> <?php endforeach; ?> </table> </body> </html> ================================================================ Model/Cliente.php <?php class Cliente{ private $id, $nome; public function save(){} public function update(){} public function remove(){} public function listAll(){ $mysqli=new mysqli("localhost","root","","laravel"); $query=$mysqli->query("select codp, pessoa from tbpessoa limit 5"); $fetch=$query->fetch_all(MYSQLI_ASSOC); return $fetch; } } ============================================================================== Controller/ClienteController.php <?php require_once 'Model/Cliente.php'; class ClienteController{ public function listar(){ $cliente=new Cliente(); $clientes=$cliente->listAll(); $jclientes=json_decode(json_encode($clientes,true)); require_once 'view/cliente_view.php'; } }
  22. Do you have a view example that uses GetMiddleware class? Sure, here is a view example that uses the GetMiddleware class: PHP <html> <head> <title>Home</title> </head> <body> <!-- This view will only be rendered if the user is authenticated. --> <?php if ($request->user()): ?> <h1>Welcome, <?php echo $request->user()->name; ?></h1> <?php endif; ?> </body> </html> This view file first checks if the user is authenticated by using the $request->user() variable. If the user is not authenticated, the view file will not be rendered. Otherwise, the view file will be rendered and the user's name will be displayed. Here is how you would use this view file in a controller: PHP class HomeController { public function index() { // Get the middleware for GET requests. $middleware = new GetMiddleware(); // Use the middleware to handle the request. $response = $middleware->handle($request, $next); // Render the view. return view('home', $response); } } In this controller, the index() method first gets the middleware for GET requests. Then, the method uses the middleware to handle the request. If the user is authenticated, the method renders the home view. Otherwise, the method returns a 401 Unauthorized response. I hope this helps! Let me know if you have any other questions.
  23. how is possible to write return view('home', $response); in mvc php? The return view('home', $response); code in MVC PHP is used to render a view. The view() function takes two arguments: the name of the view file and an optional array of data that will be passed to the view. In this case, the view file is called home and the data array is empty. The view() function will first look for the view file in the views directory. If the file is found, it will be rendered and the output will be returned to the user. If the file is not found, an error will be thrown. The $response variable is an object that represents the HTTP response. It can be used to set the headers, cookies, and status code of the response. In this case, the $response variable is not being used, but it is still being passed to the view() function as a way to future-proof the code. Here is an example of how the return view('home', $response); code would be used in a controller: PHP class HomeController { public function index() { // Get the data for the view. $data = [ 'title' => 'Home', ]; // Render the view. return view('home', $data); } } In this example, the HomeController class has an index() method that renders the home view. The index() method first gets the data for the view, which in this case is just a title. Then, the method calls the view() function to render the view. The view() function takes the name of the view file and the data array as arguments. In this case, the view file is called home and the data array contains the title of the page. The return view('home', $response); code can be used in any controller that needs to render a view. It is a simple and efficient way to render views in MVC PHP. do you have code for view function por mvc php? Yes, here is a simple PHP function that you can use to render a view: PHP function view($name, $data = []) { // Get the view file. $view_file = __DIR__ . '/views/' . $name . '.php'; // Check if the view file exists. if (!file_exists($view_file)) { throw new Exception('View file not found: ' . $view_file); } // Extract the data array. extract($data); // Include the view file. include $view_file; } This function takes two arguments: the name of the view file and an optional array of data that will be passed to the view. The function first gets the view file by appending the view name to the current directory path and the .php extension. Then, the function checks if the view file exists. If the file does not exist, an exception is thrown. Next, the function extracts the data array into the local scope. This makes the variables in the data array available to the view file. Finally, the function includes the view file. You can use this function in any controller that needs to render a view. For example: PHP class HomeController { public function index() { // Get the data for the view. $data = [ 'title' => 'Home', ]; // Render the view. view('home', $data); } } In this example, the HomeController class has an index() method that renders the home view. The index() method first gets the data for the view, which in this case is just a title. Then, the method calls the view() function to render the view. The view() function takes the name of the view file and the data array as arguments. In this case, the view file is called home and the data array contains the title of the page. I hope this helps! Do you have more code examples to class GetMiddleware? Sure, here are some more code examples for the GetMiddleware class: You can use the request object to get information about the request, such as the URI, the headers, and the body. For example: PHP $uri = $request->getUri(); $headers = $request->getHeaders(); $body = $request->getBody(); You can use the next() function to pass the request to the next middleware class or controller. For example: PHP $response = $next($request); You can use the return() function to return a response to the user. For example: PHP return response('Hello, world!'); Here is an example of a more complex GetMiddleware class that checks if the user is authenticated before allowing them to access the resource: PHP class GetMiddleware { public function handle($request, $next) { // Check if the user is authenticated. if (! $request->user()) { return response('You are not authenticated.', 401); } // Pass the request to the next middleware class or controller. return $next($request); } } This middleware class first checks if the user is authenticated by using the request->user() method. If the user is not authenticated, the middleware class returns a 401 Unauthorized response. Otherwise, the middleware class passes the request to the next middleware class or controller. I hope this helps! Let me know if you have any other questions.
×
×
  • Criar Novo...