Ir para conteúdo

POWERED BY:

Arquivado

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

Rodrigo5468

Verificar campos e DB

Recommended Posts

Olá,

 

Estou fazendo um sistema de cadastro em PDO OO.

 

Cadastro.php

public function insert() {
	if(isset($usuario) && isset($nomesobrenome) && isset($email) && isset($senha)) {
		if(empty($usuario) OR empty($nomesobrenome) OR empty($email) OR empty($senha)) {
			echo 'Existe campos vazios.</div>';
		}
	}else {
		$verifica = DB::prepare("SELECT * FROM {$this->table} WHERE usuario=:usuario OR nomesobrenome=:nomesobrenome OR email=:email");
		$verifica->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
		$verifica->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
		$verifica->bindValue(':email',$this->email,PDO::PARAM_STR);
		$verifica->execute();
		
		if($verifica->rowCount() == 0) {
			$sql  = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) VALUES (:usuario, :nomesobrenome, :email, :senha)";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':usuario', $this->usuario);
			$stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			return $stmt->execute();
		}else {
			return false;
		}
	}
}

 

 

register.php

			<?php
				$usuarios = new Usuarios();
				
				if(isset($_POST['cadastrar'])) {
					$usuario					= $_POST['usuario'];
					$nomesobrenome				= $_POST['nomesobrenome'];
					$email						= $_POST['email'];
					$senha						= $_POST['senha'];
					
					$usuarios->setUsuario($usuario);
					$usuarios->setNomesobrenome($nomesobrenome);
					$usuarios->setEmail($email);
					$usuarios->setSenha($senha);
					
					#Insert
					if($usuarios->insert()) {
						echo 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
					}
				}
			?>

Quando eu registro a conta aparece a seguinte frase "Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.". Mas já existe um cadastro no banco de dados não aparece nenhum erro, informando que já existe o usuário, o nome e sobrenome ou o e-mail. E quando existe campos vazios o script cadastra a conta do mesmo jeito. O que  preciso mudar para corrigir o meu código?

 

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo5468, existe muitos problemas no seu código, vou falar apenas do problema em questão e outras basicas
 

public function insert() 
{
  if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
    echo 'Existe campos vazios.</div>'; # Dar echo dentro da classe não é bom!
    return false;
  }

  $stmt = DB::prepare("
    SELECT * 
    FROM {$this->table} 
    WHERE usuario=:usuario 
    OR nomesobrenome=:nomesobrenome 
    OR email=:email"
  );

  $stmt->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
  $stmt->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
  $stmt->bindValue(':email',$this->email,PDO::PARAM_STR);
  $stmt->execute();

  $usuarioExiste = $stmt->rowCount();

  if($usuarioExiste) {
    return false;
  }

  $sql = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) 
  VALUES (:usuario, :nomesobrenome, :email, :senha)";

  $stmt = DB::prepare($sql);
  $stmt->bindParam(':usuario', $this->usuario);
  $stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
  $stmt->bindParam(':email', $this->email);
  $stmt->bindParam(':senha', $this->senha);

  return $stmt->execute();
		
}

# Esses isset não é necessario, já que as propriedades sempre vão existir
# Você esta esquecendo o  $this-> na validação do campos preenchido
# Você não precisa desse monte de if, else
# Quando quiser encerrar o codigo, use o return

 

12 horas atrás, Rodrigo5468 disse:

$verifica = DB::prepare("SELECT * FROM {$this->table} WHERE usuario=:usuario OR nomesobrenome=:nomesobrenome OR email=:email");

 

Não sei qual é a sua regra de negócio, mas esta certo de que deseja um OR, e não um END?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow cara!!! O código fincou bem simples e funciona perfeitamente.

Você disse "mas esta certo de que deseja um OR, e não um END?" Não entendi muito bem o end, seria and? Estou começando agora, não sei qual é o melhor para usar o or, end ou and. Se poder me dá uma força.

 

echo 'Existe campos vazios.</div>'; # Dar echo dentro da classe não é bom!

Você também escreveu isso no código. Também não acho legal dar echo dentro da classe. Eu queria puxar um echo e colocar as informações na página register.php como posso fazer isso?

Exemplo:

			<?php
				$usuarios = new Usuarios();
				
				if(isset($_POST['cadastrar'])) {
					$usuario					= $_POST['usuario'];
					$nomesobrenome				= $_POST['nomesobrenome'];
					$email						= $_POST['email'];
					$senha						= $_POST['senha'];
					
					$usuarios->setUsuario($usuario);
					$usuarios->setNomesobrenome($nomesobrenome);
					$usuarios->setEmail($email);
					$usuarios->setSenha($senha);
					
					#Insert
					if($usuarios->insert()) {
						echo 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
					}
                  	#Dar echo aqui falando que existe campos vazios.
                  	#Dar echo aqui falando que algum dado que ele tentou registrar já existe no banco de dados.
				}
			?>

 

 

Obrigado por tudo cara, muito obrigado mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

25 minutos atrás, Rodrigo5468 disse:

echo 'Existe campos vazios.</div>'; # Dar echo dentro da classe não é bom!

Você também escreveu isso no código. Também não acho legal dar echo dentro da classe.

Você pode gerar exceções...

 

Ex dentro do seu contexto:

<?php
public function insert() 
{
	if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {	
		throw new Exception('Existe campos vazios.');
	}
	....

Ai na hora de executar algo +/- assim:

<?php
try {

	$usuario					= $_POST['usuario'];
	$nomesobrenome				= $_POST['nomesobrenome'];
	$email						= $_POST['email'];
	$senha						= $_POST['senha'];
	$usuarios->setUsuario($usuario);
	$usuarios->setNomesobrenome($nomesobrenome);
	$usuarios->setEmail($email);
	$usuarios->setSenha($senha);

	if($usuarios->insert()){
		echo '<div class="success">Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
	}
    
} catch (Exception $e) {
	echo '<div class="error">'. $e->getMessage() .'</div>';    
}

 

Ps: foi um exemplo simples, aprofundar é preciso.

 

Leia mais:

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Princípio orientado à objeto denominado Tell, don't ask. BasicamenteVocê deve mandar/dizer para que uma classe/objeto faça algo e não perguntar a ela sobre o que, ou se, ela realizou. Exceto se o nome do método é uma pergunta (get, is, has, can, etc..).

 

Em um método denominado insert espera-se que o método insira um registro. Se tudo ocorrer certo, um registro será inserido. Se um registro não foi inserido, algo que não estava esperado ocorreu. Se inesperado ocorreu, é uma exceção.

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, Rodrigo5468 disse:

if($usuarios->insert()) { echo 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>'; } #Dar echo aqui falando que existe campos vazios. #Dar echo aqui falando que algum dado que ele tentou registrar já existe no banco de dados.


Você esta muito viciado em if, else rsrs (brincadeira)

Melhorando mais um pouco, ficaria assim:

public function insert() 
{
  if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
    return 'Existe campos vazios!';
  }

  $stmt = DB::prepare("
    SELECT * 
    FROM {$this->table} 
    WHERE usuario=:usuario 
    OR nomesobrenome=:nomesobrenome 
    OR email=:email"
  );

  $stmt->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
  $stmt->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
  $stmt->bindValue(':email',$this->email,PDO::PARAM_STR);
  $stmt->execute();

  $usuarioExiste = $stmt->rowCount();

  if($usuarioExiste) {
    return 'Usuario já existe!';
  }

  $sql = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) 
  VALUES (:usuario, :nomesobrenome, :email, :senha)";

  $stmt = DB::prepare($sql);
  $stmt->bindParam(':usuario', $this->usuario);
  $stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
  $stmt->bindParam(':email', $this->email);
  $stmt->bindParam(':senha', $this->senha);

  if ($stmt->execute()) {
	return '<div class="success">Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
  }

  return 'Falha ao cadastrar!';	
		
}
<?php
        $usuario = $_POST['usuario'];
        $nomesobrenome = $_POST['nomesobrenome'];
        $email = $_POST['email'];
        $senha = $_POST['senha'];
      
        $usuarios->setUsuario($usuario);
        $usuarios->setNomesobrenome($nomesobrenome);
        $usuarios->setEmail($email);
        $usuarios->setSenha($senha);
      
        echo $usuarios->insert();


Note como o uso do return evita o uso de else, e deixa o código mais simples, como da mesma forma em 

echo $usuarios->insert();

Não é necessário o uso de if elseif. Não deixe de ver a ótima dica do  Tell, don't ask que o Gabriel sugeriu

 

5 horas atrás, Rodrigo5468 disse:

Você disse "mas esta certo de que deseja um OR, e não um END?" Não entendi muito bem o end, seria and?


Sim, um and, escrevi errado :)

Por exemplo:
Considere que esse registro existe no banco: joao, joao da silva, joao@joao.com

Se tentar cadastrar joao, joao dos santos, joao@joao.com
Com o OR, sera cadastrado, com o AND não

De uma pesquisa por "logica de programação, operadores logicos"

Compartilhar este post


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

Você esta muito viciado em if, else rsrs (brincadeira)

Essa técnica pode se enquadrar como 'early return' 

 

o @EdCesar esqueceu de lançar a exceção...


Não faz sentido ter blocos de try sem uso de 

 

throw new Exception('Oppss.. isso não deveria acontecer.');



Tem alguns artigos para exemplificar o uso do early return independente de usar blocos de try/catch

http://blog.alura.com.br/quanto-mais-simples-melhor/

https://softwareengineering.stackexchange.com/a/18473

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
47 minutos atrás, gabrieldarezzo disse:

o @EdCesar esqueceu de lançar a exceção...


@gabrieldarezzo,  bem observado, atualizei e retirei o try cath.
Nesse caso caso dele, acho que dar apenas o return com a mensagem de falha ou sucesso, deixa o código mais simples

Tem outras coisas também que é importante tratar, também como:

$nome = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';

ou no PHP 7:

$usuario = $_POST['usuario'] ?? '';

Foge do tópico, mas fica a dica :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi tudo por enquanto, mas estou com uma pequena dúvida, por favor me esclareça.

@EdCesarpode perceber que você citou esses dois últimos códigos.

"Tem outras coisas também que é importante tratar, também como:

$nome = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';

ou no PHP 7:

$usuario = $_POST['usuario'] ?? '';

"

 

 

Eu tenho meus três "private" que irei utilizar para mostrar o usuário os dados incorretos, e que ele precisa corrigir para cadastrar no sistema.

private

private $usuario;
private $nomesobrenome;
private $email;

Aqui nesses seguintes códigos eu quero especificar os campos, usarei o código acima de exemplo que você deixou? Eu testei aqui mas não obtive resultados, se poder me deixar um exemplo.

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	return 'Existe campos vazios!';
}

#####################

if($usuarioExiste) {
	return 'Usuario já existe!';
}

Eu quero especificar se é o usuário, nomesobrenome ou e-mail que está vazio, ou se algum desses dados já existem. Exemplo:

"O campo usuário está vazio, por favor, preencha!"

"O endereço de e-mail que você forneceu já existe em nosso banco de dados, tente usar outro."

 

 

Muito obrigado por tudo mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá novamente!

 

Fiz aqui para ter uma validação um pouco melhor, mas acho que estou fazendo errado, pois não está funcionando perfeitamente.

Verificando se existe campos em brancos, e quais deles estão em branco.

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	if(empty($this->usuario)) {
		return 'Usuário está em branco.';
	}elseif(empty($this->nomesobrenome)) {
		return 'Nome/Sobrenome está em branco.';
	}elseif(empty($this->email)) {
		return 'E-mail está em branco está em branco.';
	}elseif(empty($this->senha)) {
		return 'Senha está em branco.';
	}else{
		return 'Usuário, Nome/Sobrenome, E-mail, Senha, estão em branco.';
	}
	
	return 'Preencha todos os campos em branco.';
}

Verificando se existe algum campo registrado no banco de dados, e quais deles são.

public function insert() {
	if($this->usuario) {
		return 'Campo Usuário já está cadastrado em nosso banco de dados.';
	}elseif($this->nomesobrenome) {
		return 'Campo Nome/Sobrenome  já está cadastrado em nosso banco de dados.';
	}elseif($this->email) {
		return 'Campo E-mail já está cadastrado em nosso banco de dados.';
	}else{
		return 'Algum desses campos já estão cadastrado em nosso banco de dados: Usuário, Nome/Sobrenome ou E-mail.';
	}
	
	return 'Algum dado que você tentou inserir já consta em nosso banco de dados.';
}

 

 

Quando chega para verificar se a senha está em branco ou não, ele prossegue e cadastra o usuário com senha nula. E a mensagem de erro para verificar se existe algum dado já em nosso banco de dados, ele sempre mostra a opção Usuário. Por favor, como faço para arrumar este pequeno detalhe?

 

 

Obrigado mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu código que está com a complexidade ciclomática muito alta. Use early returns para reduzí-la.

 

Quanto a validação, tudo que não permitir a persistência no SGBD é uma exceção, ou seja:

if($this->usuario) {
    throw new RuntimeException('Campo Usuário já está cadastrado em nosso banco de dados.');
}

if($this->nomesobrenome) {
    throw new RuntimeException('Campo Nome/Sobrenome  já está cadastrado em nosso banco de dados.');
}

/** demais validações **/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

o

1 hora atrás, Rodrigo5468 disse:

E como eu posso diminuir ou até tirar a complexidade ciclamática?

 

O me chara disse no post ué:

5 horas atrás, Gabriel Heming disse:

Use early returns para reduzí-la.

 

 

Chegou a abrir os links abaixo?

Em 2017-5-17 at 17:29, gabrieldarezzo disse:

Tem alguns artigos para exemplificar o uso do early return independente de usar blocos de try/catch

http://blog.alura.com.br/quanto-mais-simples-melhor/

https://softwareengineering.stackexchange.com/a/18473

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu já fiz os try/catch e apliquei os exemplos dos links.

Verificar se existe campos em brancos, e quais são

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	if(empty($this->usuario))
		return 'Campo Usuário em branco.';
	
	if(empty($this->nomesobrenome))
		return 'Campo Nome/Sobrenome em branco.';
	
	if(empty($this->email))
		return 'Campo E-mail em branco';
	
	if(empty($this->senha))
		return 'Campo Senha em branco.';
}

Verificar quais campos estão cadastrado no banco de dados, e quais são

if($usuarioExiste) {
	if($this->usuario)
		return 'Usuario já existe!';
	
	if($this->nomesobrenome)
		return 'Nome/Sobrenome já existe!';
	
	if($this->email)
		return 'E-mail já existe!';
}

 

Para verificar se os campos em branco, ele funciona perfeitamente, mas quando deixa o campo senha em branco ele não apresenta o erro. E o usuário sempre, sempre mostra o primeiro return que é "Usuário já existe". Estou pesquisando em diversos fóruns, artigos, youtube para conseguir arrumar mas não consigo. Se poder me explicar um pouco mais eu agradeço de coração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo5468, legal que você esta se esforçando! Melhorando um pouco mais o seu código, na questão das validações, poderia ficar assim:

 

Para a questão dos campos inválidos

Troque:

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	if(empty($this->usuario))
		return 'Campo Usuário em branco.';
	
	if(empty($this->nomesobrenome))
		return 'Campo Nome/Sobrenome em branco.';
	
	if(empty($this->email))
		return 'Campo E-mail em branco';
	
	if(empty($this->senha))
		return 'Campo Senha em branco.';
}

Por isso:

$propriedades = get_class_vars(get_class($this)); 

if (!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
  throw new \Exception('E-mail invalido!');
}

foreach ($propriedades as $propriedade => $valor) {
  if (empty($this->$propriedade)) {
    throw new \Exception('o campo '. $propriedade . ' não foi preenchido!');
  }
}


Se na sua classe você tem mais propriedades do que usuario, nomesobrenome,email e senha, então troque

$propriedades = get_class_vars(get_class($this)); 

do código acima, por:
 

$propriedades = [
  'usuario' => $this->usuario, 
  'nomesobrenome' => $this->nomesobrenome, 
  'email' => $this->email, 
  'senha' => $this->senha
];

 

Para a validação dos dados existentes
 

Troque esse trecho:

$usuarioExiste = $stmt->rowCount();

  if($usuarioExiste) {
    return 'Usuario já existe!';
  }

Por esse:

$resultado = $stmt->fetch(\PDO::FETCH_ASSOC);

$dadosJaExistem = array_intersect([
  'usuario' => $this->usuario, 
  'nomesobrenome' => $this->nomesobrenome, 
  'email' => $this->email], 
  $resultado
);

if ($dadosJaExistem) {
   $mensagem = 'O(s) valor(es): ' . implode(',', $dadosJaExistem)  . ' ja existem no banco de dados, por favor escolha outro(s)';
   throw new Exception($mensagem);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 2017-5-17 at 18:16, EdCesar disse:
Em 2017-5-17 at 17:29, gabrieldarezzo disse:

o @EdCesar esqueceu de lançar a exceção...


@gabrieldarezzo,  bem observado, atualizei e retirei o try cath.
Nesse caso caso dele, acho que dar apenas o return com a mensagem de falha ou sucesso, deixa o código mais simples

Tem outras coisas também que é importante tratar, também como:


$nome = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';

ou no PHP 7:


$usuario = $_POST['usuario'] ?? '';

Foge do tópico, mas fica a dica :)

 

Gostei.  Eu vou estudar isso também.  Bom domingo a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive alguns problemas pessoais e não conseguir acessar o fórum.

 

Campos em brancos:

uQkghDO.png

Usando o seguinte código dá esse erro.

$propriedades = [
	'usuario' => $this->usuario, 
	'nomesobrenome' => $this->nomesobrenome, 
	'email' => $this->email, 
	'senha' => $this->senha
];
			
if(!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
	throw new \Exception('E-mail invalido!');
}
			
foreach($propriedades as $propriedade => $valor) {
	if(empty($this->$propriedade)) {
		throw new \Exception('o campo '. $propriedade . ' não foi preenchido!');
	}
}

Mas se eu trocar o trecho "throw new \Exception" por "return" o código funciona. Mas se eu preencher todos os campos, e deixar a senha em branco ele insere um cadastro no banco de dados com a senha em branco. Não dá erro nenhum.

 

 

Já a baste para identificar quais os campos existem já cadastros no banco de dados sempre da um erro que o e-mail está invalido. Já tentei substituir o "throw new Exception" pelo "return" e colocar uma barra invertida no Exception mas nada.

 

Já pesquisei em diversões fóruns, vídeos mas nada não tô conseguindo consertar o código. Poderia me explicar como eu posso conserta-lo?

 

 

Desde já obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta certo, isso é um erro esperado, que só vai ocorrer quando você enviar um e-mail invalido, provavelmente você testou com um e-mail que não contem um formato valido, certo? Para parar de exibir essa tela laranja, e exibir apenas a mensagem, você precisa colocar um try/catch no  $usuarios->insert()

Pare um pouco para entender melhor como funciona os tratamentos de erros, validações, calculo de interseção entre outras coisas que foram colocadas aqui,  perca umas duas horinhas e ganhe dezenas! Tentar "aprender na força" não é um bom caminho, já fiz muito isso, não faço mais :)

Feito isso, estamos aqui para auxiliar. Não deixa de ver:

http://php.net/manual/pt_BR/function.array-intersect.php
http://php.net/manual/en/filter.filters.validate.php
http://php.net/manual/pt_BR/language.exceptions.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe a demora, estava sem internet.

@EdCesar eu li todos os links e mais alguns por fora e, cheguei a conclusão que o código está correto (eu acho).

 

uQkghDO.png

Esse erro está falando que o e-mail é invalido, está certo. Mas esse código ele ta em

classes/

 

E tenho o index que deveria aparecer esse erro como um diálogo (pop-up), informando que algum desses dados são inválidos ou já existem no banco de dados.

 

Eu preciso ignorar esse erro, para ele não redirecionar para essa tela e colocar em uma div, como um diálogo. Preciso puxar o erro para o index. Como eu posso fazer isso? Já pesquisei, tentei usar um try/catch e puxar a variável $erro para o index, assim mostrando o erro diagnosticado no arquivo Usuários.php da pasta classes/, mas não conseguir, poderia me dá uma força? Desde já muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por douglas79
      Bom dia,

      Há alguns dias que venho instalar o apache, o php, mysql e o phpmyadmin manualmente e sem obter sucesso. Até consegui rodar o php, porém, quando vou baixar a úitima versão do MYSQL, não tem todos os pacotes nele instalados, inclusive no completo, só encontro o Router.
      Alguém pode me dizer o porquê que isso está ocorrendo?
      Desde já agradeço a ajuda de vocês, que será bem vinda!
      No aguardo!

      Uso a versão 8.3.9 do PHP
      Meu SO é o Windows 10 32 bits
    • Por landerbadi
      Tenho uma tabela chamada "item" com os seguintes campos: id, name, active. Nela tem cadastrado vários itens. No campo "active" 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 active. E outra tabela chamada "product" com os seguintes campos (id, name) com os seguintes registros: 1, Produto A 2, Produto B 3, Produto C E uma terceira tabela chamada "product_item" com os seguintes campos (productID, itemID). No campo productID eu coloco o id de um produto da tabela "product" e no campo "itemID" eu coloco o id do produto da tabela "item". Exemplo: 1, 1 1, 3 1, 4 2, 3 2, 4 Sendo assim o produto A da tabela 'product" comtem os itens casa, cama e moto. Eu preciso fazer uma busca da seguinte maneira:  Eu escolho um registro da tabela "item", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "product" que contenham a palavra "casa" e que os demais itens estejam ativos no siste. Ou seja, que contenham um "S" no campo "active"  Eu consegui fazer isso da seguinte maneira: SELECT P.id, P.name, GROUP_CONCAT(I.name ORDER BY I.name) AS items FROM product P JOIN product_item PI ON P.id = PI.productID JOIN item I ON I.id = PI.itemID AND I.active = 'S' WHERE P.id NOT IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.active IS NULL ) AND P.id IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name = 'mesa' ) GROUP BY P.id, P.name; O problema que eu estou tendo é o seguinte:
      Quando eu jogo este código para o banco de dados onde eu já tenho os registros cadastrado o php fica lendo uma eternidade e não lista os produtos.
       
      Usando código no banco de dados que eu fiz para testes ele funciona perfeitamente pois nele tem poucos registros.
       
      No banco de dados principal a tabela "item" tem 11.196 registros. A tabela "product" tem 88.214 registros e a tabela "product_item" tem 518.378 registros. 
       
      Eu acredito que, devido o banco de dados ser muito grande, ele não consegue listar.
       
      Alguém sabe de algum meio de resolver isso?
       
       
    • 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 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.