Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.678
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. O código que eu publiquei é simplista, ele não usa o objeto Request e nem o objeto Contato que aparecem no tutorial original, isso porque reduzi todo o PDO para o método query, e deixei de lado o conceito de objeto estático, não sei quando vou usar esse tipo de objeto ou quando vou usar outros métodos do PDO. O que eu mais gostei do tutorial foi do roteador, ele é o mais simples que eu encontrei na internet, ele usa duas chaves para identificar o destino do código, o controle e o seu método. Na minha versão, eu tirei as chaves. Outra coisa bacana é autoload, o do tutorial só serve para quem colocar todos os arquivos no diretório raiz. Eu distribui os arquivos em pastas diferentes, logo o autoload tem que ser mais robusto, e tive a sorte de encontrar na internet. O problema é que a vida do autoload é bem curta. O melhor lugar para colocar o autoload é no controle principal, pois todas as outras classes vão invocá-lo, através do comando extends na hora de definir a classe. E sem dúvida o controle também é o mehor lugar para manter conectado todo o projeto à sessão. O tutorial não usa a sessão, mas eu usei no meu projeto. A sessão é importante para mim, essa foi a única forma que eu encontrei para voltar ao ponto de partida.
  2. PHP $query=$mysqli->query("select date(horavenda) as vendido , sum(total) as total from tbpedido where horavenda is not null group by date(horavenda) order by date(horavenda) desc"); $groups=json_decode(json_encode($query->fetch_all(MYSQLI_ASSOC))); Laravel $groups=tbpedido::whereNotNull('horavenda') ->select(DB::raw('date(horavenda) as vendido, sum(total) as total')) ->groupBy(DB::raw('date(horavenda)')) ->orderBy(DB::raw('date(horavenda)'),'desc')->get();
  3. Depois de resolver o problema do autoload e do roteador sem Composer, hoje eu consegui resolver o problema da página anterior. Por exemplo, eu tenho uma página chamada Lançamentos.php, lá dentro tenho uma lista de produtos que fazem parte dos detalhes daquele lançamento; para acrescentar, alterar ou excluir o produto, eu vou ter que ir até outro controle que faça esse serviço. O problema é como voltar na página que deu origem ao serviço. Olha só a solução: Arquivo Visoes > Lancamento.php <?php include 'menu.php'; $_SESSION['uri']=$_SERVER['REQUEST_URI']; ?> <!-- ... --> <a href="?controller=ControleProduto&method=excluirItem&excluirItem=<?=$prod->id?>"> <?=$prod->un?></a> Arquivo Controles > ControleProduto.php <?php session_start(); class ControleProduto extends Controller { private $Conexao; public function __construct(){ $this->Conexao=new Conexao();} public function excluirItem(){ $id=$_GET['excluirItem']; $this->Conexao->delete("tbhistprod where id=$id"); return header("location:".$_SESSION['uri']);} }
  4. Fiz mais uma tentativa, acrescentando <tr><td colspan=5>, ou seja, inclui o cabeçalho dentro da <table> e deu certo. A minha tese é de que só dá para colocar um <form> dentro do <td> para apresentar numa só "linha". Essa solução funcionou no Laravel, mas no MVC não funcionou. Nessa nova tentativa, estou tentando colocar quatro controles numa só linha, só que nenhum deles é <form>: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/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> <style>body{width:500px;margin:10 auto} .linha{line-height:0px}</style> <?php $dia='2024-02-06'; $mensagem=""; ?> <table class='table table-striped'> <tr><td colspan=5> <input type=submit value=Lançamentos onclick="location.replace('?controller=ControleDiario&method=novoLcto')"> do dia <input type=date name=novaData value=<?=$dia?> onchange="location.replace('?controller=ControleDiario&method=novaData&novaData='+this.value)"> <?=$mensagem?> <tr><th>Lçto<th>CtaD<th>CtaC<th>Valor<th>Histórico <tr class='linha'><td>111<td>100<td>200<td>12,00<td>Teste <tr class='linha'><td>111<td>100<td>200<td>12,00<td>Teste </table> Importante: na codificação convencional, só dá para criar uma solicitação através do <form>. No meu caso, deu para criar uma solicitação com o JavaScript embutido no <input>, porque tenho um roteador dentro do arquivo index.php. Ou seja, se eu soubesse como desenhar o HTML com o <div>, toda essa gambiarra não seria necessária. O problema é o tempo, eu sou um programador desesperado que apela para soluções desesperadas.
  5. Um programador profissional usa o marcador <div> para desenhar a página. Não é o meu caso, eu sei só usar o <table><tr><td></table>. O Bader recomenda usar </td></tr> para ajudar a página renderizar a <table> de forma correta. Mas depois de tanta tentativa & erro, desisti de usar os fechadores das células e linhas. Eu tentei colocar dois <form> dentro de um <td>, mas um ficou em cima do outro. Tentei alinhar de várias maneiras, e todas elas afetavam as <tr> de baixo, mesmo usando colspan=5. Perguntei para o Bard o que havia entre o <table> e o <tr> e ele disse que existem o <caption> e <thead>. Eu tentei experimentar e ficou um horror, os pés ficaram no lugar das mãos. Decidi não usar os novos marcadores, e me aventurei a colocar os meus <form> entre o <table> e o <tr>. Deu quase tudo certo, o problema é que não dá para centralizar, aumentar a margem inferior, ou aumentar a margem superior a partir da <tr> de baixo. Acho que eu encontrei o buraco negro do HTML, onde nenhum CSS é capaz da escapar da força gravitacional do abismo. Tentei deixar como está, mas os dois <form> me deixaram intrigados. Para que eu preciso deles, se o <input> pode resolver tudo? Pensei em até fazer fazer duas <table> separadas, mas ali havia um espaço que não consegui eliminar. E o código acabou ficando assim: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/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> <style>body{width:500px;margin:10 auto} .linha{line-height:0px}</style> <?php $dia='2024-02-06' ?> <table class='table table-striped'> <input type=submit value=Lançamentos onclick="location.replace('?controller=ControleDiario&method=novoLcto')"> do dia <input type=date name=novaData value=<?=$dia?> onchange="location.replace('?controller=ControleDiario&method=novaData&novaData='+this.value)"> <tr><th>Lçto<th>CtaD<th>CtaC<th>Valor<th>Histórico <tr class='linha'><td>111<td>100<td>200<td>12,00<td>Teste <tr class='linha'><td>111<td>100<td>200<td>12,00<td>Teste </table>
  6. Eu pensei que o problema era o CSS do Bootstrap, mas usando o Microsoft Edge, eu vi que o problema não é o CSS. Por enquanto, vou continuar usando o Google Chrome, pois ele é capaz de fazer o download de arquivo .pdf Para resolver o problema da visibilidade da senha no Google Chrome, eu fiz essa bela gambiarra: <?php require VISAO.'/Basico.html'; ?> <main style=margin-top:150px class='w-25 mx-auto'> <?php if(isset($mensagem)):if($mensagem!==""): ?> <div class="alert alert-success"> <?=$mensagem?> </div> <?php endif;endif; ?> <form method=post> <h1 class="h3 mb-3 fw-normal text-center">Projeto MVC</h1> <div class="form-floating"> <input type="email" class="form-control" name=email autofocus required> <label>Email</label> </div> <div class="form-floating"> <input type="password" class="form-control" name="senha" id=senha required ondblclick="senha.type='text'"> <label>Duplo click para ver a Senha</label> </div> <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button> </form> </main>
  7. config > app.php <?php use Illuminate\Support\Facades\Facade; use Illuminate\Support\ServiceProvider; return [ 'name' => env('APP_NAME', 'Laravel'), 'env' => env('APP_ENV', 'production'), 'debug' => (bool) env('APP_DEBUG', false), 'url' => env('APP_URL', 'http://localhost'), 'asset_url' => env('ASSET_URL'), 'timezone' => 'America/Sao_Paulo', // é aqui 'locale' => 'en', 'fallback_locale' => 'en', 'faker_locale' => 'en_US', 'key' => env('APP_KEY'), 'cipher' => 'AES-256-CBC', 'maintenance' => [ 'driver' => 'file',], 'providers' => ServiceProvider::defaultProviders()->merge([ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class,])->toArray(), 'aliases' => Facade::defaultAliases()->merge([])->toArray(),]; O Bard havia sugerido editar o arquivo .env e também mexer no Apache. Eu tenho pavor de mexer no Apache.
  8. <?php $mysqli=new mysqli("localhost","root","","diario"); $query=$mysqli->query("select dia,sum(custototal) as estoque from tbhistprod group by dia order by dia"); $result=$query->fetch_all(MYSQLI_ASSOC); $dias=[]; foreach($result as $key=>$value){ $dias=array_merge($dias,[$value['dia'] => $value['estoque']]);} if(array_key_exists('2024-02-05',$dias)){ echo $dias['2024-02-05'];}
  9. Para testar o código acima, você pode usar esse aplicativo em PHP, depois de salvar o código acima (tudo) no arquivo script.txt no diretório raiz do C:/Wamp64/www: arquivo ScriptIn.php <?php if (!is_dir("Astudy")){ mkdir("Astudy"); mkdir("Astudy/Controles"); mkdir("Astudy/Modelos"); mkdir("Astudy/Visoes");} $script=file_get_contents("script.txt"); $ocorrencias=substr_count($script,"arquivo /Astudy/"); $substring = "arquivo /Astudy/"; $posicao = []; $posicao[0]=strpos($script,$substring); for($i=1;$i<=$ocorrencias-1;$i++){ $posicao[$i]=strpos($script,$substring,$posicao[$i-1]+1);} $codigo=[]; for($i=0;$i<=$ocorrencias-2;$i++){ $codigo[]=substr($script,$posicao[$i],$posicao[$i+1]-$posicao[$i]);} $codigo[]=substr($script,$posicao[$ocorrencias-1],strlen($script)-$posicao[$ocorrencias-1]); for($i=0;$i<=$ocorrencias-1;$i++){ $lines=explode("\n",$codigo[$i]); $arquivo=trim(substr($lines[0],9)); $criar=fopen($arquivo,"w"); $tamanhoNome=strlen($arquivo)+9; $conteudo=trim(substr($codigo[$i],$tamanhoNome)); file_put_contents($arquivo,$conteudo); fclose($criar);} echo "Trabalho encerrado";
  10. Baseado no tutorial de Alexandre nesse endereço: PHP::CRUD COM MVC – Alexandre Bezerra Barbosa (wordpress.com) eu fiz algumas modificações, assim: arquivo /Astudy/Controles/Controle.php <?php require_once $_SERVER['DOCUMENT_ROOT']."/Astudy/Modelos/Config.php"; class Controle { public function view($arquivo, $array = null) { if (!is_null($array)) { foreach ($array as $var => $value) {${$var} = $value; } } ob_start(); include VISOES . "$arquivo.php"; ob_flush(); } } arquivo /Astudy/Controles/ControleContato.php <?php class ControleContato extends Controle { private $Conexao; public function __construct(){ $this->Conexao=new Conexao(); $conta=$this->Conexao->select("count(*) as conta from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'contatos'")[0]->conta; if($conta==0){ $this->Conexao->exec('create table contatos ( id int unsigned auto_increment primary key,nome varchar(80) not null, telefone varchar(20) default null,email varchar(80) default null)'); }} public function atualizar(){ $id=$_POST['id']; $nome=$_POST['nome']; $telefone=$_POST['telefone']; $email=$_POST['email']; $this->Conexao->update("contatos set nome='$nome', telefone='$telefone', email='$email' where id=$id"); return $this->listar();} public function criar(){return $this->view('form');} public function editar(){ $id=$_GET['editar']; $contato=$this->Conexao->select("* from contatos where id=$id")[0]; return $this->view('form', ['contato' => $contato]); } public function excluir(){ $id=$_GET['id']; $this->Conexao->delete("contatos where id=$id"); return $this->listar();} public function listar(){ $contatos = $this->Conexao->select("* from contatos"); return $this->view('grade', ['contatos' => $contatos]);} public function salvar(){ $nome=$_POST['nome']; $telefone=$_POST['telefone']; $email=$_POST['email']; $this->Conexao->insert("contatos (nome,telefone,email) values ('$nome','$telefone','$email')"); return $this->listar();} } arquivo /Astudy/Index.php <?php require __DIR__ ."/Modelos/Config.php"; if($_GET){ $comando=explode('_',key($_GET)); $controle=new $comando[0]; $funcao=$comando[1]; if(count($comando)==3){ $_GET[$funcao]=$comando[2];} call_user_func(array($controle,$funcao));} else {require VISOES . "inicio.php";} arquivo /Astudy/Modelos/Conexao.php <?php class Conexao { private static $conexao; public function delete($sql){ return $this->getInstance()->query("delete from $sql");} public function exec($sql){ return $this->getInstance()->query($sql);} public static function getInstance() { if (is_null(self::$conexao)) { self::$conexao = new PDO('mysql:host='.HOST.';dbname='.DBNAME, USER, PASSWORD); self::$conexao->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); self::$conexao->exec('set names utf8');} return self::$conexao;} public function insert($sql){ return $this->getInstance()->query("insert into $sql");} public function select($sql){ $stmt=$this->getInstance()->query("select $sql"); return $stmt->fetchAll(PDO::FETCH_OBJ);} public function update($sql){ return $this->getInstance()->query("update $sql");} } arquivo /Astudy/Modelos/Config.php <?php date_default_timezone_set('America/Sao_Paulo'); define("PROJETO",'Astudy'); defined('CONTROLES') || define('CONTROLES',$_SERVER['DOCUMENT_ROOT'].'/' .PROJETO . '/Controles/'); defined('MODELOS') || define('MODELOS',$_SERVER['DOCUMENT_ROOT'].'/' . PROJETO . '/Modelos/'); defined('VISOES') || define('VISOES',$_SERVER['DOCUMENT_ROOT'].'/' . PROJETO . '/Visoes/'); defined('HOST') || define('HOST',"localhost"); defined('DBNAME') || define('DBNAME',"diario"); defined('USER') || define('USER',"root"); defined("PASSWORD") || define('PASSWORD',''); spl_autoload_register(function($Class){ $includeDir = false; $findDir = ['Controles','Modelos','Visoes']; foreach ($findDir as $DirName) { if (!$includeDir && file_exists(FindClass($DirName, $Class)) && !is_dir(FindClass($DirName, $Class))) { include_once (FindClass($DirName, $Class)); $includeDir = true;}} if (!$includeDir) { die("$Class - Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); function FindClass($dir, $class) { return ( $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . PROJETO . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $class . '.php');} arquivo /Astudy/Visoes/basico.html <!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"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/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> <style> body {width:1000px;margin:0 auto} </style> arquivo /Astudy/Visoes/form.php <?php include "basico.html"; ?> <div class="container"> <form action="?ControleContato.<?php echo isset($contato->id) ? "atualizar&id={$contato->id}" : "salvar"; ?>" method="post" > <div class="card" style="top:40px"> <div class="card-header"> <span class="card-title">Contatos</span> </div> <div class="card-body"></div> <div class="form-group d-flex justify-content-end"> <label style="width:10%">Nome:</label> <input type="text" class="form-control" name="nome" id="nome" value="<?php echo isset($contato->nome) ? $contato->nome : null; ?>" /> </div> <div class="card-body"></div> <div class="form-group d-flex justify-content-end"> <label style="width:10%">Telefone:</label> <input type="text" class="form-control" name="telefone" id="telefone" value="<?php echo isset($contato->telefone) ? $contato->telefone : null; ?>" /> </div> <div class="card-body"></div> <div class="form-group d-flex justify-content-end"> <label style="width:10%">Email:</label> <input type="text" class="form-control" name="email" id="email" value="<?php echo isset($contato->email) ? $contato->email : null; ?>" /> </div> <div class="card-body"></div> <div class="card-footer"> <input type="hidden" name="id" id="id" value="<?php echo isset($contato->id) ? $contato->id : null; ?>" /> <button class="btn btn-success" type="submit">Salvar</button> <a class="btn btn-danger" href="?ControleContato.listar">Cancelar</a> </div> </div> </form> </div> arquivo /Astudy/Visoes/grade.php <?php include "basico.html"; ?> <h1>Contatos</h1> <hr> <div class="container"> <table class="table table-bordered table-striped" style="top:40px;"> <thead> <tr> <th>Nome</th> <th>Telefone</th> <th>Email</th> <th><a href="?ControleContato.criar" class="btn btn-success btn-sm">Novo</a></th> </tr> </thead> <tbody> <?php if ($contatos) { foreach ($contatos as $contato) { ?> <tr> <td><?php echo $contato->nome; ?></td> <td><?php echo $contato->telefone; ?></td> <td><?php echo $contato->email; ?></td> <td> <a href="?ControleContato.editar.<?php echo $contato->id; ?>" class="btn btn-primary btn-sm">Editar</a> <a href="?ControleContato.excluir&id=<?php echo $contato->id; ?>" class="btn btn-danger btn-sm">Excluir</a> </td> </tr> <?php } } else { ?> <tr> <td colspan="5">Nenhum registro encontrado</td> </tr> <?php } ?> </tbody> </table> </div> arquivo /Astudy/Visoes/inicio.php <?php include "basico.html"; ?> <h1>Contatos</h1><hr> <div class="container"> Bem-vindo ao aplicativo MVC Contatos! <br /><br /> <a href="?ControleContato.listar" class="btn btn-success">Vamos Começar!</a></div>
  11. A listagem que segue é enorme, mas o mais importante é a função apuracao( ) que terminei hoje. Faz três anos que estou trabalhando nele. Ele retorna o mês por extenso, a data inicial e a data final daquele mês. Ele também é capaz de retornar o número do mês correspondente se você usar o mês por extenso. echo apuracao("2024-02-02")[0]; // "Fevereiro de 2024" echo apuracao("2024-02-02")[1]; // "2024-02-01" echo apuracao("2024-02-02")[2]; // "2024-02-29" echo apuracao(null,"Fevereiro"); // 2 O resto da listagem é particular. Estou tentando montar um relatório mensal de venda pelo cartão de débito, totalmente baseada na escrituração contábil. Se houver qualquer erro de classificação contábil ou digitação, o programa simplesmente não funciona, mas fica bem fácil localizar pelo menos o mês que ocorreu o problema. arquivo Index.php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/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> <style> body {width:500;margin:0 auto} .linha {line-height:0px} </style> <?php function apuracao($dia = null, $mes = null){ $mesVetor=['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho', 'Agosto','Setembro','Outubro','Novembro','Dezembro']; if(isset($mes)){return array_search($mes,$mesVetor)+1;} $ano=date('Y',strtotime($dia)); $mes=date('m',strtotime($dia)); $apuracao=$mesVetor[$mes-1] . " de $ano"; $primeiroDia="$ano-$mes-01"; $ultimoDia=date('Y-m-t',strtotime($primeiroDia)); return [$apuracao,$primeiroDia,$ultimoDia];} function dec($num) { if (empty($num)) {$fmt="";} else {$fmt = number_format($num,2,',','.'); return $fmt;}} $mysqli=new mysqli("localhost","root","","diario"); $dataInicial=date('Y-m-1'); $dataFinal=date('Y-m-t'); if(isset($_GET['apurar'])){ $selecionado=explode(' ',$_GET['apurar']); $chaveMes=apuracao(null,$selecionado[0]); $ano=$selecionado[2]; $dataInicial=date('Y-m-1',strtotime("$ano-$chaveMes-1")); $dataFinal=date('Y-m-t',strtotime("$ano-$chaveMes-1"));} $apuracaoSelecionada=apuracao($dataInicial)[0]; $query=$mysqli->query("select dia from tbdiario where contad=407 and hist like 'Mercado%' order by dia"); $primeiroDia=$query->fetch_assoc()['dia']; $meses=[]; $hoje=date('Y-m-1'); while($primeiroDia<=$hoje){ $meses[]=apuracao(date('Y-m-1',strtotime($primeiroDia)))[0]; $data=new DateTime($primeiroDia); $primeiroDia=date_modify($data,'+1 month')->format('Y-m-d');} $meses=array_reverse($meses); ?> <table class='table table-striped linha'> <tr class='align-middle'> <th> <form> <select name=apurar onchange=submit()> <?php foreach($meses as $mes): if($mes==$apuracaoSelecionada): ?> <option selected><?=$mes?></option> <?php else: ?> <option><?=$mes?></option> <?php endif; endforeach; ?> </select> </form> <th class=text-end>Tarifa<th class=text-end>Venda <?php $query=$mysqli->query("select * from tbdiario where contad=407 and hist like 'Mercado%' and dia between '$dataInicial' and '$dataFinal' order by dia"); $tarifas=$query->fetch_all(MYSQLI_ASSOC); $query=$mysqli->query("select * from tbdiario where contac=304 and hist like 'Mercado%' and dia between '$dataInicial' and '$dataFinal' order by dia"); $venda=$query->fetch_all(MYSQLI_ASSOC); $query=$mysqli->query("select sum(valor) as soma from tbdiario where contad=407 and hist like 'Mercado%' and dia between '$dataInicial' and '$dataFinal'"); $query2=$mysqli->query("select sum(valor) as soma from tbdiario where contac=304 and hist like 'Mercado%' and dia between '$dataInicial' and '$dataFinal'"); echo "<tr><th>Total<th class=text-end>".dec($query->fetch_assoc()['soma']). "<th class=text-end>".dec($query2->fetch_assoc()['soma']); foreach($tarifas as $key=>$tarifa){ echo "<tr><td>".date('d/m/y',strtotime($tarifa['dia'])). "<td class=text-end nowrap >".dec($tarifa['valor'])."<td class=text-end>". dec($venda[$key]['valor']);} echo "</table>";
  12. Já faz dois dias que estou preparando a minha mudança do servidor compartilhado para o servidor VPS no Hostinger, mas estou enfrentando um monte de imprevistos. O MySQL do VPS é mais novo, ele não aceita mais solicitações do tipo group by sem os campos que foram selecionados, e também não aceita mais campos que não têm valor padrão. Outro problema é como trabalhar com dois bancos de dados ao mesmo tempo. Só hoje é que eu tive a brilhante ideia de bloquear o site. Antes do site abrir o banco de dados eu escrevi: echo "Esse servidor está inoperante"; Esse é um bom exemplo de como fazer a coisa errada, o correto é assim: echo "<h1>Esse servidor está inoperante</h1>"; exit;
  13. Isso significa que o seu código PHP também não é compatível com o PHP 5.6. O jeito é voltar um pouco para trás, a minha sugestão é o 5.2, se ele estiver disponível. Eu estudei o Index.php, levei 5 dias para entender a rotina do consentimento que está escrito em JavaScript. Consegui alterar o ícone da guia do navegador, mas eu tive que mudar o código. Enfim, eu acredito que vou levar uns 3 anos só para o Index.php funcionar dentro do PHP 8.2 e MySQL 8.0.3. O projeto todo conta com 1.092 arquivos, mas o IA ainda não é capaz de converter códigos velhos com as novas versões do PHP e MySQL. Muito menos eu.
  14. ArrayList é um recurso do Java que não sei como trabalhar. Mas queria aproveitar o tema para retirar o segundo item de um array no JavaScript: <div id=div1></div> <div id=div2></div> <script> function main(){ aula1 = "Modelando a classe Aula" aula2 = "Conhecendo mais de listas" aula3 = "Trabalhando com Cursos e Sets" aulas = [] aulas.push(aula1) aulas.push(aula2) aulas.push(aula3) div1.innerHTML=aulas aulas.splice(1,1) div2.innerHTML=aulas } main() </script>
  15. Consegui executar o seguinte código, mas ele só funcionou uma vez. Alguém pode me orientar como devo proceder para ele funcionar mais uma vez? arquivo Index.php <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.1/cookieconsent.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.1/cookieconsent.min.js"></script> <script> window.addEventListener("load", function(){ window.cookieconsent.initialise({ "palette": { "popup": {"background": "#000"}, "button": {"background": "#f1d600"}}, "position": "top", "static": true, "content": { "message": "Este website utiliza cookies que asseguram funcionalidades para uma melhor navegação. Ao continuar a navegar está a concordar com a sua utilização", "link": "Leia Mais"}})}); </script> ==================== resolvido: o programa só funciona uma vez, ele não pede para o usuário o consentimento se o usuário já tiver consentido. Para apagar o consentimento, isso se faz pelo navegador. Como eu tenho o Chrome e o Edge, tive que fazer nos dois ao mesmo tempo.
  16. 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');
  17. 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.
  18. 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.
  19. 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.
  20. 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.
  21. 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.
  22. 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>
  23. 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;} }
  24. 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>
  25. 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();
×
×
  • Criar Novo...