Frank K Hosaka
Members-
Total de itens
224 -
Registro em
-
Última visita
-
Omar, não sei como usar a classe Select (para filtrar), Update e Delete do seu projeto
Frank K Hosaka respondeu ao tópico de Frank K Hosaka em PHP
Ah, já sei a besteira que eu fiz no código. Eu escrevi um comando assim: public function excluir(){ var_dump((new Users())->excluir(2)); $this->inicio();}} Isso está bem errado, o correto é: public function excluir(){ $excluir = (new Users())->excluir(2)); var_dump($excluir); $this->inicio();}} -
Omar, não sei como usar a classe Select (para filtrar), Update e Delete do seu projeto
Frank K Hosaka respondeu ao tópico de Frank K Hosaka em PHP
Como não sei como trabalhar com os objetos criados pelo Omar, encontrei um outro no YouTube, nesse endereço: https://youtu.be/uG64BgrlX7o?si=TS4Lhe9dWlQGnzY_ O código original do YouTube usa o autoload.php criado pelo composer. Eu não usei o composer, preciso saber como trabalhar com o endereço absoluto. No PHP nós temos $_SERVER['DOCUMENT_ROOT'], mas você não pode usar dentro do HTML. Só hoje é que eu aprendi a usar o endereço absoluto no HTML. Se o meu projeto está na pasta Omar2, no HTML faço assim <a href='/Omar2/Controles/Controle.php'>. Fiz as minhas adaptações. O código é bem simples, ele faz todas as operações do Crud e pedi para voltar à tele inicial. Mas isso não funcionou em alguns comandos. Eu acredito que o comando return que você encontra em muitos objetos acaba encerrando todos os códigos em andamento. O meu código ficou assim: arquivo /Omar2/Controles/Controle.php <?php require $_SERVER['DOCUMENT_ROOT']."/Omar2/Modelos/Config.php"; require MODELO."/Users.php"; class Controle { public function inicio(){require VISAO."/Index.php";} public function consultar(){ var_dump(Users::getUsers()); $this->inicio();} public function filtrar(){ var_dump(Users::getUser(1)); $this->inicio();} public function adicionar(){ $users=new Users(); var_dump($users->cadastrar('João','joao@gmail.com','JamesBond')); $this->inicio();} public function atualizar(){ var_dump((new Users())->atualizar(2,"Maria","maria@gmail.com","JamesBond","2023-12-11 08:33")); $this->inicio();} public function excluir(){ var_dump((new Users())->excluir(2)); $this->inicio();}} $Controle=new Controle(); if(isset($_GET)){ $get=$_GET; if(key($get)=="consultar"){$Controle->consultar();} if(key($get)=="filtrar"){$Controle->filtrar();}} if(key($get)=="adicionar"){$Controle->adicionar();} if(key($get)=="atualizar"){$Controle->atualizar();} if(key($get)=="excluir"){$Controle->excluir();} arquivo /Omar2/Index.php <?php require $_SERVER['DOCUMENT_ROOT']."/Omar2/Modelos/Config.php"; require CONTROLE."/Controle.php"; $controle=New Controle(); $controle->inicio(); arquivo /Omar2/Modelos/Config.php <?php date_default_timezone_set("America/Sao_Paulo"); defined('CAMINHO') || define('CAMINHO',$_SERVER['DOCUMENT_ROOT'].'/Omar2'); defined('CONTROLE') || define('CONTROLE',CAMINHO."/Controles"); defined('VISAO') || define('VISAO',CAMINHO."/Visoes"); defined('MODELO') || define('MODELO',CAMINHO."/Modelos"); defined('TITLE') || define('TITLE','Exemplo de CRUD'); defined('HOST') || define('HOST','localhost'); defined('NAME') || define('NAME','laravel'); defined('USER') || define('USER','root'); defined('PASS') || define('PASS',''); arquivo /Omar2/Modelos/Database.php <?php require $_SERVER['DOCUMENT_ROOT'].'/Omar2/Modelos/Config.php'; class Database{ const HOST = HOST; const NAME = NAME; const USER = USER; const PASS = PASS; private $table,$connection; public function __construct($table = null){ $this->table = $table; $this->setConnection();} private function setConnection(){ try{ $this->connection = new PDO('mysql:host='.self::HOST.';dbname='.self::NAME,self::USER,self::PASS); $this->connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ die('ERROR: '.$e->getMessage());}} public function execute($query,$params = []){ try{ $statement = $this->connection->prepare($query); $statement->execute($params); return $statement; }catch(PDOException $e){ die('ERROR: '.$e->getMessage());}} public function insert($values){ $fields = array_keys($values); $binds = array_pad([],count($fields),'?'); $query = 'INSERT INTO '.$this->table.' ('.implode(',',$fields).') VALUES ('.implode(',',$binds).')'; var_dump($values); $this->execute($query,array_values($values)); return $this->connection->lastInsertId();} public function select($where = null, $order = null, $limit = null, $fields = '*'){ $where = !empty($where) ? 'WHERE '.$where : ''; $order = !empty($order) ? 'ORDER BY '.$order : ''; $limit = !empty($limit) ? 'LIMIT '.$limit : ''; $query = 'SELECT '.$fields.' FROM '.$this->table.' '.$where.' '.$order.' '.$limit; return $this->execute($query);} public function update($where,$values){ $fields = array_keys($values); $query = 'UPDATE '.$this->table.' SET '.implode('=?,',$fields).'=? WHERE '.$where; $this->execute($query,array_values($values)); return true;} public function delete($where){ $query = 'DELETE FROM '.$this->table.' WHERE '.$where; $this->execute($query); return true;}} arquivo /Omar2/Modelos/MySQL.sql CREATE TABLE `users` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `email` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `email_verified_at` timestamp NULL DEFAULT NULL, `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `remember_token` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `level` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci arquivo /Omar2/Modelos/Users.php <?php require_once MODELO."/Database.php"; class Users { public $id, $name,$email,$email_verified_at,$password,$remember_token,$created_at,$updated_at,$level; public function cadastrar($name,$email,$password){ $this->name=$name; $this->email=$email; $this->password=$password; $this->created_at = date('Y-m-d H:i:s'); $obDatabase = new Database('users'); $this->id = $obDatabase->insert([ 'name' => $this->name, 'email' => $this->email, 'password' => $this->password, 'created_at' => $this->created_at]); return true;} public function atualizar($id,$name,$email,$password,$created_at){ $this->id=$id; $this->name=$name; $this->email=$email; $this->password=$password; $this->created_at=$created_at; return (new Database('users'))->update('id = '.$this->id,[ 'name' => $this->name, 'email' => $this->email, 'password' => $this->password, 'created_at' => $this->created_at]);} public function excluir($id){ $this->id=$id; return (new Database('users'))->delete('id = '.$this->id);} public static function getUsers($where = null, $order = null, $limit = null){ return (new Database('users'))->select($where,$order,$limit) ->fetchAll(PDO::FETCH_CLASS,self::class);} public static function getUser($id){ return (new Database('users'))->select('id = '.$id) ->fetchObject(self::class);}} arquivo /Omar2/Visoes/Index.php <!DOCTYPE html> <html> <head> <title><?= TITLE ?></title> </head> <body> <table style="width:500;margin:0 auto;margin-top:100px"> <tr><th>Trabalhando com a tabela users <tr><td><a href="/Omar2/Controles/Controle.php?consultar">consultar</a> <tr><td><a href="/Omar2/Controles/Controle.php?filtrar">filtrar</a> <tr><td><a href="/Omar2/Controles/Controle.php?adicionar">adicionar</a> <tr><td><a href="/Omar2/Controles/Controle.php?atualizar">atualizar</a> <tr><td><a href="/Omar2/Controles/Controle.php?excluir">excluir</a> </body> </html> -
O autoload do Omar só funciona no projeto dele
Frank K Hosaka respondeu ao tópico de Frank K Hosaka em PHP
sempre que algo for anexo e os dados mais importantes gerados em config.php não existir novamente requisito ele sempre usando a função nativa do PHP require_once. Eu acredito que essa é a única solução para usar o autload e as constantes, o de invocar o arquivo coringa assim que o PHP reclamar que não encontra alguma coisa. Quanto a gramática, estou usando a minha improvisação. Ao invés de Models, Views and Controllers, estou usando modelos, visões e controles, tudo em minúsculo e com acentos, inclusive o nome da classe. Quanto ao trabalho que eu dou para o navegador por não colocar aspas nos atributos, eu só coloco quando vejo que o navegador não responde do jeito que esperava. Eu sou calouro aqui, eu não faço nada que os veteranos sugerem. Mas eu agradeço por compartilhar o seu projeto. Eu vou desmontá-lo e ver se consigo fazer igual, usando as minhas improvisações. Quero ver por que o __DIR__ funciona no seu projeto, mas não funciona no meu. Por enquanto, obrigado pela atenção. -
O autoload do Omar só funciona no projeto dele
Frank K Hosaka respondeu ao tópico de Frank K Hosaka em PHP
Alterei a função FindClass, assim function FindClass($dir, $class) { return ( $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'mvc' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $class . '.php');} Ele funcionou dentro do index.php, mas na hora que o controle.php invocou new usuários(), o PHP disse que não encontrou essa classe, quando esperava pelo menos mensagem de erro interno. A minha tese é que a rotina do login atualizou a página e mandou para o espaço a engenharia do autoload. Esse é o mesmo problema que enfrento com as constantes do define. Sendo assim, a minha única saída foi usar sempre endereço absoluto e na hora de invocar uma conexão uso os dados dentro da classe e não tento esconder atrás de uma constante. Eu fiz uma pesquisa sobre a possibilidade de disponibilizar todas as constantes e funções para todos os módulos do PHP e tudo indica que existe uma extensão chamada phpize, mas só está disponível para quem usa Linux. -
O projeto do Omar é outra coisa! O autoload dele funciona como mágica. Eu copiei a função autoload no meu projeto, e o máximo que eu consegui foi a mensagem "Erro interno no servidor ao encontrar dados cruciais de funcionamento!". Ou seja, o problema não é o meu notebook e sim o meu projeto. Acho que o autoload quis dizer que o meu projeto é uma grande porcaria: arquivo /mvc/controles/controle.php <?php session_start(); require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/usuários.php'; class controle { private $usuários; public function __construct(){ $this->usuários=new usuários();} public function login() { $mensagem=""; require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/login.php';} public function menu($email,$senha){ $validaEmail=$this->usuários->validaEmail($email); $validaSenha=$this->usuários->validaSenha($email,$senha); if(!$validaEmail || !$validaSenha){ $mensagem="Dados inválidos!"; require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/login.php';exit;} $_SESSION['id']=$this->usuários->id; $_SESSION['nome']=$this->usuários->nome; $_SESSION['email']=$this->usuários->email; require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/menu.php';} public function alterarSenha(){ $mensagem=""; $email=$_SESSION['email']; require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/alterarSenha.php';} public function senhaAlterada($senhaAlterada){ $this->usuários->atualizarSenha($_SESSION['email'],$senhaAlterada); return $this->login();}} $controle=new controle(); if(isset($_POST['email'])){$controle->menu($_POST['email'],$_POST['senha']);} if(isset($_POST['senhaAlterada'])){$controle->senhaAlterada($_POST['senhaAlterada']);} if(isset($_GET['sair'])){$controle->login();} if(isset($_GET['senha'])){$controle->alterarSenha();} arquivo /mvc/controles/controleDiário.php <?php session_start(); require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/diário.php'; require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/funções.php'; class controleDiário { private $diário; public function __construct(){ $this->diário=new diário();} public function início($dia){ $consultas=$this->diário->consulta($dia); $lçtos=$consultas[0]; $somaDébito=$consultas[1]; $somaCrédito=$consultas[2]; require $_SERVER['DOCUMENT_ROOT']."/mvc/visões/diário.php";exit;}} $diário=new controleDiário(); if(isset($_POST['novaData'])){$diário->início($_POST['novaData']);} if(isset($_GET)){$dia=date('Y-m-d');$diário->início($dia);} arquivo /mvc/index.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/funções.php'; $controle=new controle(); $controle->login(); arquivo /mvc/modelos/conexão.php <?php class conexão { private static $pdo; public function __construct(){} public static function instância(){ $dbname="mvc"; $user="root"; $password=""; if($_SERVER['SERVER_NAME']=="exemplo.net"){ $dbname="u123_Hostinger"; $user="u123_Hostinger"; $password="JamesBond";} if(!self::$pdo){ self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);} return self::$pdo;}} arquivo /mvc/modelos/diário.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/conexão.php'; class diário extends conexão { private $pdo; public function __construct(){ $this->pdo=conexão::instância();} public function consulta($dia){ $stmt=$this->pdo->query("select sum(valor) as somaDébito from diário where contaD>0 and dia='$dia'"); $somaDébito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaDébito']; $stmt=$this->pdo->query("select sum(valor) as somaCrédito from diário where contaC>0 and dia='$dia'"); $somaCrédito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaCrédito']; $stmt=$this->pdo->query("select * from diário where dia='$dia'"); return [$stmt->fetchAll(PDO::FETCH_OBJ),$somaDébito,$somaCrédito];}} arquivo /mvc/modelos/funções.php <?php spl_autoload_register(function ($Class) { $includeDir = false; $findDir = ['controles','modelos','visões']; foreach ($findDir as $DirName) { if (!$includeDir && file_exists(__DIR__ . FindClass($DirName, $Class)) && !is_dir(__DIR__ . FindClass($DirName, $Class))) { include_once (__DIR__ . FindClass($DirName, $Class)); $includeDir = true;}} if (!$includeDir) { die("Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); function FindClass($dir, $class) { return ( DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $class . '.php');} function dec($value){ if($value!==null){ return number_format($value,2,',','.');}} arquivo /mvc/modelos/usuários.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/conexão.php'; class usuários extends conexão { public $id, $nome, $email; public function validaEmail($email){ $stmt=conexão::instância()->query("select email from usuários where email='$email'"); return $stmt->fetch(PDO::FETCH_ASSOC);} public function validaSenha($email,$senha){ $stmt=conexão::instância()->query("select * from usuários where email='$email'"); $linha=$stmt->fetch(PDO::FETCH_ASSOC); $verSenha=$linha['senha']; $this->id=$linha['id']; $this->nome=$linha['nome']; $this->email=$linha['email']; return password_verify($senha,$verSenha);} public function atualizarSenha($email,$novaSenha){ $hash=password_hash($novaSenha,PASSWORD_BCRYPT,['cost'=>12]); return conexão::instância()->query("update usuários set senha='$hash' where email='$email'");}} arquivo /mvc/visões/alterarSenha.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/básico.html'; ?> <style> html,body {height: 100%} body {display: flex;align-items: center;padding-top: 40px;padding-bottom: 40px;background-color: #f5f5f5;} .form-signin {max-width: 330px;padding: 15px;} .form-signin .form-floating:focus-within {z-index: 2;} </style> <body class="text-center"> <main class="form-signin w-100 m-auto"> <?php if($mensagem!==""): ?> <div class="alert alert-success"> <?=$mensagem?> </div> <?php endif; ?> <form method=post action=/mvc/controles/controle.php> <h1 class="h3 mb-3 fw-normal">alterar senha</h1> <div class="form-floating"> <input type="email" class="form-control" value=<?=$email?>> <label for="floatingInput">Email</label> </div> <div class="form-floating"> <input type="password" class="form-control" id="floatingPassword" name="senhaAlterada" autofocus required> <label for="floatingPassword">Senha</label> </div> <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button> </form> </main> arquivo /mvc/visões/básico.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" 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> <title>projeto mvc</title> arquivo /mvc/visões/diário.php <?php include $_SERVER['DOCUMENT_ROOT']."/mvc/visões/menu.php"; ?> <table class='table table-striped'> Lançamentos do dia <form method=post action='../controles/controleDiário.php'> <input type=date name=novaData value=<?=$dia?> onchange=submit()> </form> <th>lçto<th>contad<th>contac<th>valor<th>hist <?php foreach($lçtos as $lçto): ?> <tr> <td><?=$lçto->lçto?> <td><?=$lçto->contad?> <td><?=$lçto->contac?> <td class=text-end><?=dec($lçto->valor)?> <td><?=$lçto->hist?> <?php endforeach; ?> <tr><td><td><td><td><?=dec($somaDébito)?><td>Soma dos Débitos <tr><td><td><td><td class=text-danger><?=dec($somaCrédito)?> <td class=text-danger>Soma dos Créditos arquivo /mvc/visões/login.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/básico.html'; ?> <style> html,body {height: 100%} body {display: flex;align-items: center;padding-top: 40px;padding-bottom: 40px;background-color: #f5f5f5;} .form-signin {max-width: 330px;padding: 15px;} .form-signin .form-floating:focus-within {z-index: 2;} </style> <body class="text-center"> <main class="form-signin w-100 m-auto"> <?php if($mensagem!==""): ?> <div class="alert alert-success"> <?=$mensagem?> </div> <?php endif; ?> <form method=post action=/mvc/controles/controle.php> <h1 class="h3 mb-3 fw-normal">projeto mvc</h1> <div class="form-floating"> <input type="email" class="form-control" name=email placeholder="name@example.com" autofocus required> <label for="floatingInput">Email</label> </div> <div class="form-floating"> <input type="password" class="form-control" id="floatingPassword" placeholder="Senha" name="senha" required> <label for="floatingPassword">Senha</label> </div> <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button> </form> </main> arquivo /mvc/visões/menu.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/básico.html'; date_default_timezone_set('America/Sao_Paulo'); ?> <body style="max-width:500px;margin:0 auto"> <header class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> projeto mvc <div class=dropdown> <button type=button class="btn btn-outline-primary dropdown-toggle" data-bs-toggle=dropdown id=btmenu> Menu </button> <ul class="dropdown-menu"> <?php if($_SESSION['id']==1){ ?> <li><a class=dropdown-item href=controleDiário.php>Diário</a></li> <?php } ?> </ul> </div> <div class="dropdown"> <button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <?=$_SESSION['nome']?> </button> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="../controles/controle.php?sair">Sair</a></li> <li><a class="dropdown-item" href="../controles/controle.php?senha">Mudar a senha</a></li> </ul> </div> </header> Essa listagem é enorme e o projeto não funciona, mas se você quiser testar, você pode copiar tudo e salvar como c:\wamp64\www\script.txt, e nesse mesmo diretório executar "localhost/scriptin.php" (ele vai criar a pasta mvc e todas pastas e todos os arquivos) arquio ScriptIn.php <?php if (!is_dir("mvc")){ mkdir("mvc"); mkdir("mvc/controles"); mkdir("mvc/modelos"); mkdir("mvc/visões");} $script=file_get_contents("script.txt"); $ocorrencias=substr_count($script,"arquivo /mvc/"); $substring = "arquivo /mvc/"; $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";
-
Omar, não sei como usar a classe Select (para filtrar), Update e Delete do seu projeto
Frank K Hosaka postou um tópico no fórum PHP
arquivo /omar2/controles/controle.php <?php class controle { public function consultar(){ $select=new Select; $select->query('usuários'); $teste=$select->result(); var_dump($teste); $this->voltar();} public function filtrar(){ $select=new Select; $select->genérico("select * from usuários where nome like 'frank%'"); $teste=$select->result(); var_dump($teste); $this->voltar();} public function adicionar(){ $insert=new Insert(); $insert->query("usuários",["id"=>3,"nome"=>"teste","email"=>"teste@uol.com.br","senha"=>"JamesBond"]); $teste=$insert->error(); var_dump($teste); $this->voltar();} public function atualizar(){ $update=new Update(); $update->genérico('update usuários set nome="outro teste" where id=3'); $teste=$update->error(); var_dump($teste); $this->voltar();} public function excluir(){ $delete=new Delete(); $delete->genérico('delete from usuários where id=3'); $teste=$delete->error(); var_dump($teste); $this->voltar();} public function voltar(){ echo "<input type=submit value=Voltar onclick=location.replace('index.php')>"; exit;}} $controle=new controle(); if(isset($_GET)){ $get=$_GET; if(empty($get)){return;} if($get['url']=="consultar"){$controle->consultar();} if($get['url']=="filtrar"){$controle->filtrar();}} if($get['url']=="adicionar"){$controle->adicionar();} if($get['url']=="atualizar"){$controle->atualizar();} if($get['url']=="excluir"){$controle->excluir();} arquivo /omar2/index.php <?php require 'visões/index.php'; arquivo /omar2/modelos/Connect.php <?php class Connect { private static $host = DB_HOST; private static $user = DB_USER; private static $pass = DB_PASS; private static $data = DB_DATA; private static $isConnect = null; private static $isError = null; private static function makeConnect() { try { if (self::$isConnect == null) { $dsn = 'mysql:host=' . self::$host . '; dbname=' . self::$data; $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8']; self::$isConnect = new PDO($dsn, self::$user, self::$pass, $options); } } catch (PDOException $e) { self::$isError = '<br>Não foi possível conectar com o banco de dados!<br> Descrição:' . $e->getMessage() . '<br>'; //die('Erro interno no servidor. Código de referência 500'); die($e->getMessage()); } self::$isConnect->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return (self::$isConnect); } protected static function callConnect() { return (self::makeConnect()); } protected static function getError() { if (self::$isError) { return (self::$isError);}}} arquivo /omar2/modelos/Delete.php <?php class Delete extends Connect { private $deleteTable; private $deleteFields; private $deleteValues; private $deleteSyntax; private $deleteConn; private $deleteData; private $deleteError; public function genérico($deletar){ $this->deleteSyntax=$deletar; $this->deleteExecute();} public function query($table, $fields, $statements) { $this->deleteTable = (string) $table; $this->deleteFields = (string) $fields; parse_str($statements, $this->deleteValues); $this->deleteConstruct(); $this->deleteExecute(); } public function count() { if ($this->deleteData) { return ($this->deleteSyntax->rowCount());} else { return (0);}} public function result() { if ($this->deleteData) { return ($this->deleteData);}} public function error() { if (!$this->deleteData) { return ($this->deleteError);}} private function deleteConstruct() { $this->deleteSyntax = "DELETE FROM {$this->deleteTable} WHERE {$this->deleteFields}";} private function deleteConnect() { $this->deleteConn = parent::callConnect(); $this->deleteSyntax = $this->deleteConn->prepare($this->deleteSyntax);} private function deleteExecute() { $this->deleteConnect(); try { $this->deleteSyntax->execute($this->deleteValues); $this->deleteData = true; } catch (PDOException $error) { $this->deleteData = null; $this->deleteError = "Erro ao ler dados: {$error->getMessage()} {$error->getCode()}";}}} arquivo /omar2/modelos/GlobalFilter.php <?php class GlobalFilter { public static function StdArray($array) { $object = new stdClass(); if (is_array($array)) { foreach ($array as $name => $value) { $object->$name = $value;}} return $object;} public static function ObjArray($array) { if (is_array($array)) { //return (object) array_map(__FUNCTION__, $array); return (object) array_map(__METHOD__, $array);} else { return $array;}} public static function filterGet() { $filterGet = filter_input_array(INPUT_GET, FILTER_DEFAULT); $filter = isset($filterGet) ? self::StdArray($filterGet) : false; return ($filter);} public static function filterPost() { $filterPost = filter_input_array(INPUT_POST, FILTER_DEFAULT); $filter = isset($filterPost) ? self::StdArray($filterPost) : false; return ($filter);} public static function filterSession() { $filterSession = filter_input_array(INPUT_SESSION, FILTER_DEFAULT); $filter = isset($filterSession) ? self::StdArray($filterSession) : false; return ($filter);} public static function filterCookie() { $filterCookie = filter_input_array(INPUT_COOKIE, FILTER_DEFAULT); $filter = isset($filterCookie) ? self::StdArray($filterCookie) : false; return ($filter);} public static function filterServe() { $filterServe = filter_input_array(INPUT_SERVER, FILTER_DEFAULT); $filter = isset($filterServe) ? self::StdArray($filterServe) : false; return ($filter);} public static function filterEven() { $filterEven = filter_input_array(INPUT_ENV, FILTER_DEFAULT); $filter = isset($filterEven) ? self::StdArray($filterEven) : false; return ($filter);} public static function filterRequest() { $filterRequest = filter_input_array(INPUT_REQUEST, FILTER_DEFAULT); $filter = isset($filterRequest) ? self::StdArray($filterRequest) : false; return ($filter);}} arquivo /omar2/modelos/Insert.php <?php class Insert extends Connect { private $insertTable; private $insertFilds; private $insertSyntax; private $insertConn; private $insertData; private $insertError; public function query($table, array $fields) { $this->insertTable = (string) $table; $this->insertFilds = $fields; $this->insertConstruct(); $this->insertExecute(); } public function count() { if ($this->insertData) { return ($this->insertSyntax->rowCount());} else { return (0);}} public function result() { if ($this->insertData) { return ($this->insertData);}} public function error() { if (!empty($this->insertError)) { return ($this->insertError);}} private function insertConstruct() { $Column = implode(', ', array_keys($this->insertFilds)); $values = ':' . implode(', :', array_keys($this->insertFilds)); $this->insertSyntax = "INSERT INTO {$this->insertTable} ({$Column}) VALUES ({$values})";} private function insertConnect() { $this->insertConn = parent::callConnect(); $this->insertSyntax = $this->insertConn->prepare($this->insertSyntax);} private function insertExecute() { $this->insertConnect(); try { $this->insertSyntax->execute($this->insertFilds); $this->insertData = $this->insertConn->lastInsertId(); } catch (PDOException $error) { $this->insertData = null; $this->insertError = "Erro ao inserir dados: {$error->getMessage()} {$error->getCode()}";}}} arquivo /omar2/modelos/LogRegister.php <?php class LogRegister { private static $file; private static $message; private static $comment; public static function dataError($file, $message, $comment = null) { self::$file = (string) $file; self::$message = (string) $message; self::$comment = (string) $comment; if (!empty($file) && !empty($message)) { self::registerError();}} private static function registerError() { $lgErr = new Select(); $lgErr->query('log_error', [ 'lg_date' => date('Y-m-d'), 'lg_hour' => date('H:i:s'), 'lg_file' => self::$file, 'lg_message' => htmlentities(self::$message), 'lg_comment' => htmlentities(self::$comment)]); if ($lgErr->error()) { self::sqlError();}} private static function sqlError() { $txt = "== [ ERROR ] ===========================\n" . "- Data: " . date('Y-m-d') . "\n" . "- Horário: " . date('H:i:s') . "\n" . "- Arquivo: " . self::$file . "\n" . (!empty(self::$message) ? "- Mensagem:\n" . strip_tags(self::$message) . "\n" : "") . (!empty(self::$comment) ? "\n- Comentários:\n" . strip_tags(self::$comment) : "") . "\n"; $reg = fopen(MODELO_DIR . 'error.log', 'a'); fwrite($reg, $txt); fclose($reg);}} arquivo /omar2/modelos/Select.php <?php class Select extends Connect { private $selectTable; private $selectFields; private $selectSyntax; private $selectConn; private $selectData; private $selectError; public function genérico($consulta){ $this->selectTable=$consulta; $this->selectExecute();} public function query($table, $fields = null, $statements = null) { if (!empty($statements)) { parse_str($statements, $this->selectFields);} $this->selectTable = 'SELECT * FROM ' . $table . (isset($fields) ? ' WHERE ' . $fields : null); $this->selectExecute();} public function setQuery($Query, $statements = null) { if (!empty($statements)) { parse_str($statements, $this->selectFields); } $this->selectTable = (string) $Query; $this->selectExecute(); } public function count() { return ($this->selectSyntax->rowCount());} public function result() { if ($this->selectData) { return ($this->selectData);}} public function error() { if (!empty($this->selectError)) { return ($this->selectError);}} private function selectConstruct() { if ($this->selectFields) { foreach ($this->selectFields as $type => $value) { if ($type == 'limit' || $type == 'offset') { $value = (int) $value;} $this->selectSyntax->bindValue(":{$type}", $value, (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR));}}} private function selectConnect() { $this->selectConn = parent::callConnect(); $this->selectSyntax = $this->selectConn->prepare($this->selectTable); $this->selectSyntax->setFetchMode(PDO::FETCH_OBJ);} private function selectExecute() { $this->selectConnect(); try { $this->selectConstruct(); $this->selectSyntax->execute(); $this->selectData = $this->selectSyntax->fetchAll(); } catch (PDOException $error) { $this->selectData = null; $this->selectError = "Erro ao ler dados: {$error->getMessage()} {$error->getCode()}";}}} arquivo /omar2/modelos/Session.php <?php class Session { private static $status; private static $globalName; private static $session; public static function startSession($prefix = null) { self::$globalName = (empty($prefix) ? null : '_' . $prefix); if (!self::$status) { self::$session = new self; } self::$status = session_start(); return (self::$session);} public static function getSession() { return (self::$status);} public static function destroy() { self::$session = session_destroy(); unset($_SESSION);} public function __set($name, $value) { $_SESSION[$name . self::$globalName] = $value;} public function __get($name) { if (isset($_SESSION[$name . self::$globalName])) { return ($_SESSION[$name . self::$globalName]);}} public function __isset($name) { return (isset($_SESSION[$name . self::$globalName]));} public function __unset($name) { unset($_SESSION[$name . self::$globalName]);}} arquivo /omar2/modelos/Update.php <?php class Update extends Connect { private $updateTable; private $updateColumn = []; private $updateFields; private $updateValues = []; private $updateSyntax; private $updateConn; private $updateError; private $updateData; public function genérico($atualização){ $this->updateSyntax=$atualização; $this->updateExecute($atualização);} public function query($table, array $change, $target, $statements) { $this->updateTable = (string) $table; $this->updateColumn = $change; $this->updateFields = (string) $target; parse_str($statements, $this->updateValues); $this->updateConstruct(); $this->updateExecute();} public function setQuery($query, $statements = null) { if (!empty($statements)) { parse_str($statements, $this->updateValues); } $this->updateSyntax = $query; $this->updateExecute();} public function count() { if ($this->updateData) { return ($this->updateSyntax->rowCount());} else { return (0);}} public function error() { if (!empty($this->updateError)) { return ($this->updateError);}} private function updateConstruct() { foreach ($this->updateColumn as $Key => $Value) { $setKey[] = $Key . ' = :' . $Key;} $Value = array(); $setKey = implode(', ', $setKey); $this->updateSyntax = "UPDATE {$this->updateTable} SET {$setKey} WHERE {$this->updateFields}";} private function updateConnect() { $this->updateConn = parent::callConnect(); $this->updateSyntax = $this->updateConn->prepare($this->updateSyntax);} private function updateExecute() { $this->updateConnect(); try { $this->updateSyntax->execute(array_merge($this->updateColumn, $this->updateValues)); $this->updateData = true; } catch (PDOException $error) { $this->updateData = false; $this->updateError = "Erro ao alterar dados: {$error->getMessage()} {$error->getCode()}";}}} arquivo /omar2/modelos/config.php <?php error_reporting(E_ALL); ini_set('ignore_repeated_errors', TRUE); ini_set('display_errors', TRUE); ini_set('log_errors', TRUE); ini_set('error_log', __DIR__ . '/error.log'); ob_start(); defined('MODELO_DIR') || define('MODELO_DIR',$_SERVER['DOCUMENT_ROOT'] .'/omar2/modelos/'); defined('CONTROLE_DIR') || define('CONTROLE_DIR',$_SERVER['DOCUMENT_ROOT'].'/omar2/controles/'); $con = [ 'ready' => true, 'dbHost' => 'localhost', 'dbUser' => 'root', 'dbPass' => '', 'dbName' => 'mvc']; $setting = [ 'ready' => true, 'siteName' => 'Meu website', 'charset' => 'UTF-8']; try { if (!isset($con['ready'])) { throw new Exception('Dados de configurações para conexão não definidos', E_ERROR); } else if (!isset($setting['ready'])) { throw new Exception('Dados de configurações de comportamento não definidos', E_ERROR); } else { defined('DB_HOST') || define('DB_HOST', $con['dbHost']); defined('DB_USER') || define('DB_USER', $con['dbUser']); defined('DB_PASS') || define('DB_PASS', $con['dbPass']); defined('DB_DATA') || define('DB_DATA', $con['dbName']); defined('SITE_NAME') || define('SITE_NAME', $setting['siteName']); date_default_timezone_set('America/Sao_Paulo'); spl_autoload_register(function ($class) { $includeDir = false; $findDir = ['controles','modelos','visões']; 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("Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); function FindClass($dir, $class) { return ( $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'omar2' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $class . '.php');} $session = Session::startSession(SITE_NAME); $config = GlobalFilter::ObjArray($setting);}} catch (Exception $e) {header('location : http500/');} arquivo /omar2/visões/index.php <!DOCTYPE html> <html> <head> <?php require $_SERVER['DOCUMENT_ROOT']."/omar2/modelos/config.php"; $serve = filter_input_array(INPUT_SERVER, FILTER_DEFAULT); $rootUrl = strlen($serve['DOCUMENT_ROOT']); $fileUrl = substr($serve['SCRIPT_FILENAME'], $rootUrl, -9); if ($fileUrl[0] == '/') {$baseUri = $fileUrl;} else { $baseUri = '/' . $fileUrl;} ?> <base href="<?= $baseUri ?>" /> <meta charset="<?=$setting['charset']?>" /> <title><?= SITE_NAME ?></title> </head> <body> <?php $filter = filter_input(INPUT_GET, 'url', FILTER_DEFAULT); $setUrl = empty($filter) ? 'consultar' : $filter; $explode = explode('/', $setUrl); $url = array_filter($explode); $request=$url[0]; $map = ['consultar','filtrar','adicionar','atualizar','excluir']; $file = false; foreach ($map as $value) { if (($request == $value) || (is_array($value) && in_array($request, $value))) { $opção = $value; break; }} if ($opção) {require CONTROLE_DIR."controle.php";}?> <table style="width:500;margin:0 auto;margin-top:100px"> <tr><th>Trabalhando com a tabela usuários <tr><td><a href="?url=consultar">consultar</a> <tr><td><a href="?url=filtrar">filtrar</a> <tr><td><a href="?url=adicionar">adicionar</a> <tr><td><a href="?url=atualizar">atualizar</a> <tr><td><a href="?url=excluir">excluir</a> </body> </html> O seu autoload é excelente, mas eu não tenho coragem de usar a constante __DIR__. -
Mensagem errada.
-
Mensagem errada.
-
Valeu, vou estudar o seu projeto.
-
Eu gosto do Laravel. No princípio eu instalei, sonhando em aprender a linguagem orientada a objetos. Isso é um grande engano. Laravel já é um objeto, restando apenas ao usuário a se limitar a usar as suas propriedades e métodos, mas que eu acho ele fantástico, isso eu acho. A programação orientada a objetos é um tópico novo para mim. Estou começando agora a estudá-lo. Para o meu desespero, o namespace, o define, o spl_autoloader, nada disso está funcionando comigo. Eu fico perdido com isso. Assim, o máximo que eu aprendi foi usar a herança de classe, aquilo é muito bom! Para chamar um arquivo, eu uso o endereço absoluto, começando com o $_USER['DOCUMENT_ROOT'] pelo PHP ou "../diretorio/arquivo.php" pelo HTML. No projeto atual, eu inventei o básico.html, que vou incluir em todos os views. O máximo que eu consegui fazer foi definir o CDN do Bootstrap, mas eu fiz a besteira de estilizar o <body>, e só enfrento problemas. Hoje eu pretendo tirar o estilo do <body> do básico.html, para defini-lo em cada página em particular. É assim que eu estudo a programação orientada a objetos, o famoso estilo controles/modelos/visões. Eu desisti de procurar tutoriais, a maior parte deles mexe no .htaccess, e usa o composer para instalar soluções de terceiros. Eu usei um e acabei perdendo o meu direito de acessar a minha pasta astudy, eu fiquei indignado. Ontem eu vi um tutorial de autoload, eu fiquei indignado. O rapaz trabalha tudo no diretório raiz. Eu preciso de um autoload que funciona num ambiente em que os arquivos são distribuidos em pastas, e isso eu não consigo encontrar. Assim, só me resta usar o meu método científico de tentativa e erro. Ou eu estou procurando no lugar errado?
-
Isso daí é a gramática do PHP para o motor PDO. O outro motor é mysqli, mas esse só serve para o MySQL, enquanto que o PDO pode trabalhar com outro tipo de banco de dados. Para o PHP conectar ao banco de dados, ele precisa de uma conexão, no seu exemplo, ele foi chamado de ligação: $ligacao=new PDO("mysql:host=localhost;dbname=laravel","root",""); Com a conexão, o PHP usa a gramática do SQL para conversar com o banco de dados: $resultado=$ligacao->prepare("select professor from safados where reputacao = :reputacao"); A gramática do SQL está incompleta, falta definir o parâmetro :reputacao, assim: $resultado->bindParam(':reputacao','o mais safado de todos'); Finalmente, o PHP pede para executar a tarefa: $resultado->execute( ); Para o PHP verificar se o banco de dados executou a tarefa, o PHP pede para que traga os resultados, e guarde na variável $professor: $professor=$resultado->fetch_assoc(); Note que a última linha é diferente da sua, aqui certamente o PHP vai soltar uma mensagem de erro. Em linguagem acadêmica $ligação é uma instância da classe PDO. prepare, bindParam, execute, fetch são os métodos da classe PDO. classe é uma forma avançada de programar. Para incentivar você a estudar classe, tente criar uma classe chamada princesa, onde você define os predicados dela (altura, cor do cabelo,cintura) e o que ela pode fazer (menosprezar, xingar, fazergestosobscenos). É muito difícil, mas assim que você pegar o jeito, vai querer abandonar o PHP e partir para o Laravel.
-
routes/web.php <?php use Illuminate\Support\Facades\Route; Route::get('teste',[App\Http\Controllers\ControllerTeste::class,'teste']); app/Http/Controllers/ControllerTeste.php <?php namespace App\Http\Controllers; class ControllerTeste extends Controller { public function teste(){ return createURL('Acrósticos','Flores do campo');}} app/Helpers.php <?php use Illuminate\Support\Str; function createURL($genre,$title){ return Str::slug($genre) . "/" . Str::slug($title);} A função createURL retira os acentos e coloca tudo em minúsculo. No código acima, depois de digitar localhost:8000/laravel/teste, o resultado é esse: acrosticos/flores-do-campo. Faz tempo que eu criei o arquivo helpers.php, mas acredito que basta usar apenas uma vez o comando composer dump-autoload para o arquivo helpers fazer parte do projeto.
-
arquivo /astudy/index.php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <style> th {font-size: 12px} </style> <table class='table table-striped'> <tr><th>ID<th>FILIAL<th>NUMPED<th>CODPRO<th>NOME CLIENTE<th>QT M3<th>DESTINO <th>PRODUTO<th>TRANSPORTADORA<th>MOTORISTA<th>LITRAGEM A 20°.<th>POSICAO <th>DATA CHEGADA<th>OPÇÕES <?php $mysqli=new mysqli("localhost","root","","laravel"); if(isset($_GET['POSCAR'])){ $poscar=$_GET['POSCAR']; $id=$_GET['ID']; $mysqli->query("update produto set POSCAR='$poscar' where id=$id");} $query=$mysqli->query("select * from produto"); $sql=$query->fetch_all(MYSQLI_ASSOC); foreach ($sql as $key=>$item): ?> <form> <tr> <th><?=$item['ID']?><input type=hidden name=ID value=<?=$item['ID']?>> <th><?=$item['CODFIL']?> <th><?=$item['NUMPED']?> <th><?=$item['CODPRO']?> <th><?=$item['NOMCLI']?> <th><?=$item['QTDFAT']?> <th><?=$item['CIDCLI']?> <th><?=$item['CPLIPD']?> <th><?=$item['NOMTRA']?> <th><?=$item['NOMMOT']?> <th><input class="form-control" style=width:50px value=<?=$item['LITRAG']?>> <th> <select class="form-select" name="POSCAR"> <option><?=$item['POSCAR']?></option> <option value="D">D</option> <option value="C">C</option> <option value="L">L</option> </select> <th><?=date('d/m/y',strtotime($item['DATCHE']))?></th> <th> <input type=submit> </form> <?php endforeach; ?> </table> arquivo /astudy/mysql CREATE TABLE `produto` ( `ID` int NOT NULL, `CODFIL` int NOT NULL, `NUMPED` int NOT NULL, `CODPRO` varchar(6) NOT NULL, `NOMCLI` varchar(45) DEFAULT NULL, `QTDFAT` int DEFAULT NULL, `CIDCLI` varchar(45) DEFAULT NULL, `CPLIPD` varchar(45) DEFAULT NULL, `NOMTRA` varchar(45) DEFAULT NULL, `NOMMOT` varchar(45) DEFAULT NULL, `LITRAG` float DEFAULT NULL, `POSCAR` varchar(1) DEFAULT NULL, `DATCHE` date DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO `produto` VALUES (9,101,4950,'000620','IPIRANGA PRODUTOS DE PETROLEO SA',100,'GOIANIA','HIDRATADO','dalkjdlkasdka','dakjlsdkjlaskjldla',NULL,'F','2019-05-25'), (8,101,4950,'000620','TESTE',10,'TESTE','HIDRATADO','dasdsfsd','dakjlsdkjlaskjldla',NULL,NULL,'2019-05-24'), (6,101,4950,'000620','TESTE',20,'TESTE','HIDRTADO','TESTE','dakjlsdkjlaskjldla',NULL,'C','2019-05-24'), (4,101,4950,'000620','TESTE',60,'TESTE',NULL,'TESTE','dakjlsdkjlaskjldla',NULL,NULL,'2019-05-24');
-
Depois da orientação do Omar, mudei o código, mas a constante e a função spl só funciona nesse código. Toda vez que você atualiza a tela os dois recursos desaparecem. Logo, eu vou continuar usando o endereço absoluto aonde for necessário bem como definindo os parâmetros do banco de dados dentro da classe conexão. Existe uma extensão chamada phpize que poderia disponibilizar as contantes e funções para todos os módulos do PHP, mas ele não está disponível para o Windows. arquivo /astudy/index.php <?php function my_autoloader($class){include 'model/'.$class.'.php';} spl_autoload_register('my_autoloader'); define('HOST','localhost'); define('DBNAME','laravel'); define('PASSWORD',''); define('USER','root'); $pessoas=new pessoas(); var_dump($pessoas->buscaPessoa(1)); arquivo /astudy/model/conexão.php <?php class conexão { private static $pdo; public function __construct(){} public static function getInstance(){ if(!self::$pdo){ self::$pdo=new PDO("mysql:host=".HOST.";dbname=".DBNAME,USER,PASSWORD);} return self::$pdo;}} arquivo /astudy/model/pessoas.php <?php class pessoas extends conexão { private $pdo; public function __construct(){ $this->pdo=conexão::getInstance();} public function buscaPessoa($id){ $sql = "SELECT * FROM pessoas WHERE codigo = $id"; $stmt=$this->pdo->query($sql); return $stmt->fetch(PDO::FETCH_ASSOC);} public function deletaPessoa($id){ $sql = "DELETE FROM pessoas WHERE codigo = $id"; $stmt=$this->pdo->query($sql); return "Pessoa excluída";}} arquivo /astudy/mysql CREATE TABLE `pessoas` ( `codigo` int unsigned NOT NULL AUTO_INCREMENT, `nome` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`codigo`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `pessoas` VALUES (1,'Frank K Hosaka');
- 4 respostas
-
Aqui tem muita informação que eu não sabia, agradeço pela sua colaboração, e vou tentar adaptar os códigos. Eu sou um programador eventual, a minha especialidade é fazer gambiarra. Eu preciso mostrar a todo mundo como fazer a conexão, eu ainda não tenho a menor ideia de como usar as constantes, não sei onde codificar define('host','localhost'). Eu sou novo na área de linguagem orientada a objetos, ainda não sei o que é uma classe com função estática, comecei a usar nessa semana, quando consegui fazer uma conexão. Evito de fazer funções personalizadas e incentivo aos novos programadores usarem os recursos nativos do PHP. A minha prioridade no fórum é ajudar aos novatos a se familiarizarem com a gramática do PHP, alcançar um objetivo específico, e deixar o problema dos cuidados de um framework para os mais especialistas.
- 4 respostas