Ir para conteúdo

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 landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
×

Informação importante

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