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 ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • 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 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?
       
       
×

Informação importante

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