Jump to content
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á.

Share this post


Link to post
Share on other 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?

 

  • +1 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

 

  • +1 1

Share this post


Link to post
Share on other 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.

  • +1 1

Share this post


Link to post
Share on other 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"

Edited by EdCesar
Refatoração: Retirado try catch
  • +1 1

Share this post


Link to post
Share on other 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

 

 

 

 

  • +1 1

Share this post


Link to post
Share on other 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 :)

  • +1 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 **/

 

  • +1 1

Share this post


Link to post
Share on other 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

  • +1 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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);
}

 

  • +1 2

Share this post


Link to post
Share on other 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.

  • +1 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

  • +1 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Diego-SLP
      Bom dia,
       
      Estou fazendo uma tela de relatorios de registro de ponto e não estou conseguindo totalizar as horas conforme trago do banco de dados, se alguem puder me ajudar.
       
      SELECT p.cod_obra,f.nome,o.obra, TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(p.totalhora))),'%H:%i') AS hora, TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(p.totalhoraextra))),'%H:%i') AS horaextra, f.funcao FROM rh_pontoFuncionario p, rh_funcionario f, rh_obra o WHERE p.data BETWEEN '2020/10/01' AND '2020/11/20' AND p.cod_obra = '20056' AND p.cod_func = f.cod AND p.cod_obra = o.cod GROUP BY p.cod_obra, f.nome Essa query me traz COD_OBRA,NOME,OBRA,HORA,HORAEXTRA,FUNCAO e eu gostaria de TOTALIZAR o campo HORA e HORAEXTRA somando todas as linhas mas não consigo
    • By landerbadi
      Olá pessoal, boa noite
       
      Tenho uma tabela no banco de dados mysql com três colunas (id, audio, tocado) e um player de audio html5 simples.
       
      <audio controls>
        <source src="horse.ogg" type="audio/ogg">
        <source src="horse.mp3" type="audio/mpeg">
      </audio>
       
      Fiz uma consulta no bd para me retornar um (1) registro. Com base nessa consulta o player toca o audio correspondente.
      Preciso fazer com que após o término do audio seja gravado na coluna 'tocado' no bd a palavra 'OK'.
      Tem como fazer isso?
    • By Matheus B. Siqueira
      Olá, tento fazer uma requisição para atualização de item do accordion no mysql, porém apenas um item é atualizado.
      O código funciona da seguinte forma: É buscado perguntas referente ao vídeo selecionado no carousel, logo após, o código da Amostra de Código 1, cria os cards dentro do modal. Cada card é referente a uma pergunta diferente registrada no Banco de Dados.
      Porém, ao tentar atualizar um item do MYSQL, dentro do card, no textarea, o primeiro item (1º pergunta) desse accordion é atualizado, o segundo item (2º pergunta) não é atualizado.
      Cada pergunta possui um id no MYSQL, bem como, um assunto, uma resposta, uma pergunta... de acordo com a Figura 01.
      Vale ressaltar que, de acordo com a Amostra de Código 2, é buscado juntamente com o AJAX, todas as perguntas referente ao vídeo selecionado no carousel.
      Amostra de Código 1:
      $(document).ready(function() { $(function() { $('#responder_duvidas').click(function() { var codigoVideo2 = $('.carousel-item.active').attr('data-link_video'); var accordion2 = ""; $.post("buscar_duvida_monitor_resp.php", { codigo_video_monitor: codigoVideo2, }, function(data2, status) { if (data2 !== "Fail") { $("#dynamic_accordion #accordion").html(accordion2); // Adiciona essa linha $.each(JSON.parse(data2), function (index2, duvida3) { accordion2 += '<div class="card" style="margin: 5px">'; accordion2 += '<div class="card-header" id="heading'+index2+'">'; accordion2 += '<h5 class="mb-0">'; accordion2 += '<button class="btn btn-link" data-toggle="collapse" data-target="#collapse'+index2+'" aria-expanded="true" aria-controls="collapse'+index2+'">'; accordion2 += duvida3.assunto; accordion2 += '</button>'; accordion2 += '</h5>'; accordion2 += '</div>'; accordion2 += '<div id="collapse'+index2+'" class="collapse" aria-labelledby="heading'+index2+'" data-parent="#accordion">'; accordion2 += '<div class="card-body">'; accordion2 += '<div style="background: #ddd; color #fff; padding: 10px 20px; border-radius: 5px">'; accordion2 += duvida3.pergunta; accordion2 += '</div>'; accordion2 += '<hr>'; accordion2 += '<div style="background: #fff; color #fff; padding: 10px 20px; border-radius: 5px">'; accordion2 += '<form method="post" enctype="multipart/form-data">'; accordion2 += '<textarea class="form-control" name="resposta" id="resposta" required>'+duvida3.resposta+'</textarea>'; accordion2 += '<input type="hidden" id="id_duvidas" value="'+duvida3.idduvidas+'" />'; accordion2 += '<br><button type="button" id="enviar_resposta" class="btn btn-success btn-sm">Enviar resposta</button>'; accordion2 += '</form>'; accordion2 += '</div>'; accordion2 += '</div>'; accordion2 += '</div>'; accordion2 += '</div>'; $("#dynamic_accordion #accordion").html(accordion2); }); } }); }); $(document).on("click", "#enviar_resposta",function(){ $.ajax({ url: "atualizar_resposta.php", method: "POST", data: { resposta: $('#resposta').val(), idduvidas: $('#id_duvidas').val() }, success: function(res) { var data = JSON.parse(res); alert((data.success == true) ? "Pergunta atualizada" : "Pergunta não atualizada"); $('.modal-backdrop').remove(); return; } }); // fecha modal $("#modalDuvidas").modal("hide"); }); }); }); Figura 1:

       
       
      Amostra de Código 2:
      <?php if (isset($_POST['idduvidas']) && isset($_POST['resposta'])) { $id_resposta = $_POST['idduvidas']; $resposta = $_POST['resposta']; $servidor = 'localhost'; $usuario = 'root'; $senha = 'root'; $banco = 'onteach'; $conexao = mysqli_connect($servidor,$usuario,$senha,$banco); $consulta2 = "UPDATE duvidas SET duvidas.resposta = '$resposta' WHERE duvidas.idduvidas = '$id_resposta'"; die(json_encode(['success'=>(mysqli_query($conexao, $consulta2))])); } Figura 2 (FIGURA COMPLEMENTAR APRESENTANDO O ACCORDION NO WEBSITE)

       
      Por fim, este tópico auxilia em um tema que é específico, porém, pode ser utilizado para outros fins de programação, bem como, a utilização de definição de váriantes em accordion com maiores itens.
      Desde já, agradeço.
       
    • By gersonab
      tenho uma data no BD , gostaria de mostrar ela 15 dias antes, montando um alerta 15 dias antes desta data
      atualmente utilizo assim, porém me mostra 15 dias após.
      $data = DateTime::createFromFormat('d/m/Y', $datab); $data->add(new DateInterval('P15D')); tipo:
      se eu colocar a data 24/11/2020 , ela vai me mostrar 09/12/2020 , quando preciso q mostre 09/11/2020.
    • By david2007
      Endpointer Framework é um Framework PHP para construção de APIs REST com Programação Procedural.
       
      Todas as regras de negócio são implementadas como Stored Procedures.
       
      http://endpointer.com
       
      Endpointer Framework é Código Aberto sob a licença MIT

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.