Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.583
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Projeto Senac 2.0, atualizado em 10/08/2023 02:11 hs (ufa, terminei!) O que dá mais trabalho com as classes é que eu sempre esqueço que todas as informações que foram gravadas na classe desaparecem, assim que você aperta o botão submeter. Estava pensando em até criar um $_SESSION['classes'], mas o propósito desse projeto é outro. Ele é para ver como funcionam as classes. Eu acho difícil trabalhar com eles, eu prefiro mais o estilo dissertativo, a gente vai escrevendo o que der na telha. MySQL CREATE TABLE `usuarios` ( `id` int NOT NULL AUTO_INCREMENT, `email` varchar(255) NOT NULL, `senha` varchar(255) NOT NULL, `nome` varchar(45) DEFAULT NULL, `endereco` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 --------------------------------------------------------------------------------------- index.php <?php require('classes.php'); $Usuario=new Usuario(); if(isset($_POST['email'])){ $_SESSION['email']=$_POST['email']; $_SESSION['senha']=$_POST['senha'];} if(isset($_SESSION['email'])){ $email=$_SESSION['email']; $senha=$_SESSION['senha'];} else {$email="";$senha="";} ?> <form method=post action=validar.php> <label class="text-primary h4">E-mail:</label> <input class="form-control" type=text name=email placeholder= "Preencha seu e-mail" value='<?=$email?>' required><br> <label class="text-danger h4">Senha:</label> <input class="form-control" type=text name=senha placeholder= "Preencha sua senha" value='<?=$senha?>'><br> <button class="btn btn-primary" name="logar" type="submit"> Entrar</button> <button class="btn btn-primary" name="novo" type="submit"> Novo</button> <button class="btn btn-primary" name="alterar" type="submit"> Alterar</button> <button class="btn btn-primary" name="excluir" type="submit"> Excluir</button> </form> <br><br><font size=4 color=red><i> <div id=mensagem><?=$_SESSION['mensagem']?><div></i> </body> </html> ----------------------------------------------------------------------------- cadastro.php <?php require('classes.php'); $Usuario=new Usuario(); if(isset($_POST['nome'])){ $Usuario->nome = $_POST['nome']; $Usuario->email = $_POST['email']; $Usuario->senha = $_POST['senha']; $Usuario->endereco = $_POST['endereco']; $Usuario->cadastrar(); $_SESSION['mensagem']="Nova conta já cadastrada."; header('location:index.php');} $email=$_SESSION['email']; $senha=$_SESSION['senha']; $teste=$Usuario->validaUsuario($email,$senha); if($teste=="Senha incorreta" || $teste=="Sucesso"){ $_SESSION['mensagem']="Essa conta já está cadastrada"; header('Location:index.php');} ?> <form method=post> <label class="text-primary h4">Nome:</label> <input class="form-control" name=nome required><br> <label class="text-primary h4">E-mail:</label> <input class="form-control btn btn-warning" name=email value=<?=$email?>><br><br> <label class="text-primary h4">Senha:</label> <input class="form-control btn btn-warning" name=senha value=<?=$senha?>><br><br> <label class="text-primary h4">Endereço:</label> <input class="form-control" name=endereco required><br><br> <input class="form-control btn btn-primary" type=submit><br><br> </form> <input class="form-control btn btn-primary" type=submit Value=Cancelar onclick="location.replace('index.php')"> ----------------------------------------------------------------------- classes.php <!DOCTYPE html> <html> <title>Projeto Senac 2.0</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous"> <body class="w-25 mx-auto mt-5"> <?php session_start(); class Usuario { public $host="localhost"; public $user="root"; public $password=""; public $database="laravel"; public $query, $link, $result, $id, $nome, $email, $senha, $endereco; public function MySQL(){} public function getConexao(){ $this->link=mysqli_connect($this->host,$this->user,$this->password); if(!$this->link){ echo "Falha na conexão com o Banco de Dados! <br>"; echo "Erro:".mysqli_error($this->link); die();} elseif(!mysqli_select_db($this->link,$this->database)){ echo "O Banco de Ddos solicitado não pode ser aberto! <br>"; echo "Erro:".mysqli_error($this->link); die();}} public function excluir($id){ $sql="delete from usuarios where id=$id"; $resposta=$this->query($sql); return $resposta;} public function query($query){ $this->getConexao(); $this->query=$query; if($this->result=mysqli_query($this->link,$this->query)){ mysqli_close($this->link); return $this->result;} else { echo "Ocorreu um erro na execução dda SQL"; echo "Erro:".mysqli_error($this->link); echo "SQL:".$query; die(); return mysqli_close($this->link);}} public function Cadastrar() { $sql = "INSERT INTO Usuarios (nome,email,senha,endereco) VALUES ('$this->nome','$this->email','$this->senha','$this->endereco')"; if ($this->query($sql)) {return "Sucesso";} else { return "Erro na tentativa de cadastrar";}} public function Editar() { $sql="update usuarios set nome='$this->nome',email = '$this->email', senha='$this->senha',endereco='$this->endereco' where id=$this->id"; if ($this->query($sql)) {return "Sucesso";} else { return "Erro na tentativa de editar";exit;}} public function validaUsuario($email,$senha) { $this->email=$email; $this->senha=$senha; if (strlen($this->email) > 100) { echo "E-mail deve ter até 100 caracteres"; return false;} if ($this->senha == null || strlen($this->senha) < 6) { return "Preencha a senha com no mínimo 6 caracteres!"; } $sql = "select * from usuarios where email='$this->email'"; $resposta = $this->query($sql); $usuario = $resposta->fetch_assoc(); if ($usuario==null) { $_SESSION['mensagem']="Email não cadastrado"; header('location:index.php');exit;} if ($usuario['senha'] != $this->senha) { $_SESSION['mensagem']="Senha incorreta"; header('location:index.php');exit;} $_SESSION['usuario']=$usuario['nome']; $this->id=$usuario['id']; $this->nome=$usuario['nome']; $this->email=$usuario['email']; $this->senha=$usuario['senha']; $this->endereco=$usuario['endereco']; return "Sucesso";} } ?> ----------------------------------------------------------------------------- editar.php <?php require('classes.php'); $Usuario=new Usuario(); if(isset($_POST['nome'])){ $Usuario->id=$_POST['id']; $Usuario->nome = $_POST['nome']; $Usuario->email = $_POST['email']; $Usuario->senha = $_POST['senha']; $Usuario->endereco = $_POST['endereco']; $_SESSION['email']=$_POST['email']; $_SESSION['senha']=$_POST['senha']; $Usuario->editar(); $_SESSION['mensagem']="Cadastro atualizado."; header('location:index.php');} $Usuario->email=$_SESSION['email']; $Usuario->senha=$_SESSION['senha']; $Usuario->validaUsuario($Usuario->email,$Usuario->senha); $id=$Usuario->id; $nome=$Usuario->nome; $email=$Usuario->email; $senha=$Usuario->senha; $endereco=$Usuario->endereco; ?> <form method=post> <input type=hidden name=id value=<?=$id?>> <label class="text-primary h5">Nome:</label> <input class="form-control" name=nome value='<?=$nome?>'><br> <label class="text-primary h5">E-mail:</label> <input class="form-control" name=email value='<?=$email?>'><br> <label class="text-primary h5">Senha:</label> <input class="form-control" name=senha value='<?=$senha?>'><br> <label class="text-primary h5">Endereço:</label> <input class="form-control" name=endereco value='<?=$endereco?>'><br> <input class="form-control btn btn-primary" type=submit value=Atualizar><br><br> </form> <input class="form-control btn btn-primary" type=submit Value=Cancelar onclick="location.replace('index.php')"> ------------------------------------------------------------------------------------ excluir.php <?php require('classes.php'); $Usuario=new Usuario(); if(isset($_POST['excluir'])){ $id=$_POST['id']; $Usuario->excluir($id); $_SESSION['mensagem']="Essa conta acabou de ser excluido."; header('location:index.php');} $Usuario->email=$_SESSION['email']; $Usuario->senha=$_SESSION['senha']; $Usuario->validaUsuario($Usuario->email,$Usuario->senha); $id=$Usuario->id; $nome=$Usuario->nome; $email=$Usuario->email; $senha=$Usuario->senha; $endereco=$Usuario->endereco; ?> <form method=post> <input name=id type=hidden value=<?=$id?>> <label class="text-primary h5">Id: <?=$id?> Nome:</label> <input class="form-control btn btn-warning" value='<?=$nome?>'><br><br> <label class="text-primary h5">E-mail:</label> <input class="form-control btn btn-warning" value='<?=$email?>'><br><br> <label class="text-primary h5">Senha:</label> <input class="form-control btn btn-warning" name=senha value='<?=$senha?>'><br><br> <label class="text-primary h5">Endereço:</label> <input class="form-control btn btn-warning" value='<?=$endereco?>'><br><br> <input class="form-control btn btn-primary" type=submit name=excluir value='Confirmar exclusao'><br><br> </form> <input class="form-control btn btn-primary" type=submit Value=Cancelar onclick="location.replace('index.php')"> --------------------------------------------------------------------------- produtos.php <?php include("classes.php"); ?> <pre> O usuário logado é <?=$_SESSION['usuario']?>. A rotina de produtos não foi implantada na versão 2.0 </pre> <button class="btn btn-primary" onclick="location.replace('index.php')">Voltar</button> ---------------------------------------------------------------------------- <?php include('classes.php'); $Usuario=new Usuario(); $_SESSION['mensagem']=""; $_SESSION['email']=$_POST['email']; $_SESSION['senha']=$_POST['senha']; if (isset($_POST['logar'])) { $resposta = $Usuario->validaUsuario($_POST['email'],$_POST['senha']); if($resposta == "Sucesso") {header("Location:produtos.php");} else {$_SESSION['mensagem']=$resposta; header('location:index.php');}} if(isset($_POST['novo'])){header('location:cadastro.php');} if(isset($_POST['alterar'])){header('location:editar.php');} if(isset($_POST['excluir'])){header('location:excluir.php');}
  2. O arquivo zipado está com o arquivo PDF corrompido e também está faltando o código do conexao.php, mesmo assim, eu consegui fazer um código tão safado quanto o do Senac. Apesar de safado, ele funciona (pelo menos, até onde eu testei). Ele inclui, altera e exclui a conta do usuário, e só ocupa um arquivo ao invés de quatro arquivos que está no zip. <!DOCTYPE html> <html> <body style="width:500px;margin:0 auto;margin-top:100px"> <?php if(isset($_GET['home'])){ echo "Sinto muito, essa página não está pronta.";exit;} ?> <form> E-mail:<input type=email name=email><p> Senha: <input type=password name=senha><p> <button type=submit>Entrar</button> </form> <?php // esse código precisa de uma tabela no mysql: usuarios(id,email,senha) if(isset($_GET['cadastrar'])){ $Usuario=new Usuario(); $Usuario->cadastrar();} if(isset($_GET['editar'])){ $Usuario=new Usuario(); $velhoEmail=$_GET['velhoEmail']; $novoEmail=$_GET['editar']; $Usuario->editar($novoEmail,$velhoEmail);} if(isset($_GET['excluir'])){ $Usuario=new Usuario(); $excluir=$_GET['excluir']; $Usuario->excluir($excluir);} if(!isset($_GET['email'])){exit;} class Usuario { public $id,$nome,$email,$senha,$endereco,$conexao; public function __construct(){ $this->conexao = new mysqli("localhost","root","","laravel"); return $this->conexao;} public function validaUsuario() { if ($this->validaEmail()) { if ($this->senha== null || strlen($this->senha) < 6) { return "Preencha a senha com no mínimo 6 caracteres!"; } return $this->Login();}} public function validaEmail() { if ($this->email == null) { echo "O e-mail é indispensável"; return false;} elseif(strlen($this->email)>45) { echo "E-mail deve ter até 45 caracteres"; return false;} return true;} public function Login() { $sql = "select * from usuarios where email = '$this->email'"; $resposta = $this->conexao->query($sql); $usuario = $resposta->fetch_assoc(); if (!$usuario) { echo "Email não cadastrado <a href=?cadastrar=$this->email&senha=$this->senha>Cadastrar $this->email</a>";exit;} elseif ($usuario['senha'] != $this->senha) { echo "Senha incorreta";exit;} echo " <table> <tr><td nowrap>Opção 1: <td nowrap>alterar email $this->email para <td><form><input type=email name=editar onchange=submit()> <input type=hidden name=velhoEmail value=$this->email></form> <tr><td>Opção 2: <td>excluir o email $this->email <td><form> <input name=excluir type=submit value=Excluir onchange=submit()> <input type=hidden name=excluir value=$this->email> </form> <tr><td>Opção 3: <td>ir para o Home Page <td><form><input name=home type=submit value='Home Page'></form> </table>";} public function Cadastrar() { $this->email=$_GET['cadastrar']; $this->senha=$_GET['senha']; $sql = "insert into usuarios (email,senha) values ('$this->email','$this->senha')"; if (!mysqli_query($this->conexao, $sql)) {return "Erro na tentativa de cadastrar";exit;}} public function Editar($novoEmail,$velhoEmail) { $sql = "update usuarios set email = '$novoEmail' where email='$velhoEmail'"; if (!mysqli_query($this->conexao, $sql)) { return "Erro na tentativa de editar";exit;}} public function Excluir($email){ $sql = "delete from usuarios where email='$email'"; if (!mysqli_query($this->conexao, $sql)) { return "Erro na tentativa de editar";exit;}} } $Usuario = new Usuario(); $Usuario->email=$_GET['email']; $Usuario->senha=$_GET['senha']; $resposta = $Usuario->validaUsuario($Usuario); ?>
  3. Frank K Hosaka

    Herança no PHP

    <!DOCTYPE html> <html> <body style="width:500px;margin:0 auto;margin-top:100px"> <?php if(isset($_GET['home'])){ echo "Sinto muito, essa página não está pronta.";exit;} ?> <form> E-mail:<input type=email name=email><p> Senha: <input type=password name=senha><p> <button type=submit>Entrar</button> </form> <?php // esse código precisa de uma tabela no mysql: usuarios(id,email,senha) if(isset($_GET['cadastrar'])){ $Usuario=new Usuario(); $Usuario->cadastrar();} if(isset($_GET['editar'])){ $Usuario=new Usuario(); $velhoEmail=$_GET['velhoEmail']; $novoEmail=$_GET['editar']; $Usuario->editar($novoEmail,$velhoEmail);} if(isset($_GET['excluir'])){ $Usuario=new Usuario(); $excluir=$_GET['excluir']; $Usuario->excluir($excluir);} if(!isset($_GET['email'])){exit;} class Usuario { public $id,$nome,$email,$senha,$endereco,$conexao; public function __construct(){ $this->conexao = new mysqli("localhost","root","","laravel"); return $this->conexao;} public function validaUsuario() { if ($this->validaEmail()) { if ($this->senha== null || strlen($this->senha) < 6) { return "Preencha a senha com no mínimo 6 caracteres!"; } return $this->Login();}} public function validaEmail() { if ($this->email == null) { echo "O e-mail é indispensável"; return false;} elseif(strlen($this->email)>45) { echo "E-mail deve ter até 45 caracteres"; return false;} return true;} public function Login() { $sql = "select * from usuarios where email = '$this->email'"; $resposta = $this->conexao->query($sql); $usuario = $resposta->fetch_assoc(); if (!$usuario) { echo "Email não cadastrado <a href=?cadastrar=$this->email&senha=$this->senha>Cadastrar $this->email</a>";exit;} elseif ($usuario['senha'] != $this->senha) { echo "Senha incorreta";exit;} echo " <table> <tr><td nowrap>Opção 1: <td nowrap>alterar email $this->email para <td><form><input type=email name=editar onchange=submit()> <input type=hidden name=velhoEmail value=$this->email></form> <tr><td>Opção 2: <td>excluir o email $this->email <td><form> <input name=excluir type=submit value=Excluir onchange=submit()> <input type=hidden name=excluir value=$this->email> </form> <tr><td>Opção 3: <td>ir para o Home Page <td><form><input name=home type=submit value='Home Page'></form> </table>";} public function Cadastrar() { $this->email=$_GET['cadastrar']; $this->senha=$_GET['senha']; $sql = "insert into usuarios (email,senha) values ('$this->email','$this->senha')"; if (!mysqli_query($this->conexao, $sql)) {return "Erro na tentativa de cadastrar";exit;}} public function Editar($novoEmail,$velhoEmail) { $sql = "update usuarios set email = '$novoEmail' where email='$velhoEmail'"; if (!mysqli_query($this->conexao, $sql)) { return "Erro na tentativa de editar";exit;}} public function Excluir($email){ $sql = "delete from usuarios where email='$email'"; if (!mysqli_query($this->conexao, $sql)) { return "Erro na tentativa de editar";exit;}} } $Usuario = new Usuario(); $Usuario->email=$_GET['email']; $Usuario->senha=$_GET['senha']; $resposta = $Usuario->validaUsuario($Usuario); ?>
  4. Consegui terminar o meu código, ao invés de usar dez1, dez2, dez3, dez4, dez5 e dez6, eu usei apenas um campo texto chamado sorteio com esse formato '[dez1,dez2,dez3,dez4,dez5,dez6]', isso porque você falou de outras loterias que tem menos números ou mais números serem sorteados. Mesmo assim, o problema é como conferir o palpite aleatório com o que está no banco de dados. Deixei o meu código final logo acima. Espero que ele ajude no seu projeto, apesar de ter mudado a sua estrutura no banco de dados.
  5. Fiz um código básico para ver como conferir um palpite com o banco de dados: <?php $pdo=new pdo("mysql:host=localhost;dbname=laravel","root",""); $query="drop table if exists sorteio"; $stmt=$pdo->prepare($query); $stmt->execute(); $query="create table sorteio (`id` int NOT NULL AUTO_INCREMENT, `dataDoSorteio` date DEFAULT NULL,`tipoJogo` varchar(10) DEFAULT NULL, `numeroDoSorteio` int DEFAULT NULL, `Sorteio` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`))"; $stmt=$pdo->prepare($query); $stmt->execute(); $query="insert into sorteio (dataDoSorteio,tipoJogo,numeroDoSorteio,Sorteio) values ('2021-12-14','Mega-Sena',2438,'[4,11,19,25,37,55]'), ('2021-12-16','Mega-Sena',2439,'[2,8,34,38,47,51]'), ('2021-12-20','Mega-Sena',2440,'[9,41,42,46,54,18]')"; $stmt=$pdo->prepare($query); $stmt->execute(); $palpite=[4,11,19,25,37,55,57,60]; $query="select Sorteio from sorteio"; $stmt=$pdo->prepare($query); $stmt->execute(); $sorteios=$stmt->fetchAll(PDO::FETCH_COLUMN); echo "Testando palpite ".implode(" ",$palpite); foreach($sorteios as $sorteio){ echo "<br>Testando sorteio $sorteio"; $j=json_decode($sorteio); if($j[0]==$palpite[0] && $j[1]==$palpite[1] && $j[2]==$palpite[2] && $j[3]==$palpite[3] && $j[4]==$palpite[4] && $j[5]==$palpite[5]){goto fim;} else {echo "palpite válido";exit;}} fim: echo "<br>Palpite inválido pois os seis primeiros números já foram sorteados"; O problema todo é como comparar o palpite com os resultados já divulgados. Você impôs a regra de não repetir um resultado que já foi publicado. No meu código, eu usei um único palpite com seis números que já foram publicados, mas foram usados 8 dezenas. É quase improvável que o resultado da Mega-Sena se repita mais de uma vez, mas isso não quer dizer que seja impossível. Mas invalidar um palpite de 8 dezenas só porque tem 6 dezenas que já foram sorteadas não faz o menor sentido.
  6. Ainda não entendi o propósito do projeto. Preciso de uma ideia mais prática. Gerar número aleatório de acordo com o gosto do freguês é bem difícil de enxergar. Mesmo assim, eu posso sugerir a estrutura do banco de dados aposta (id,palpites), onde id é chave primária e palpites é um string com 45 caracteres, ele teria essa cara: 1 , '[01 02 03 04 05 06]' 2, '[07 08 09 10 11 12]' 3, '[07 08 09 10 11 13]' Como exercício, tente ver se o registro com id=2 é igual ao registro de id=3.
  7. Para ter a hora atual, a função seria assim '.date('H:i').' e para não ter o dia em tempo real basta não usar nenhuma função de tempo, basta escrever na unha.
  8. <?php $f['time']="08:53"; // isso inventei para testar esse código $data = date('D'); $mes = date('M'); $dia = date('d'); $ano = date('Y'); $semana = ['Sun' => 'Domingo','Mon' => 'Segunda-Feira','Tue' => 'Terca-Feira', 'Wed' => 'Quarta-Feira','Thu' => 'Quinta-Feira', 'Fri' => 'Sexta-Feira', 'Sat' => 'Sábado']; $mes_extenso = ['Jan' => 'Janeiro','Feb' => 'Fevereiro','Mar' => 'Marco', 'Apr' => 'Abril','May' => 'Maio','Jun' => 'Junho','Jul' => 'Julho', 'Aug' => 'Agosto','Nov' => 'Novembro','Sep' => 'Setembro', 'Oct' => 'Outubro','Dec' => 'Dezembro']; $style="font-size: 12px;margin: 10 0 10;border-top: 1.9px solid #fff;padding: 10 0 0;position: relative"; $hoje="Hoje é ".$semana[$data]." dia $dia de ".$mes_extenso[$mes]."de $ano"; echo "<span style=$style>".$hoje." ".$f['time']."</span>";
  9. Para ordenar seis números sorteados, o código é esse: <?php $numbers=range(1,60); srand((float)microtime()*1000000); shuffle($numbers); $palpites=[]; for($i=0;$i<=5;$i++){$palpites[]=$numbers[$i];} asort($palpites); foreach($palpites as $palpite){echo "$palpite ";} Para colocar o palpite no banco de dados, eu preciso de mais informação. Eu sei que a aposta mínima de seis números na Mega-Sena custa R$ 5,00 e o maior custa R$ 25.025,00 com quinze números, mas é preciso verificar, eu não tenho certeza. Eu vou criar uma tabela aposta com 6 campos ou 15 campos? Essa tabela vai identificar o cliente? O cliente pode apostar os mesmos números mais de uma vez ou só uma vez? Preciso de um campo para o número e data do sorteio?
  10. Um rapaz no Laracasts comentou que estou usando indevidamente o relacionamento da tabela, ele disse para não jogar todo o banco de dados no visualizador, ele orientou a só mandar o agrupamento de datas no visualizador com a respestiva soma. Se alguém quiser mais detalhes, basta clicar na data que o controlador vai montar os detalhes daquela data e devolver no visualizador. A idéia é bem simples. Não precisa de nenhum relacionamento, o visualizador só vai ter a informação que o usuário precisa, e a tabela pode trabalhar com apenas um campo com a data e a hora da venda. As soluções mais simples são as melhores.
  11. Eu pedi ajuda para a turma do Laracasts sobre a possibilidade de eu trabalhar com apenas um campo, ao invés do Vendido (tipo data) e do HoraVenda (tipo data tempo), mas dessa vez eu não consegui nenhum resultado. No PHP é possível trabalhar com apenas um campo, porque o controlador e o visualizador fica tudo misturado no mesmo código. Já no Laravel, o controlador e o visualizador são peças separadas. Claro que é possível executar várias consultas dentro do visualizador, mas esse não é o propósito do Laravel. Para rodar a consulta somente no controlador, eu precisaria mandar os dados do pedido junto com a relação dos pedidos para cada data, e isso só é possível através de um relacionamento, e o relacionamento só funciona se o campo em referência for do tipo data e não data tempo.
  12. Comigo esse código traz tudo em ordem alfábetica.
  13. 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.
  14. 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".
  15. <?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
  16. 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.
  17. 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.
  18. 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.
  19. 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.
  20. 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?
  21. 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:
  22. 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
  23. 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.
  24. 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]);} }
  25. 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.
×
×
  • Criar Novo...