
Frank K Hosaka
Membros-
Total de itens
1.622 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
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>
-
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>
-
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.
-
<?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'];}
-
MVC: o tutorial de Alexandre Bezerra Barbosa (2018)
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
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"; -
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>
-
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>";
-
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;
-
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.
-
remover valores encontrados na posição ArrayList
pergunta respondeu ao Joelson Silva de Frank K Hosaka em Repositório de scripts - Java
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> -
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.
-
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');
-
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.
-
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.
-
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.
-
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.
-
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.
-
Menu responsivo
pergunta respondeu ao Ricardo_Soares de Frank K Hosaka em Repositório de Scripts - PHP
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> -
Menu responsivo
pergunta respondeu ao Ricardo_Soares de Frank K Hosaka em Repositório de Scripts - PHP
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;} } -
Menu responsivo
pergunta respondeu ao Ricardo_Soares de Frank K Hosaka em Repositório de Scripts - PHP
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> -
Como diluir um valor em campos diferentes - PHP
pergunta respondeu ao Marcio Marins de Frank K Hosaka em PHP
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(); -
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.
-
Como diluir um valor em campos diferentes - PHP
pergunta respondeu ao Marcio Marins de Frank K Hosaka em PHP
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)); -
Como diluir um valor em campos diferentes - PHP
pergunta respondeu ao Marcio Marins de Frank K Hosaka em PHP
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;?> -
Como diluir um valor em campos diferentes - PHP
pergunta respondeu ao Marcio Marins de Frank K Hosaka em PHP
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");}