Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

AndersonWS

Aperfeiçoar Classe de Consulta do Mysql

Recommended Posts

Olá a todos.
Estou fazendo um trabalho aqui e começando a usar Orientação a Objetos com PHP então ainda não tenho plena certeza dos passos.

Achei na net muitos exemplos mas como existem várias maneiras queria saber a melhor forma de quem tem mais experiência.

Segue o código criado até o momento, classe SelectOrganizacao.class.php

<?php
/**
 *
 * Classe para Listar Organizações
 * @autor Anderson de Oliveira 
 * @version 1.0
 *
**/
class SelectOrganizacao
{
	// campos da tabela
	private $idOrg;
	private $nmOrg;
	private $statusOrg;
	private $cad;
	private $alt;
	
	public function listarOrganizacoes() 
	{
		// inclui a classe de conexão
		require_once 'Database.class.php';
		
		// atribui a instância de conexão na variável
		$db = Conexao::getInstance();

		// consulta que retorna
		$query = $db->prepare("SELECT * FROM " . Conexao::getTabela('TB_ORGANIZACAO').""); 
		$query->execute();
		
		$num_rows = count($query);
		
		if ($num_rows > 0)
		{
			// escreve a consulta
			foreach($query->fetchAll(PDO::FETCH_ASSOC) as $l) 
			{
				$this->idOrg = $l['idOrg'];
				$this->nmOrg = $l['nmOrg'];
				$this->statusOrg = $l['statusOrg'];
				$this->cad = $l['cad'];
				$this->alt = $l['alt'];
				
				$dados[]=array(
				"idOrg"=>$this->idOrg,
				"nmOrg"=>$this->nmOrg,
				"statusOrg"=>$this->statusOrg,
				"cad"=>$this->cad,
				"alt"=>$this->alt
				);
			}
			return $dados;
		}
	}
}

E no html:

<?php 
	
	include "class/SelectOrganizacao.class.php";
	$p = new SelectOrganizacao();
	$dados = $p->listarOrganizacoes();
	foreach ($dados as $l) 
	{
		echo $l['idOrg'].' - '.$l['nmOrg'].' - '.$l['statusOrg'].' - '.$l['cad'].' - '.$l['alt'].'<br/>';
	}

?>

Funciona certinho. Minhas dúvidas:
- Sintaxe/uso correto, vícios ou forma errada de proceder;

- Em que eu poderia melhorar quanto a performance;

- Como eu faço para retornar no meu html o valor de "$num_rows" ou então dar um valor true (existem resultados) e false (não existem);
- Outras sugestões.

 

Desde já agradeço a todos, assim que forem me dando as dicas para melhorar ou eu fizer uma melhoria vou postando aqui.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro passo é evitar includes, ainda mais dentro de objetos.

 

Para isso tem Autoloads, que faz o carregamento automático das classes, bastando apenas instanciar a classe e usar o objeto, se estudar mais a fundo, você vera que nem precisara mais estanciar as classes, através dos famigerados NEWs QualquerCoisa.  Mas isso é assunto para outra hora.


Para evitar os requires, includes etc

Use http://php.net/manual/pt_BR/function.spl-autoload-register.php 

Autoload.php

<?php

spl_autoload_register(function ($class) { 

    $pathClass = 'class/' . $class . '.class.php';

    if (file_exists($pathClass)) {
        require_once $pathClass;
    }
});

E chame no inicio do script. Mas deixe separado de outras configurações, vai que você descobre o Composer e resolva trocar.

 

O único arquivo que seria incluído é o próprio Autoloader.

index.php

<?php
include 'Autoload.php';
$p = new SelectOrganizacao();
$dados = $p->listarOrganizacoes();
foreach ($dados as $l) 
{
	echo $l['idOrg'].' - '.$l['nmOrg'].' - '.$l['statusOrg'].' - '.$l['cad'].' - '.$l['alt'].'<br/>';
}

Nome de Classe
 

Citar

SelectOrganizacao

Português ou Inglês. Nunca as duas coisas!

 

10 horas atrás, AndersonWS disse:

 


[...]
	public function listarOrganizacoes() 
	{
		// inclui a classe de conexão
		require_once 'Database.class.php';
		
		// atribui a instância de conexão na variável
		$db = Conexao::getInstance();

		// consulta que retorna
		$query = $db->prepare("SELECT * FROM " . Conexao::getTabela('TB_ORGANIZACAO').""); 
		$query->execute();

[...]

 

Passe a conexão pelo construtor e declare em uma variável, desta forma, baixa o acoplamento. Se quiser criar um novo método, só usar a variável que foi atribuída a conexão. Evitando repetição de código desnecessário.

 

[...]

class SelectOrganizacao
{
    private $db;

    public function __construct()
    {
        $this->db = Conexao::getInstance();
    }

[...]

 

Falando sobre repetição de código; Don't repeat yourself

 

10 horas atrás, AndersonWS disse:

 


[...]
		
		if ($num_rows > 0)
		{
			// escreve a consulta
			foreach($query->fetchAll(PDO::FETCH_ASSOC) as $l) 
			{
				$this->idOrg = $l['idOrg'];
				$this->nmOrg = $l['nmOrg'];
				$this->statusOrg = $l['statusOrg'];
				$this->cad = $l['cad'];
				$this->alt = $l['alt'];
				
				$dados[]=array(
				"idOrg"=>$this->idOrg,
				"nmOrg"=>$this->nmOrg,
				"statusOrg"=>$this->statusOrg,
				"cad"=>$this->cad,
				"alt"=>$this->alt
				);
			}
			return $dados;
[...]

 

$query->fetchAll, já fez tudo isso que você esta fazendo novamente.

 

De um return e pronto. 

return $query->fetchAll(PDO::FETCH_ASSOC);

Simplify stupid :thumbsup:

 

$query = $db->prepare("SELECT * FROM " . Conexao::getTabela('TB_ORGANIZACAO').""); 

Sem comentários, é a coisa mais bizarra que já vi em OO.

 

 

Você não precisa mais do que isso... Para fazer praticamente a mesma coisa e com menos código.

<?php

/**
 *
 * Classe para Listar Organizações
 * @autor Anderson de Oliveira 
 * @version 1.0
 *
**/
class SelectOrganizacao
{

	private $db;

	public function __construct()
	{
		$this->db = Conexao::getInstance();
	}

	public function listarOrganizacoes() 
	{

		try {

			// consulta que retorna
			$query = $this->db->prepare("SELECT * FROM TB_ORGANIZACAO"); 
			$query->execute();
			return $query->fetchAll(PDO::FETCH_ASSOC);
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}		

	}
}



 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Williams Duarte primeiramente muito obrigado pelas explicações e tudo mais, talvez pra quem está com prática tudo isso é simples, mas pra quem está começando algo simples é mais complicado de entender.

Primeiro quero comentar algumas coisas:

 

 - A questão do Autoload já tinha visto mas como copiei o exemplo de conexão e estava testando aqui não tinha implementado ainda, mas de qualquer forma estudei mais e entendi melhor. E sim já vi o Composer mas neste projeto em si não poderei usar.

 

- Português ou Inglês. Nunca as duas coisas! - Verdade, falha minha!
 

- Entendi, estou começando então ainda não peguei a pratica, obrigado.

return $query->fetchAll(PDO::FETCH_ASSOC);

-  Isso eu copiei e colei do exemplo do arquivo de conexão e não mexi por isso não sei o que dizer sobre, segue o link (blog.unifick.com.br/desenvolvimento/classe-para-conexao-com-banco-de-dados-em-pdo):

$query = $db->prepare("SELECT * FROM " . Conexao::getTabela('TB_ORGANIZACAO').""); 

- __construct

[...]

class SelectOrganizacao
{
    private $db;

    public function __construct()
    {
        $this->db = Conexao::getInstance();
    }

[...]

Sei que é errado usar o include mas não funcionou desta forma sem o include. Pode me dar exemplo de uso para usar uma classe "dentro" de outra?

Alguma ajuda nesta parte?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

 E sim já vi o Composer mas neste projeto em si não poderei usar.

Ué não usa então

 

 

O auto autoload pode ser criado facilmente se sua estrutra estiver padronizada...

Exemplo:

<?php

/*
//Exemplo da estrutura de pastas:
- meuprojeto 
- class
-- Leilao.php
-- Usuario.php
-- Lance.php
-- Database.php
*/

spl_autoload_register(function($className) {
	$file = __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\',DIRECTORY_SEPARATOR, 'class\\' . $className) . ".php";
	if(file_exists($file)){
		 require_once($file);
	}
});


$leilao = new Leilao('TV 90 Polegada');
$renam 	= new Usuario('Renam');
$felipe = new Usuario('Felipe');

$leilao->propoe(new Lance($renam, 50));
//$leilao->propoe(new Lance($felipe, 100));
$leilao->dobraLance($felipe);

Caso queira dar uma olhada:

https://github.com/gabrieldarezzo/phpunit

 

 

Pessoal comenta bastante da psr-4, porem para um primeiro momento acredito o exemplo acima já é um bom começo.

 

 

Dica: Se vai utilizar o .class como nome, utilize em todos os arquivos e altere no seu autoLoad

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pelas dicas, me ajudou muito mas realmente estou com dúvidas quanto ao "chamar" a classe Conexao na classe SelecionaOrganizacao.

Sei que deve ser bem básico mas como disse estou começando, poderiam me dar um exemplo de uma classe de consulta ao banco com um classe de conexão para ficar mais claro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que falta é ler a documentação e entender o que são propriedades.:tounge_wink:

 

http://php.net/manual/pt_BR/language.oop5.php

Porque no exemplo acima, já esta mais do que claro que peguei a instancia da conexão e atribui na variavel: 

$this->db

O restante é por conta do Autoload, claro que, no exemplo acima, a classe de conexão tem que estar na mesma pasta, senão não ira funcionar.

 

Vi o exemplo, evite aquilo, não é função da classe de conexão saber quais tabela, modulo etc usar.

 

Você deve ser capaz de estender um comportamento de uma classe, sem modificá-la. Isso é o segundo principio do S.O.L.I.D, a OCP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre o autoload não sei se ficou bem claro..

 

Durante a execução do script quando você falar assim:

<?php

$db = Conexao::getInstance();

Ele automaticamente vai executar a função 

spl_autoload_register()

Chamando o include_once dinamicamente entende?

 

 

1 hora atrás, AndersonWS disse:

poderiam me dar um exemplo de uma classe de consulta ao banco com um classe de conexão para ficar mais claro?

 

Da uma pesquisada sobre DAO e/ou ORM em abstrações de O.O. é muito comum

https://forum.imasters.com.br/topic/513409-poo-dao/

 

Como o @Williams Duarte falou, a leitura é bem rica:

http://php.net/manual/pt_BR/language.oop5.php

 

 

@dica 

Recentemente assinei a Alura e tem bastante conteúdo sobre php, da uma olhada na grade básica de php:

https://www.alura.com.br/carreira-desenvolvedor-php-junior

 

As vezes é um investimento legal a se fazer, pelo fato das video

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Williams Duarte disse:

O que falta é ler a documentação e entender o que são propriedades.:tounge_wink:

 

http://php.net/manual/pt_BR/language.oop5.php

Porque no exemplo acima, já esta mais do que claro que peguei a instancia da conexão e atribui na variavel: 


$this->db

O restante é por conta do Autoload, claro que, no exemplo acima, a classe de conexão tem que estar na mesma pasta, senão não ira funcionar.

 

Vi o exemplo, evite aquilo, não é função da classe de conexão saber quais tabela, modulo etc usar.

 

Você deve ser capaz de estender um comportamento de uma classe, sem modificá-la. Isso é o segundo principio do S.O.L.I.D, a OCP.

Minhas classes estão dentro da pasta class/
O Autoload está na raiz (está errado?)
Quanto a documentação vou ler sim, estou começando e claro que agradeço as dicas de leitura.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, gabrieldarezzo disse:

Ele automaticamente vai executar a função 

Entendi porém dá erro de Class 'Conexao' not found in ... mas está na mesma pasta...:sweat:

class SelecionaOrganizacao
{
	
	private $db;
	
	public function __construct()
	{
		// inclui a classe de conexão
		//require_once 'Database.class.php';
		
		// atribui a instância de conexão na variável
		$this->db = Conexao::getInstance();
	}
	
	public function listarOrganizacoes() 
	{
		try {

			// consulta que retorna
			$query = $this->db->prepare("SELECT * FROM " . Conexao::getTabela('TB_ORGANIZACAO').""); 
			$query->execute();
			return $query->fetchAll(PDO::FETCH_ASSOC);
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}		

	}
}

Quando 'descomento' require_once 'Database.class.php'; funciona.
Quando comento da o erro...
Autoload.php está na raiz
As classes estão na pasta class/
Qual o problema? :confused:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao usar o autoload você precisa se atentar em:

nome do arquivo, (retirou o '.class'? ) ???  'Database.class.php'; 

nome da classe: (está como Conexao?)

 

Não faz sentido chamar  o nome do arquivo de classe Database e dentro dele ter uma classe chamada Conexao.

 

 

Resumindo.

Padroniza tudo.

 

Arquivo Classe.php, tem a classe:

<?php
class Classe{

}

dentro da pasta /class, assim o exemplo do autoload funciona ;)

 

 

 

Ps: só cuidado pra não ferir oq o @Williams Duarte comentou de misturar inglês com português

 

Já que Conexao !== Database

 

Ps2: cuidado com o case sensitive DataBase != Database  

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, gabrieldarezzo disse:

Padroniza tudo.

Mudei o nome para Conexao.class.php e funcionou. :smile:
Erro de principiante. Obrigado a todos vou continuar estudando aqui e posto o resultado quando finalizar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como falei, posto agora o resultado após as ótimas dicas e orientações para seguir melhorando peço que quem tiver melhores práticas que ajude para termos uma boa classe aqui para ajudar a comunidade!

class Conecta
{
    private static $instance = null;

    private function __construct() {}

    private function __clone() {}

    public static function conectar() 
    {
    	if (!isset(self::$instance)) {
	        try {
	            self::$instance = new PDO("mysql:host=MEUHOST;dbname=MEUBANCO", "MEUUSUARIO", "MINHASENHA");
	            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	        } catch (PDOException $e) {
	            echo "Erro: " . $e->getMessage();
	        }
        }

        return self::$instance;
    }
}
class SelecionaOrganizacao
{
	
	private $db;
	
	public function __construct()
	{
		// atribui a instância de conexão na variável
		$this->db = Conecta::conectar();
	}
	
	public function listarOrganizacoes() 
	{
		try {

			// consulta que retorna
			$query = $this->db->prepare("SELECT * FROM organizacao"); 
			$query->execute();
			return $query->fetchAll(PDO::FETCH_ASSOC);
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}		

	}
}
// Autoload
spl_autoload_register(function($className) {
	$file = __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\',DIRECTORY_SEPARATOR, 'class\\' . $className) . ".class.php";
	if(file_exists($file)){
		 require_once($file);
	}
});
// index
include 'Autoload.php';

$p = new SelecionaOrganizacao();
$dados = $p->listarOrganizacoes();

foreach ($dados as $l) 
{
	echo $l['nomeOrg'].'<br/>';
}

Vou deixar os comentários para os mais experientes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem melhor que a primeira!

 

Este é o caminho, isolar o máximo classe que faz a conexão com as demais classes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostei muito das dicas e sugestões aqui e continuando e querendo melhorar a classe e torna-la mais genérica e versátil possível, fiz um ajuste para poder usar para qualquer tabela:

  index.php

$table = 'ufs';

$p = new Select($table);
$dados = $p->listar();

foreach ($dados as $l) 
{
	echo $l['nome'].'<br/>';
}

e na classe Select.class.php:
 

class Select
{
	
	private $db;

	protected $tabela;

	public function __construct($tabela)
    {
		$this->tabela = $tabela;
		// atribui a instância de conexão na variável
		$this->db = Conecta::conectar();
	}
	
	public function listar() 
	{
		try {

			// consulta que retorna
			$query = $this->db->prepare("SELECT * FROM ".$this->tabela.""); 
			$query->execute();
			return $query->fetchAll(PDO::FETCH_ASSOC);
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}		

	}
}

Não sei se é uma boa maneira e aceito sugestões ou uma melhor.

Achei muitos exemplos diferentes na internet e confesso que de tantos exemplos diferentes acabei não sabendo qual o mais "ideal" ou ao menos mais simples e seguro possível.


Outra questão como eu faria o mesmo para "WHERE", ou seja,  WHERE id = 1 ou WHERE nome = '%Garcia' ?

Desde já agradeço as ideias e sugestões

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

10 horas atrás, AndersonWS disse:

Outra questão como eu faria o mesmo para "WHERE", ou seja,  WHERE id = 1 ou WHERE nome = '%Garcia' ?

Desde já agradeço as ideias e sugestões

 

Da uma pesquisada sobre o padrão ActiveRecord .

É um padrão que os grandes FWs usam. pode nortear melhor seus estudos ;) 

 

 

Outra opção que imagino ser 'simples' e seguro possível. seria utilizar os prepared statments + passando parâmetros diretamente, fica um pouco engessado, porem é aquela velha historia não existe algoritmo perfeito/ideal para todos os casos.

 

Exemplo:

public function listarPeloNome($nome)
{
	
	/*
	//Opção 1, caso seja obrigatorio
	if($nome == ''){
		return array();
	}
	
	//Opção 2, caso vazio, trazer todos os resultados... aproveitando o metodo all/listar
	if($nome == ''){
		return $this->listar();
	}
	*/
	
	
	$stmt = $this->db->prepare("SELECT * FROM ".$this->tabela." where LIKE :nome"); 
	
	$nome = $nome . '%';	
	$stmt->bindParam(':nome', $nome, PDO::PARAM_STR);	
	$stmt->execute();
	
	return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

Ai fica seu critério escolher.

Por exemplo:

Opção 1 cai muito bem para filtros onde é obrigatório a busca do nome (agregar ao resultado final)

 

A complexidade começa ao começar misturar coisas como ocorrem no 'mundo real'

1 - Como você faria um filtro de Nome + estado_civil?

2 - Como você faria um filtro de Nome (Opcional) + estado_civil?

3 - Como você faria um filtro de Nome (Opcional) + estado_civil (trazer todos)?

 

 

Ps:

Em SQL... Não existe isto:

nome = '%termo%'

Existe isto:

nome like '%termo%'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma boa prática é utilizar padrões, classes demasiadamente genéricas são problemáticas.  Ainda mais quando não são bem escritas. :relaxed:

Agora é como o amigo @gabrieldarezzo disse, você pode utilizar toolkit de banco de dados estilo ActiveRecord, na minha opinião, um dos melhores é o illuminate https://github.com/illuminate/database


E para uso o ORM Eloquent

 

$usuario = Usuario::where('nome', 'like', 'João')->get();

Ou começar como todos os caras que querem aprender de fato a trabalhar com objetos, fazem, que é separar por camadas de dominio, nem que seja utilizando o padrão de projeto DAO. Escreve mais código, obvio que sim, mas pelo menos, seu código será bem escrito, reutilizável e testável. Amanhã qualquer um que pegar seu código compreenderá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, agradeço as dicas e orientações, como um projeto de estudo estou aprendendo muito.

Vou olhar sim os padrões indicados e ajustar a classe.
 

10 horas atrás, Williams Duarte disse:

Uma boa prática é utilizar padrões, classes demasiadamente genéricas são problemáticas.  Ainda mais quando não são bem escritas.

Entendo o que você quer dizer e concordo plenamente por isso estou postando aqui para que esta classe fique bem escrita e não tenha esses problemas.

Se alguém mais tiver dicas ou sugestões ou até mesmo exemplos pode postar!
Vou escrever aqui assim que tiver feito as modificações e no final espero poder postar uma ótima classe para ajudar a toda a comunidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou fazendo o create e surgiu umas questões.

Como eu faria isso em uma classe?
Segue o que foi feito.

public function create($nome,$status) 
	{
		try {
			// insert no banco de dados
			$stmt = $this->db->prepare("INSERT INTO ".$this->table." (nome,status) VALUES (:nome, :status)");

			$stmt->bindParam( ':nome', $nome, PDO::PARAM_STR );
			$stmt->bindParam( ':status', $status, PDO::PARAM_STR );

			$stmt->execute();
			
			$id_inserido = $this->db->lastInsertId(); 

			$this->db = null;
			return $id_inserido;
			
		} catch (PDOException $e) {
			die('Error: '. $e->getMessage() );
		}
	}

Esta correto? Está seguro?
Dos tratamentos eu eu faria assim:

$nome = mysqli_real_escape_string($link, $nome);

Os tratamentos na classe da forma que fiz estão boas?
Agradeço as opiniões dos mais experientes.

Melhorias? Ajustes?

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use implode para montar a Query, já que esta criando um método genérico de inserts

 

Crie funçoes separadas para enviar estes dados.

 

 

Exemplo

 

class CRUD
{

    private $table;
    private $columns;
    private $fields;


    public function table($table)
    {
        $this->table = $table;
        return $this;
    }


    public function columns($columns)
    {
        $this->columns = $columns;
        return $this;
    }


    public function fields($fields)
    {
        $this->fields = $fields;
        return $this;
    }


    public function create()
    {

        //use as variaveis abaixo para o insert
        //$this->table
        //$this->columns
        //$this->fields

        
    }


}

 

uso


$crud = new CRUD();
$crud->table('name')
     ->columns([])
     ->fields([])
     ->create();

Dei uma dica de como usar array_map neste post, so seguir a logica do @jamesbond para os inserts e binds dinâmicos.

 

 

 

Como estou referenciando o próprio objeto, ta pra utilizar métodos fluents

 

https://en.wikipedia.org/wiki/Fluent_interface

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Williams Duarte disse:

Use implode para montar a Query, já que esta criando um método genérico de inserts

 

Crie funçoes separadas para enviar estes dados...

 

Bela dica. Dessa maneira acho que o padrão facade também se encaixaria, o que acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.