Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.206
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Legal, selecione o PHP 5.6, eu acho que tudo voltará a funcionar. O problema é se você precisar de alguém para usar o motor mysql. Desconfio que ninguém mais trabalha com esse driver. Mas, antes, você precisa desmarcar a opção "Exibir versões PHP que não são mais suportadas". Ah, tem uma parte do código no configs.php que você escreveu define('HOST','mysql.hostinger.com.br'); acho que o correto é: define('HOST','localhost');
  2. Joel, eu sinto muito, mas eu não tenho como ajudar. O seu projeto tem mais de 1.000 arquivos, e ele trabalha com o serviço de email, coisa que eu não tenho a menor experiência. O pior drama é o driver que conecta o PHP ao banco de dados, ele usa o driver mysql, coisa que não é utilizado desde a versão PHP 7. O Hostinger só trabalha com o PHP 7.3 em diante. O novo driver se chama mysqli. O problema é que não basta pegar tudo que é "mysql" do seu projeto e renomear para "mysqli". O novo driver traz uma nova gramática bem diferente do anterior. Veja esse código: /***************************** FUNÇÃO DO PRO PHP FUNÇÃO DE LEITURA NO BANCO *****************************/ function read($tabela, $cond = NULL){ $qrRead = "SELECT * FROM {$tabela} {$cond}"; $stRead = mysql_query($qrRead) or die ('Erro ao ler em '.$tabela.' '.mysql_error()); $cField = mysql_num_fields($stRead); for($y = 0; $y < $cField; $y++){ $names[$y] = mysql_field_name($stRead,$y); } for($x = 0; $res = mysql_fetch_assoc($stRead); $x++){ for($i = 0; $i < $cField; $i++){ $resultado[$x][$names[$i]] = $res[$names[$i]]; } } return $resultado; } Eu sou do tempo do mysqli, comecei a estudar o PHP após 2020, ou seja, eu não sou capaz de enxergar como essa função consegue enxergar a conexão com o banco de dados. Eu acredito que o comando "mysql_query" já fazia a conexão. Mas o novo comando "mysqli_query" é diferente, ele não sabe aonde está a conexão, logo o código acima ficaria mais ou menos assim: $cField = mysqli_num_fields($stRead,$conn); Ou seja, a sua função original trabalhava com apenas um parâmetro. Com o novo driver, a função original vai precisar de dois parâmetros, isso sem falar que muitos comandos do driver mysql foram abandonados no novo driver mysqli. O mais sensato é jogar tudo fora, e começar do zero. Eu sinto muito.
  3. Ok, mande pelo email frankhosaka@gmail.com o zip do código php, mas preciso também da estrutura do banco de dados no formato .sql (se tiver alguns dados, melhor ainda). Mas não prometo rápido retorno. A minha vida também é bem enrolada.
  4. Reeditando: Testei o seu código, e não consegui executar o dts/configs.php - eu trabalho com o motor mysqli e o PDO. Eu já ouvi falar do motor mysql, mas acho que a Hostinger também não tem esse motor para o PHP. Mudei a linha 14 e 15 do configs.php assim: $conn = mysqli_connect(HOST, USER, PASS,DBSA) or die ('Erro ao conectar: '.mysqli_connect_error()); // $dbsa = mysqli_select_db(DBSA) or die ('Erro ao selecionar banco: '.mysql_error()); Acredito que o problema é o driver. Aqui no fórum tem vários códigos que usam o driver mysql, mas isso lá em 2010. Aconselho a usar o motor mysqli (exclusivo para o MySQL) ou o PDO (que pode ser usado em outro tipo de banco de dados além do MySQL). Aprender gramática nova é muito chato. Eu apanhei muito com o MySQL, eu trabalhava com o Microsoft Access. Mas aqui em 2024 temos uma ótima novidade: o IA, eu uso o Bader do Google. Tem muita que não sei como fazer, e eu pergunto para ele coisa do tipo "como é a gramática do PDO para excluir um registro?" Você vai amar o Bader, é claro se você conseguir pelo menos 50% de respostas que funcionam. Tem hora que eu quero matar o Bader.
  5. Digitei https://www.pinka.website, mas não apareceu nada por aqui. Eu presumo que você tirou o arquivo index.php de lá. Para testar se o banco de dados ainda está lá, eu sugiro o seguinte código: arquivo index.php no diretório html_public: <?php $mysqli=new mysqli("localhost","u241595549_joel","u241595549_joel","u241595549_joel"); if ($mysqli === false) { echo 'A conexão com o banco de dados falhou.';} else { echo 'A conexão com o banco de dados foi bem-sucedida.';} Se não retornar nenhuma mensagem, suponho que o banco de dados não existe. Mas se der certo, você joga todos os códigos da raiz para dentro do html_public. Esse é o famoso método científico da tentativa e erro.
  6. Eu não tenho nenhuma experiência com o servidor, mas eu faria o seguinte: Crie o arquivo index.php dentro do diretório public_html, assim: arquivo index.php <?php echo "olá mundo!"; e depois digite no navegador: https:/pinka.website para ver o que acontece (eu tentei digitar http, mas o Chrome mudou para https). Pelo nome do banco de dados, isso parece Hostinger do tipo compartilhado, mas eu só consigo ver a pasta public_html no meu caso.
  7. Aqui eu apresento um código que usa apenas o Bootstrap, a gramática dele não é nada fácil. Tem hora que eu não consigo encontrar o efeito desejado (tipo diminuir a "linha" do Bootstrap), e é aí que eu começo criar o meu CSS personalizado (geralmente no marcador <style></style> ao invés de usar usar um arquivo style.css). O problema de usar outras fontes de estilos é que isso vai gerar conflitos. Levei um bom tempo para usar o Bootstrap, eu baixava os exemplos e ele não funcionava, até que eu aprendi a criar um link no cdn. Enfim, cada CSS disponível tem os seus truques. Eu gosto bastante do Bootstrap. O problema é que eu quero estudar o Laravel, mas ele foi projetado para trabalhar com o CSS Tailwind. Em 2023, eu aluguei o servidor tipo compartilhado, lá não havia como trabalhar com o CSS Tailwind. Em 2024, mudei o tipo do servidor para VPS, agora sim vou poder estudar o Laravel mais a fundo. O exemplo que segue só tem texto, não tem ícone, não tem imagem, não tem fonte. É claro que o Bootstrap trabalha com tudo isso, mas isso eu deixo a seu critério escolher ou não o Bootstrap: <!doctype html> <html lang="en" data-bs-theme="auto"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Hugo 0.118.2"> <title>Escola Bíblica</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> </head> <body> <main class="d-flex flex-nowrap"> <div class="flex-shrink-0 p-3" style="width: 280px;"> <a href="/" class="d-flex align-items-center pb-3 mb-3 link-body-emphasis text-decoration-none border-bottom"> <svg class="bi pe-none me-2" width="30" height="24"><use xlink:href="#bootstrap"/></svg> <span class="fs-5 fw-semibold">Instituto Servos<br>Escola Bíblica Dominical</span> </a> <ul class="list-unstyled ps-0"> <li class="mb-1"> <button class="btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#home-collapse" aria-expanded="true"> Secretaria </button> <div class="collapse show" id="home-collapse"> <ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small"> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Matrícula</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Matriculados</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Financeiro</a></li> </ul> </div> </li> <li class="mb-1"> <button class="btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#dashboard-collapse" aria-expanded="false"> Área do Aluno </button> <div class="collapse" id="dashboard-collapse"> <ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small"> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Cadastrar</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Editar</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Resultado</a></li> </ul> </div> </li> <li class="mb-1"> <button class="btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#orders-collapse" aria-expanded="false"> Classes </button> <div class="collapse" id="orders-collapse"> <ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small"> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Adulto</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Jovens</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">Adolescente</a></li> </ul> </div> </li> <li class="border-top my-3"></li> <li class="mb-1"> <button class="btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#account-collapse" aria-expanded="false"> Revistas </button> <div class="collapse" id="account-collapse"> <ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small"> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">2024</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">2023</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">2022</a></li> <li><a href="#" class="link-body-emphasis d-inline-flex text-decoration-none rounded">2021</a></li> </ul> </div> </li> </ul> </div> </main> </body> </html>
  8. CSS não é a minha praia, eu faço tudo por tentativa e erro desde 2020. Pelo que eu entendi, quem define a aparência é o arquivo style.css junto com o Bootstrap 3.3.7. Para dar vida ao conjunto, precisei do JQuery 3.3.7. O Bootstrap está na versão 5.2.3, mas colocar junto com o 3.3.7, isso só da confusão. Eu não sei de onde veio esse arquivo style.css, mas enfim a minha conclusão de amador é que tem css e js demais, eu tirei o máximo que eu pude para fazer o arquivo funcionar. Na minha opinião, o correto é trabalhar com um conjunto de css e js, tipo Bootstrap 5.2.3, e esquecer o JQuery e outros estilos particulares, mas eu sou amador. Para testar, usei esses códigos: arquivo Index.php <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <link rel="stylesheet" href="style.css"><!--formata as divs wraper em preto e branco--> <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script><!--suporte p/ o código no final do body--> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css"> <title>Escola Bíblica</title> </head> <body> <div class="wrapper"> <!-- Sidebar Holder --> <nav class="sidebar-header" id="sidebar"> <div class="sidebar-header"> <h3>Instituto Servos</h3> <strong>EBD</strong> <h3>Escola Bíblica Dominical</h3> </div> <ul class="list-unstyled components"> <li> <a href="#pageSubmenu1" data-toggle="collapse" aria-expanded="false"> <i class="bi bi-archive"></i>Secretaria</a> <ul class="collapse list-unstyled" id="pageSubmenu1"> <li><a href="form.html">Matrícula</a></li> <li><a href="listar_matric.html">Matriculados</a></li> <li><a href="#">Financeiro</a></li> <li><a href="#">Boletim</a></i></li> <li><a href="#">Contato</a></li> <li><a href="#">Certificados</a></li> </ul> </li> </nav> <div id="content"> <nav class="navbar navbar-default col-11" id="menu-superior"> <div class="container d-inline-block"> <div class="navbar-header"> <button type="button" id="sidebarCollapse" class="btn btn-info navbar-btn"> <i class="glyphicon glyphicon-align-left"></i> <span>Menu Lateral</span> </button> </div> <div class="collapse navbar-collapse me-2 p-1" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right d-lg-inline-block m-1"> <li><a href="#">Home</a></li> <li><a href="#">Cursos</a></li> <li><a href="#">Contato</a></li> <li><a type="button" data-toggle="modal" data-target="#cadastrarModal"> Cadastrar </a></li> <li><a href="entrar_aluno.html">Sou Aluno</a></li> <li><a href="entrar_professor.html">Sou Professor</a></li> </ul> </div> </div> </nav> <script type="text/javascript"> $(document).ready(function () { $('#sidebarCollapse').on('click', function () { $('#sidebar').toggleClass('active'); }); }); </script> </body> </html> --------------------------------------------------------------------------------------------------------- arquivo style.css @import "https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700"; a, a:hover, a:focus {color: inherit;text-decoration: none;transition: all 0.3s;} body {font-family: 'Poppins', sans-serif;background: #fafafa;} i, span {display: inline-block;} .navbar {padding: 15px 10px;background: #fff;border: none; border-radius: 0;margin-bottom: 40px;box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1);} .navbar-btn {box-shadow: none;outline: none !important;border: none;} p {font-family: 'Poppins', sans-serif;font-size: 1.1em;font-weight: 300; line-height: 1.7em;color: #999;} .line {width: 100%;height: 1px;border-bottom: 1px dashed #ddd;margin: 40px 0;} /* SIDEBAR STYLE */ .wrapper {display: flex;align-items: stretch;} #sidebar {min-width: 250px;max-width: 250px;background: #050505; color: #fff;transition: all 0.3s;} #sidebarCollapse{color: #f9f9ff;background-color: #050505;} #sidebarCollapse:hover{background-color: #f78707;color: #050505;} #sidebar.active {min-width: 80px;max-width: 80px;text-align: center;} #sidebar.active .sidebar-header h3, #sidebar.active .CTAs {display: none;} #sidebar.active .sidebar-header strong {display: block;} #sidebar ul li a {text-align: left;} #sidebar.active ul li a {padding: 20px 10px;text-align: center;font-size: 0.85em;} #sidebar.active ul li a i {margin-right: 0;display: block;font-size: 1.8em;margin-bottom: 5px;} #sidebar.active ul ul a {padding: 10px !important;} #sidebar.active a[aria-expanded="false"]::before, #sidebar.active a[aria-expanded="true"]::before { top: auto;bottom: 5px;right: 50%;-webkit-transform: translateX(50%); -ms-transform: translateX(50%);transform: translateX(50%);} #sidebar .sidebar-header {padding: 20px;background: #0c0c0c;} #sidebar .sidebar-header strong {display: none;font-size: 1.8em;} #sidebar ul.components {padding: 20px 0;border-bottom: 1px solid #ec680f;} #sidebar ul li a {padding: 10px;font-size: 1.1em;display: block;} #sidebar ul li a:hover {color: #f0a80e;background: #fff;} #sidebar ul li a i {margin-right: 10px;} #sidebar ul li.active > a, a[aria-expanded="true"] { color: #fff;background: #353536;} a[data-toggle="collapse"] {position: relative;} a[aria-expanded="false"]::before, a[aria-expanded="true"]::before { content: '\e259';display: block;position: absolute;right: 20px; font-family: 'Glyphicons Halflings';font-size: 0.6em;} a[aria-expanded="true"]::before {content: '\e260';} ul ul a {font-size: 0.9em !important;padding-left: 30px !important; background: #58585a;} ul.CTAs {padding: 20px;} ul.CTAs a {text-align: center;font-size: 0.9em !important; display: block;border-radius: 5px;margin-bottom: 5px;} a.download {background: #fff;color: #545557;} a.article, a.article:hover {background: #2d2d30 !important; color: #fff !important;} .navbar.navbar-default{background-color: #2a2a2b; color: #999;} #bs-example-navbar-collapse-1 ul li{background-color: #000000;} #bs-example-navbar-collapse-1 ul li a{color: #ddd;} #bs-example-navbar-collapse-1 a:hover{background-color: #f78707; color: #050505;transition: all 0.3s;} /* CONTENT STYLE */ #content {padding: 20px;min-height: 100vh;transition: all 0.3s;} /* MEDIAQUERIES */ @media (max-width: 768px) { #sidebar {min-width: 80px;max-width: 80px;text-align: center; margin-left: -80px !important ;} a[aria-expanded="false"]::before, a[aria-expanded="true"]::before { top: auto;bottom: 5px;right: 50%;-webkit-transform: translateX(50%); -ms-transform: translateX(50%);transform: translateX(50%);} #sidebar.active {margin-left: 0 !important;} #sidebar .sidebar-header h3, #sidebar .CTAs {display: none;} #sidebar .sidebar-header strong {display: block;} #sidebar ul li a {padding: 20px 10px;} #sidebar ul li a span {font-size: 0.85em;} #sidebar ul li a i {margin-right: 0;display: block;} #sidebar ul ul a {padding: 10px !important;} #sidebar ul li a i {font-size: 1.3em;} #sidebar {margin-left: 0;} #sidebarCollapse span {display: none;} }
  9. Alterei o <head> assim: <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <link rel="shortcut icon" href="/img/pngwing.com.png"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <!-- --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css"> <title>Escola Bíblica</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-1.12.0.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <!--script src="/js/Aula30.js" defer></script--> <link rel="stylesheet" href="style.css"> <!-- --> <!-- --> </head> E também alterei o final do <body> <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> <!-- --> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> <script src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js"></script> <!--script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script--> <script type="text/javascript"> $(document).ready(function () { $('#sidebarCollapse').on('click', function () { $('#sidebar').toggleClass('active'); }); }); </script> </body>
  10. Aqui está o mesmo código, dessa vez usando o motor PDO. O PDO não usa o ciclo while, mas com a ajuda do Bard, eu consegui emular o ciclo while do motor mysqli: <?php class controleEntrada { private $pdo, $solicitacao, $codigoProduto; public function __construct(){ $this->pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $this->pdo->query("drop table if exists entrada"); $this->pdo->query("create table entrada (id int auto_increment,dia date, id_item int, qt int, qtconsumida int, primary key (id) )"); $this->pdo->query("insert into entrada (dia,id_item,qt,qtconsumida) values ('2024-01-02',1,10,0), ('2024-01-03',1,10,0)");} public function inicio(){ $this->solicitacao=15; $this->codigoProduto=1; $stmt=$this->pdo->query("select * from entrada where qt <> qtconsumida and id_item=$this->codigoProduto order by dia"); $result=$stmt->fetchAll(PDO::FETCH_OBJ); $i=0; while($row=$result[$i]){ $id=$row->id; $disponivel=$row->qt-$row->qtconsumida; if($this->solicitacao>$disponivel){ $this->solicitacao-=$disponivel; $qtconsumida=$row->qtconsumida + $disponivel; $this->pdo->query("update entrada set qtconsumida=$qtconsumida where id=$id"); $disponivel=0;} if($this->solicitacao<=$disponivel){ $qtconsumida=$row->qtconsumida + $this->solicitacao; $this->pdo->query("update entrada set qtconsumida=$qtconsumida where id=$id"); $this->solicitacao=0;} if($this->solicitacao==0){break;} $i++;} $this->conferir();} public function conferir(){ $stmt=$this->pdo->query("select * from entrada"); var_dump($stmt->fetchAll(PDO::FETCH_OBJ));} } $controle=new controleEntrada(); $controle->inicio();
  11. Eu criei um arquivo para cada tabela dentro da pasta Modelos, mas isso acabou virando uma enorme linguiça. Faz sentido você ter um Controle para cada tabela, mas no caso do Modelo, achei melhor abandonar a ideia de criar um arquivo para cada tabela. Ao invés disso, eu criei um pseudo Query Builder dentro do arquivo Modelos/Conexao.php, assim: <?php class Conexao { private static $pdo; public function __construct(){} public static function instancia(){ $dbname="diario"; $user="root"; $password=""; if(!self::$pdo){ self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);} return self::$pdo;} public function select($sql){ $stmt=$this->instancia()->query("select $sql"); return $stmt->fetchAll(PDO::FETCH_OBJ);}} Eu não lembro de onde copiei esse código, só sei que não posso usar a variável $this->pdo, no lugar dele, estou usando a função instancia( ). O que inventei foi a função select( ), e eu uso essa função no Controle assim: arquivo MVC > Controles > ControleDiario.php (listagem parcial) public function inicio(){ $dia=date('Y-m-d'); if(isset($_SESSION['dia'])){$dia=$_SESSION['dia'];} $lctos=$this->Conexao->select("* from tbdiario where dia='$dia' order by lcto"); $somaDebito=$this->Conexao->select("sum(valor) as soma from tbdiario where dia='$dia' and contad is not null")[0]->soma; $somaCredito=$this->Conexao->select("sum(valor) as soma from tbdiario where dia='$dia' and contac is not null")[0]->soma; require VISAO . '/Diario.php'; exit;} Note que eu não uso a palavra select na redação da consulta. Isso está bem longe do Eloquent do Laravel, mas já é um começo.
  12. Gostei da ideia do campo quantidade consumida na tabela entrada, eu fiz esse código. Espero que ele lhe ajude: <?php $mysqli=new mysqli("localhost","root","","diario"); $mysqli->query("drop table if exists entrada"); $mysqli->query("create table entrada ( id int auto_increment, dia date, id_item int, qt int, qtconsumida int, primary key (id) )"); $mysqli->query("insert into entrada (dia,id_item,qt,qtconsumida) values ('2024-01-02',1,10,0), ('2024-01-03',1,10,0)"); $solicitacao=15; $codigoproduto=1; $query=$mysqli->query("select * from entrada where qt <> qtconsumida and id_item=$codigoproduto order by dia"); while($row=$query->fetch_assoc()){ $id=$row['id']; $disponivel=$row['qt']-$row['qtconsumida']; if($solicitacao>$disponivel){ $solicitacao-=$disponivel; $qtconsumida=$row['qtconsumida']+$disponivel; $mysqli->query("update entrada set qtconsumida=$qtconsumida where id=$id"); $disponivel=0;} if($solicitacao<=$disponivel){ $qtconsumida=$row['qtconsumida']+$solicitacao; $mysqli->query("update entrada set qtconsumida=$qtconsumida where id=$id"); $solicitacao=0;} if($solicitacao==0){break;}} // conferindo: $query=$mysqli->query("select * from entrada"); var_dump($query->fetch_all(MYSQLI_ASSOC));
  13. Para testar o seu código, eu fiz as seguintes modificações: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <style> body {width:800;margin:0 auto} </style> <?php class Implementa { public function setTable(){} public function setTermos(){}} class ServiceDb { public function listar(){ return json_decode(json_encode([['data_entrada'=>'2024-01-25','qtd'=>5, 'valor'=>10,'valor_unitario'=>2]]));}} class Config { public function Fdb($dia){ return date('d/m/y',strtotime($dia));}} $data=new Config(); $saidas=json_decode(json_encode([['nome'=>'Frank','fornecimento'=>'resma', 'qtd_solicitada'=>10,'id_item'=>1]])); $numerar=0; foreach ($saidas as $s): ?> <div class='linha_item row col-12 input-group text-center'> <input id='item_$s->id' type='hidden' name='id_item[$s->id]' sue='' /> <div class='contagem form-control pl-5'> <?php $numerar++; ?> </div> <div class='desc form-control'> <?=$s->nome?> </div> <div class='fornecimento form-control'> <?=$s->fornecimento?> </div> <div class='fornecimento form-control'> <?=$s->qtd_solicitada?> </div> </div> <div class='linha_item row col-12 input-group text-center'> </div> <?php $ent = NEW Implementa(); $ent->setTable("entradas"); $ent->setTermos(" WHERE id_item = " . $s->id_item . " AND qtd > qtd_consumida ORDER BY data_entrada ASC "); $exec_ent = NEW ServiceDb($ent); $entradas = $exec_ent->listar(); echo "<span class='mt-1 ml-4'>Entradas</span>"; foreach($entradas as $e): ?> <div class='col-12 input-group text-center ml-3'> <div class='contagem form-control'> Data: <?=$data->Fdb($e->data_entrada)?> </div> <div class='contagem form-control'> Quantidade: <?=$e->qtd?> </div> <div class='contagem form-control'> Valor: <?=$e->valor_unitario?> </div> <div class='contagem form-control'> Sair com: <input id='item_$e->id' type='text' name='id_item[$s->id]' value=<?=$s->qtd_solicitada?> /> </div> </div> </div> <?php endforeach; echo "<br>"; endforeach;?>
  14. Eu acho muito difícil passar adiante as resmas mais antigas do que as mais novas, principalmente porque a turma da entrega tem mania de empilhar as novas resmas por cima das mais antigas. No MySQL, eu não teria a menor ideia de como fazer um controle de saída de acordo com o controle de entrada. No meu projeto, eu criei duas tabelas para controlar o estoque: o produto e a história do produto. O produto tem o id e a descrição. A história do produto tem id, id do produto, lançamento, quantidade, custo. A quantidade é positiva quando ocorre a entrada. A quantidade é negativa quando ocorre a saída. O problema é calcular o custo, assim: <?php $mysqli=new mysqli("localhost","root","","diario"); if(isset($_GET['quantidadeSolicitada']){ $qt=$_GET['quantidadeSolicitada']*(-1); $codProduto=$_GET['codigoProduto']; $lancamento=$_GET['lancamento']; $query=$mysqli->query("select sum(quantidade) as estoque, sum(custo) as total from tbhistprod where idProduto=$codProduto"); $rows=$query->fetch_all(MYSQLI_ASSOC); $estoque=$rows['estoque']; $total=$rows['total']; $media=intval($estoque/$total*100)/100; $custoSolicitacao=$media*$qt; $mysqli->query("insert into tbhistprod (lancamento,idProduto,quantidade,custo) values ($lançamento,$codProduto,$qt,$custoSolicitacao");}
  15. Lá em 2020, eu não tinha a conta estoque no plano de contas, mas eu queria ter um pouco mais de controle nas despesas. Assim eu inventei a tabela produtos e histórico de produtos. Mas em 2022, surgiu a conta estoque no plano de contas. Para ter um controle melhor, eu precisava impor a regra "a soma dos produtos tem que ser igual à soma dos registros contábeis". O problema é que a tabela produtos já contava com centenas de itens que representavam despesas. Pensei em criar uma nova tabela para separar o que é estoque do que é despesa, mas achei melhor usar a tabela produtos para fazer esse serviço. Encontrei o campo local, e lá eu defini o valor "a24" (abreviatura pessoal para "fora da prateleira"). Tentei fazer uma consulta, o valor do estoque é a soma do custo total onde o produto não está na prateleira "a24". Não deu certo, haviam muitos registros com valor null no local. Levei um tempão para mudar o valor padrão do campo local de null para ''. Depois disso, eu fiz a consulta no PHP: $query=$myqli->query("select sum(custototal) as soma from tbhistprod join tbprod on tbprod.codprod = tbhistprod.codprod where loc <> "a24" and custototal > 0"); $total=$query->fetch_all(MYSQLI_ASSOC)[0]['soma']; O problema é como converter isso na gramática do Eloquent. Pedi ajuda para o Bard, e ele meu um exemplo: $total = Tbhistprod::join('tbprod', 'tbhistprod.idprod', '=', 'tbprod.id') ->where('tbprod.loc', '!==', 'a24') ->sum('custo'); O código não funcionou, mas desconfiei do operador "!==", ele não é da gramática do MySQL. Ajeitei o meu código, e ele funcionou: $total=tbhistprod::join('tbprod','tbhistprod.codprod','=','tbprod.codprod') ->where('tbprod.loc','<>','a24') ->where('custototal','>',0) ->sum('custototal');
  16. O meu livro Diário começou em setembro de 2020, consegui resolver o problema da apuração, criando um botão para cada período contábil. O problema é que o tempo passou e chegamos em 2024, agora eu tenho um monte de botão. Eu preciso dos botões para mudar o período de apuração, a minha saída foi diminuir o tamanho deles: arquivo MVC > Visoes > Apuracao.php <?php include 'menu.php'; foreach($apuracoes as $apuracao){ $ano = substr($apuracao->apuracao,0,4); $mes = substr($apuracao->apuracao,5,2); if(!isset($anoAnterior)){echo $ano ." ";$anoAnterior=$ano;} if($ano!==$anoAnterior){echo "<br>" . $ano ." <a href=?apurar=$apuracao->apuracao>$mes</a> "; $anoAnterior=$ano;} else { echo " <a href=?apurar=$apuracao->apuracao>$mes</a> ";}}
  17. Frank K Hosaka

    MySQL 8.0.35

    Estudando um pouco mais o only_full_group_by da versão 8.0.35 do MySQL, eu entendi que a consulta agrupamento só vai funcionar se você agrupar todos os campos que forem selecionados, assim: CREATE OR REPLACE VIEW `vw_bal1` AS SELECT `conta`, `descricao` FROM `tbconta` GROUP BY `conta`,`descricao` ORDER BY `conta`
  18. Frank K Hosaka

    MySQL 8.0.35

    Em 2020, eu criei uma consulta no MySQL assim: CREATE VIEW `vw_apuracao_antigo` AS SELECT DATE_FORMAT(`tbdiario`.`dia`, '%Y-%m') AS `apuracao` FROM `tbdiario` GROUP BY YEAR(`tbdiario`.`dia`) , MONTH(`tbdiario`.`dia`) ORDER BY DATE_FORMAT(`tbdiario`.`dia`, '%Y-%m') DESC Essa consulta também funcionou no servidor compartilhado do Hostinger em 2023. Mas na hora de mudar para o servidor VPS aqui em 2024, recebi a mensagem de que a consulta estava errada. A versão do MySQL no servidor VPS é 8.0.35 e não 8.0.31, ou seja, a nova versão não permite mais usar gambiarra. Entrei em pânico, eu fui logo conversar com o Barder, e ele confirmou que a consulta estava errada mesma. Ele sugeriu consertar, mas o código que ele me passou não fazia o menor sentido. Outra sugestão que ele me deu é de eu entrar no labirinto do Linux e alterar a configuração do MySQL e fazer com que ele aceite gambiarra. O Barder é bacana, mas tem hora que ele me tira do sério. Eu sei que a minha consulta é gambiarra, mas como eu não entendo nada de MySQL, não tive outra escolha senão melhorar a minha gambiarra, assim: CREATE VIEW `vw_apuracao` AS SELECT DATE_FORMAT(`tbdiario`.`dia`, '%Y-%m') AS `apuracao` FROM `tbdiario` GROUP BY `apuracao` ORDER BY `apuracao` DESC A minha nova gambiarra deu certo na versão 8.0.31 bem como na versão 8.0.35 do servidor VPS. Claro, o fato da consulta funcionar em versões diferentes não implica necessariamente que ele esteja certo.
  19. Frank K Hosaka

    O domínio

    Faz um ano que adquiri um domínio na internet: astudy.net, e com ele criei um projeto chamado orçamento, um em PHP e outro em Laravel. Os dois fazem a mesma coisa e usam o mesmo banco de dados. Agora, estou entrando em uma nova aventura. Estou saindo do serviço compartilhado para o serviço VPS. O VPS é bem diferente, usa uma nova gramática chamada "site" e "subdomínio". Eu apanhei bastante, mas consegui montar o mesmo esquema que eu tinha no serviço compartilhado. Ao invés de escrever astudy.net para o php e astudy.net/laravel para o laravel, eu vou escrever php.astudy.net e laravel.astudy.net. O problema é como transferir o dominio astudy.net do serviço compartilhado para o VPS, eu não não achei nenhum tutorial para isso. Pedi ajuda para a equipe técnica, e eles me orientaram a criar um novo registro do tipo A com o nome de @ para o IP do VPS no gerenciador de DNS. Nunca pensei que fosse tão simples mudar o domínio de um serviço compartilhado para o VPS. O problema foi na hora de atualizar a tela. O meu registro desapareceu. Tentei criar o registro de novo, mas ele disse que já existia aquele registro (o único problema é que eu não podia enxergar no painel dos registros do DNS). Seja como for, o VPS tem um novo vocabulário para fazer a mesma coisa. Ele tem um sistema operacional chamado Ubuntu. Só que ele não tem o programa nodejs e o npm. Eu tentei instalar, e não foi fácil. Fiquei tão perdido com as mensagens do Ubuntu que eu tive que destruir todo o servidor VPS pelo menos quatro vezes. Eu apanhei demais para entender o que é SSH User, até que eu tive que aprender na base da surra de que só pode haver um SSH User para cada site. Esses programas são importantes para instalar novos facilitadores no Laravel, eu só trabalhei com o básico, o Eloquent. Com o Ubuntu, eu posso instalar o Breezer, o LiveWire, o Blade, que eu conheci aqui no meu notebook, mas o serviço compartilhado não permitia instalar. O Laravel é fantástico, mas eu não tenho a menor ideia de como ele funciona. Por isso é que eu preciso do PHP, desde o ano passado que estou mudando a linguagem funcional para a linguagem de objetos. Esse é um mundo bacana, claro, quando você consegue fazer as coisas funcionarem.
  20. Depois de quase uma semana, eu finalmente consegui instalar o Laravel, projeto Chirp. Ele inclui o serviço de autenticação Breezer, alguns comandos adicionais do Blade bem como o CSS Tailwind. Eu optei por usar o Ubuntu com CloudPanel, onde aprendi a criar subdomínio e com ele o site correspondente, depois de instalar o certificado SSL além do auto-assinado. A surpresa é que eu não encontrei o nodejs e nem o npm no Ubuntu, precisei ver vários tutoriais para instalar e atualizar esses programas que são essenciais para turbinar o Laravel. Linux não é fácil, principalmente se você usar o terminal VNC da Hostinger. Como o Laravel não permite criar o projeto com a conta root, eu criei uma conta chamada frank. Para a minha surpresa, eu consegui instalar e atualizar o nodejs e o npm na conta root, mas a conta frank ficou restrito a uma versão anterior que não dava para usar para atualizar o laravel. Assim, eu tive que aprender a como conceder o privilégio de root para a conta frank. Agora que estou mais tranquilo, muito em breve vou transferir o dominio para o novo servidor vps.
  21. Não é necessário mudar o Windows para a conta local para usar o WinCSP, e eu só consegui conectá-lo duas vezes no servidor VPS do Hostinger. Já o programa Filizolla não consegui nenhuma vez. O único que deu certo foi o protocolo SSH embutido no VS Code, mas teve uma hora que não consegui conexão porque precisei mexer no servidor. Mas encontrei um tutorial pedindo para limpar o arquivo SSH na pasta temporária do usuário do Windows, e o VS Code voltou a funcionar. O SSH usa os mesmos comandos do Ubuntu, só que ele não é capaz de alertar o sistema. Para isso é preciso usar o terminal VNC disponível no painel do Hostinger.
  22. Ontem, eu fui conferir a fatura do cartão de crédito e levei um baita susto: R$ 1.057,85. Um dos itens mencionava o aluguel do VPS da Hostinger por dois anos de R$ 719,76. Eu imaginava que ia ser 24 vezes R$ 29,99. Voltei no portal da Hostinger e vi que o idiota fui eu que tenho preguiça de ler o terceiro parágrafo:
  23. Estou tendo problemas no CloudPanel do servidor vps do Hostinger, ele não tem a opção de fazer upload de pastas, só de arquivos. Tentei usar o protocolo ftp, mas não consegui fazer a conexão. Pedi ajuda para Hostinger, e eles só me deram um link e o navegador reclamou que aquele link não existe. Tem um outro link que explica que o ftp não funciona porque eu configurei errado. Fiquei desesperado, então eu tentei usar o protocolo SSH, apesar de eu não saber nada de Linux. Com a ajuda do Bard, descobri que 'ls' mostra os arquivos; 'cd' muda de diretório; 'cd ..' muda para o diretório acima, e assim eu consegui chegar no root. Lá eu vi um monte de diretórios nada familiares. Por tentativa e erro, eu fui no diretório home, e lá eu vi um ambiente bem mais familiar, é o que eu consigo enxergar no gerenciador de arquivos do CloudPanel. O problema é na hora de usar o scp, ele não funciona. Usei assim: scp -r C:/wamp64/www/laravel root@vps.astudy.net:/home/astudy-vps/htdocs/vps.astudy.net A minha tese é que o protocolo SSH não tem permissão de ver o Windows. O Bard corroborou a minha tese, e ele disse que eu preciso usar o protocolo SFTP, ele indicou o programa WinCSP. E asim, encontrei um novo problema: ele pede o nome do computador, o nome do usuario, a senha, e ficou assim: GALAXYSBOOKLAPTOP-70TC6THO, porta 22, astudy@hotmail.com,****. A conexão foi recusada. A minha tese é que preciso criar uma conta local no Windows para poder trabalhar com o WinCSP. Alguém pode confirmar, antes de fazer a besteira de mudar o Windows?
  24. Tentei instalar o certificado de segurança SSL no subdomínio laravel, mas eu não consegui. Eu ainda sou bem novato nessa área, eu não sei o que é "site" e "servidor", o máximo que eu aprendi mais ou menos é o gerenciador de arquivos. Então, eu fui no subdomínio vps (esse é o único que eu consegui instalar o certificado SSL), e eu criei um subdiretório chamado Laravel. Dentro dele, criei o seguinte arquivo arquivo Index.php <?php echo "você está no subdiretório laravel"; Eu fui no navegador e digitei vps.astudy.net/laravel e consegui executar o código. Eu fiquei feliz da vida! Pensei que eu tinha encontrado uma porta de entrada para instalar o laravel no servidor vps do hostinger. A alegria durou bem pouco. Olhando o CloudPanel, eu vi que não existe a opção de fazer a opção de fazer upload de pasta. A única esperança é usar um cliente ftp do notebook. Eu tenho o FileZila, mas ele não conseguiu conectar no ftp:vps.astudy.net com o usuário frank-ftp na porta 21. A outra esperança é o protocolo SSH, o grande problema é que eu não manjo nada de Linux. Enfim, estou espantando com a Hostinger, eu não sei como ela pretende alugar o servidor VPS se o usuário não sabe absolutamente nada de Linux, Servidor, Site, CloudPanel, ftp, ssh, ssl, php, html como é o meu caso.
  25. Hoje de madrugada, um técnico da Hostinger me explicou que não basta ter um certificado de segurança (SSL) auto assinado para o site funcionar. Na base da tentativa e erro, eu consegui instalar o certificado de segurança, depois de ficar algumas horas no editor de DNS, eu apaguei alguns registros que não foram criados por mim do tipo "A", e só deixei o registro do tipo "A" para o meu domínio e o meu subdomínio. O subdomínio foi apontado para o IP do servidor VPS. Criei um site baseado no PHP genérico, e depois de instalar o certificado de segurança, eu consegui acessar o meu subdomínio pelo navegador, e eu vi "olá mundo", o que era esperado, pois o site só tem um index.php. Eu tive alguns problemas na hora de instalar o banco de dados. Eu chamei o banco de dados de "diario", mas o aplicativo do Hostinger chamou de "Diario". Enfim, eu tive que editar o código PHP para conectar no banco de dados com a letra capitalizada. Acredito que o problema é o sistema, o meu notebook é baseado no Windows e o servidor VPS deve trabalhar apenas com o Linux. O estranho é que eu criei ontem o subdomínio laravel no editor de DNS, criei um novo site baseado no Laravel 10, mas não consegui instalar o certificado de segurança (acredito que tenho que esperar 24 horas). Mesmo assim, eu consegui abrir o Laravel usando o novo subdomínio no navegador, fiquei abismado com essa proeza de abrir o projeto laravel que está hospedado em outra plataforma.
×
×
  • Criar Novo...