Ir para conteúdo

POWERED BY:

Arquivado

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

Rodrigo5468

Limitar Crud

Recommended Posts

Olá, pessoal me tire uma dúvida.

 

Tenho um crud, ele ler, atualiza, excluí e insere os dados na tabela questões. Porem para acessar este crud o usuário deve ter uma conta e está conectada na mesma. Quero limitar este crud da seguinte maneira.

Canta conta poderá enviar dados para questões no máximo quatro vezes.

Se o usuário for recusado nestas questões quatro vezes ele será impedido de enviar mais solicitações.

Se o usuário for aceito em uma dessas quatro questões ele será impedido de enviar mais solicitações.

Se o usuário tiver uma questão em estudo ele será será impedido de enviar mais solicitações até que ela seja aceita ou recusada.

 

Eu estava lendo na internet ele fala para verificar o usuário com boolean "true ou false" ou então usar char. Porem não faço a minima ideia, procurei mais por estes conteúdo mais não são explicativos, então eu não estou conseguindo fazer isso.

 

Se alguém poder me enviar um material ou falar o que devo fazer para conseguir chegar nesta meta eu fico muito agradecido.

 

 

E obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma tabela onde você vai armazenar as solicitações. Algo assim:

 

Tabela solicitacoes:

id -> id da solicitação (pk)

user_id -> id do usuário que fez a solicitação

aprovada -> booleano (ou char, dependendo do SGBD)

data_hora -> data/hora da solicitação

 

Ao enviar uma nova solicitação, verifique nessa tabela se há 4 negadas ou se há uma aprovada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, a tabela eu já tenho apenas alterei o avaliacao para char.

Beraldo, uma dúvida. Como faço para verificar quantas questões o usuário possuí e fazer isso com o char? E como eu pego e mando o user_id para a tabela da questões?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faço para verificar quantas questões o usuário possuí e fazer isso com o char?

Basta fazer um COUNT:

SELECT COUNT(*) AS total FROM tabela WHERE user_id = <id_do_usuario) AND aprovado = '0';

A consulta retornará o campo "total", com o número de solicitações negadas

 

E como eu pego e mando o user_id para a tabela da questões?

Você tem um sistema de login, certo? Logo, os dados do usuário estarão na session ou no cookie

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo ainda estou confuso com a questão de pegar o ID dele.

Tenho um banco de dados chamado "projeto" e duas tabelas. contas armazena os dados dele após o registro. E aplicacoes armazena os dados do segundo formulário.

 

Então eu tenho que pegar o ID do usuário dele da tabela contas e mandar para aplicacoes, certo?

Em Login.php eu criei a sessão id.

$_SESSION['id'] = $result_row->ID;

Más Beraldo e agora? Como mando esse ID para o user_id? E como também faço pra ver se é ele mesmo?

6GmVIx6.png

 

Me ajuda... por favor.

 

E obrigado por tudo Beraldo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O ID está na session, como você mostrou. Não precisa SELECT algum. Apenas use o valor de $_SESSION['id'].

Para inserir esse ID no campo user_id da outra tabela, basta usar um simples INSERT. O mesmo INSERT que vai registrar a solicitação também envia o ID. Por exemplo:

 

 

INSERT INTO solicitacoes(user_id, aprovada, data_hora) VALUES( id_da_session, '0', NOW());

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, pelo que eu entendi vou ter que colocar isso no crud. Na parte de inserir dados.

public function insert(){
	$sql = "INSERT INTO $this->table (account, seen, question1, question2, question3, question4, question5) VALUES (:account, :seen, :question1, :question2, :question3, :question4, :question5)";
	$stmt = NewDB::prepare($sql);
    $stmt->bindParam(':account', $this->account);
	$stmt->bindParam(':seen', $this->seen);
	$stmt->bindParam(':question1', $this->question1);
	$stmt->bindParam(':question2', $this->question2);
	$stmt->bindParam(':question3', $this->question3);
	$stmt->bindParam(':question4', $this->question4);
	$stmt->bindParam(':question5', $this->question5);
	return $stmt->execute();
}

Vou adicionar o user_id neste código mais em VALUES eu coloco o que? Eu não entendo muito bem... É assim? Irei mudar a sessão.

$_SESSION['user_id'] = $result_row->ID;

ai em VALUES eu coloco user_id ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo acho que fiz errado. Ou não, mais deu erro.

SSIq5IX.png

Login.php - Sessão.

if ($result_of_login_check->num_rows == 1) {
	
	$result_row = $result_of_login_check->fetch_object();
	if ( hash( 'whirlpool', $Password ) == $result_row->Password ){
	
		$_SESSION['Username'] = $result_row->Username;
		$_SESSION['email'] = $result_row->email;
		$_SESSION['admin'] = $result_row->PAdministrador;
		$_SESSION['id'] = $result_row->ID;
		$_SESSION['user_login_status'] = 1;
	
	} else {
	$this->errors[] = "Senha incorreta. Tente novamente.";
	}
}
class Usuarios extends Crud {
	protected $table = 'aplicacoes';
    
	private $user_id;
	
	public function setUser_id($user_id) {
		$this->user_id = $user_id;
	}
	
	public function insert() {
		$sql = "INSERT INTO $this->table (user_id, account, seen, question1, question2, question3, question4, question5) VALUES (:user_id, :account, :seen, :question1, :question2, :question3, :question4, :question5)";
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':user_id', $_SESSION['id']);
		$stmt->bindParam(':account', $this->account);
		$stmt->bindParam(':seen', $this->seen);
		$stmt->bindParam(':question1', $this->question1);
		$stmt->bindParam(':question2', $this->question2);
		$stmt->bindParam(':question3', $this->question3);
		$stmt->bindParam(':question4', $this->question4);
		$stmt->bindParam(':question5', $this->question5);
		return $stmt->execute();
	}
}

Deu erro nesta linha return $stmt->execute();

Eu preciso adicionar algo no formulário pra pegar o ID da sessão e mandar pro Crud também? tipo.

<input type="hidden" name="user_id" value="' . $_SESSION['id'] . '" readonly="true"/>

Preciso fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho o erro dizer apenas Fatal Error, sem explicar o motivo. Verifique se error_reporting está em E_ALL no seu php.ini. Ou apenas adicione error_reporting(E_ALL); no seu script. Isso deve dar mais detalhes sobre o erro

 

Tente trocar isto:

 

return $stmt->execute();

 

por isto:

 

$status = $stmt->execute();
var_dump( $status );
 
return $status;

assim vemos qual o valor retornado

 

 

e não precisa do campo hidden no form. $_SESSION é global e pode ser acessada de qualquer lugar onde a session esteja ativa (se session_start() foi chamada)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo é tudo maiúsculo mesmo.

Continua com o erro do meu post anterior, dei o var_dump() na sessão ID e deu null.

4Or6mQy.png

E aqui está uma print da tabela contas, com o ID maiúsculo.

qRDqsL6.pngNão sei se fiz certo, mais eu fiz assim no index.php.

<?php
	var_dump($_SESSION['ID']);
?>

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo conseguir mandar o ID do usuário da tabela contas para aplicacoes. Tem como você me explicar mais um pouco sobre SELECT COUNT(*) ?

user_id armazena o ID do usuário que está na tabela contas;

seen = char do tamanho um;

Como que eu faço essa contagem?

E no index eu estou dando um include.

<?php
	include 'formularios';
?>

Ai eu queria fazer uma verificação pra fazer como eu imagino.

 

Como faço essa contagem?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem segredo:

 

 

SELECT COUNT(*) AS total FROM aplicacoes WHERE user_id = <id_do_usuario> AND seen = '1';

Vai retornar um único campo: "total"

 

Veja mais aqui:

http://www.w3schools.com/sql/sql_func_count.asp

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo eu fiz assim, ver se esta certo por favor.

public function insert() {
	
	if($this->checkApp()) {
		return false;
	}
	
	$sql = "INSERT INTO $this->table (user_id, account, seen, question1, question2, question3, question4, question5) VALUES (:user_id, :account, :seen, :question1, :question2, :question3, :question4, :question5)";
	$stmt = NewDB::prepare($sql);
	$stmt->bindParam(':user_id', $_SESSION['ID']);
	$stmt->bindParam(':account', $this->account);
	$stmt->bindParam(':seen', $this->seen);
	$stmt->bindParam(':question1', $this->question1);
	$stmt->bindParam(':question2', $this->question2);
	$stmt->bindParam(':question3', $this->question3);
	$stmt->bindParam(':question4', $this->question4);
	$stmt->bindParam(':question5', $this->question5);
	return $stmt->execute();
}

public function checkApp() {
	$sql = "SELECT COUNT(*) AS total FROM $this->table WHERE user_id = :user_id AND seen = :seen;";
	$stmt = NewDB::prepare($sql);
	$stmt->bindParam(':user_id', $user_id);
	$stmt->execute();
}

No formulário eu adicionei um campo input e definir o valor do seen para um. Acredito que terei que fazer ele se definir automaticamente. Ou eu tiro? Pois ele tem que verificar, quando checar em quatro ele será impedido de enviar mais avaliações.

<input type="hidden" name="seen" value="1" readonly="true"/>

E também como eu faço pra verificar la no include? Tipo, verificar se o valor for <= 4 o formulário aparece. Se for >= 4 ele não aparece. Então eu faço assim?

if(!$usuario->checkApp >= 4){
	include 'formularios';
}

Também tenho um campo status, ele faz o seguinte:

Status == 0 → Em Estudo.

Status == 1 → Recusado.

Status == 2 → Aceito.

 

 

Estou no caminho certo? E agora o que eu faço?

Obrigado por tudo Beraldo, por está me ajudando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma dica sobre o bindParam: use o terceiro parâmetro, data_type. Veja: http://php.net/manual/pt_BR/pdostatement.bindparam.php

O valor padrão é string. No caso do user_id, que é inteiro, use PDO::PARAM_INT, assim:

 

$stmt->bindParam(':user_id', $_SESSION['ID'], PDO::PARAM_INT);

 

 

Seu método checkApp não retorna nada. Você precisa usar fetch() e retornar o valor do campo "total".

 

 

Não entendi o campo input hidden. Se for um valor que interessa somente à aplicação, prefira salvar na session. O usuário pode alterar o valor do campo hidden e modificar o funcionamento de sua aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo desculpe o incomodo mais eu não sei fazer isso, procurei na internet algo mais não tenho certeza se é isso ou não, e também não sei como prosseguir.

Eu devo adicionar este código dentro do {} ? Ficando assim...

public function insert() {
	while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));
}

Estou bastante confuso, tem como você me dar um exemplo do código? E tipo, como que eu vejo e verifico no código se ele tem quatro questões?

 

 

Obrigado por todo apoio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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