Ir para conteúdo

POWERED BY:

Arquivado

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

Rodrigo5468

Limitar Crud

Recommended Posts

O while() só será útil se houver mais de um resultado. Então nem precisa dele (pode usá-lo, mas é desnecessário).

Chame apenas fetch/fetchAll uma única vez e pronto.

 

Veja:

http://www.ultimatephp.com.br/como-usar-pdo-com-banco-de-dados-mysql/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo acho que estou conseguindo...

 

Olha só, no checkApp eu irei fazer uma verificação assim então?

public function checkApp() {
	$sql = "SELECT * FROM $this->table WHERE user_id = :user_id AND ((SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id) >= 4 or (SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id AND status in (1,2)) => 1)";
}

Está certo? Se sim me da uma luz como posso terminar isso, o que esta faltando... ou ta pronto? É só ir no formulário e fazer:

if(!$usuario->checkApp() >= 4){
	return false;
}

Obrigado por tudo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa entender o que são funções e métodos. Eles executam ações e retornam valores, opcionalmente.

 

Você só pode verificar o valor retornado por uma função se ela retornar alguma coisa. No seu caso, checkApp() não retorna nada. Ela só cria uma string. Você precisa executar a consulta que está nessa string e retornar o(s) valor(es) desejado(s)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah... acho que entendi agora, então devo executar o checkApp certo?

É desse jeito então?

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'], PDO::PARAM_INT);
        $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 * FROM $this->table WHERE user_id = :user_id AND ((SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id) >= 4 or (SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id AND status in (1,2)) => 1)";
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':user_id', $this->user_id, PDO::PARAM_INT);
		return $stmt->execute();
	}

Se não for assim Beraldo pode me mandar algum material pra mim estudar?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que pensar no retorno que interessa ao seu código. Você fez o s métodos retornarem o retorno de execute(). execute() retorna true ou false. Pelo que entendi, o que te interessa é a quantidade calculada pelo COUNT. Ou seja, você precisa executar, fazer o fetch e retornar o valor do count, não true ou false.

 

Fazendo o método retornar a quantidade calculada no count, aí você pode fazer a comparação que fazia, verificando se é maior que 4

 

Veja como buscar resultados com PDO:

http://www.ultimatephp.com.br/como-usar-pdo-com-banco-de-dados-mysql/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo acho que agora está indo, porem deu erro...

sz0FbIF.png

public function checkApp() {
	$sql = "SELECT * FROM $this->table WHERE user_id = :user_id AND ((SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id) >= 4 or (SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id AND status in (1,2)) => 1)";
	$stmt = NewDB::prepare($sql);
	$stmt->bindParam(':user_id', $this->user_id, PDO::PARAM_INT);
	$result = $PDO->query( $sql );
	$rows = $result->fetchAll();
	return $stmt->execute();
}

E quando eu comento essas linhas, da este erro.

$result = $PDO->query( $sql );
$rows = $result->fetchAll();

Ld0nXyu.png

 

No index eu fiz assim, e dei um var_dump

if(!$usuario->checkApp()) {
	include 'formularios.php';
	var_dump($rows);
}

Estou no caminho certo né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o método query() só é usado quando não usamos prepare()

fetchAll() só pode ser usado depois de executar a query. E deve ser chamado no objeto retornado por prepare(). Veja o Exemplo #1: http://php.net/manual/pt_BR/pdostatement.fetchall.php

 

troque isto:

 

$result = $PDO->query( $sql );
$rows = $result->fetchAll();
return $stmt->execute();

 

por isto:

 

$stmt->execute();
$rows = $stmt->fetchAll();
 
var_dump( $rows );

 

A função está sem retorno, mas você verá os dados do SELECT. Depois basta retornar o dado de que você precisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa... muito obrigado Beraldo.

Então agora a função está retornando valores ou falta fazer algo ainda?

 

Se estiver basta agora eu fazer no formulário a verificação certo?

if(!$usuario->checkApp() >= 4){
     return false;
}else{
     include 'formulario.php';
}

É desse jeito agora né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo eu tinha dado o var_dump porem não mostrou resultados. Me ajuda por favor já estou ficando louco.

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'], PDO::PARAM_INT);
	$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 * FROM $this->table WHERE user_id = :user_id AND ((SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id) >= 4 or (SELECT COUNT(*) FROM $this->table WHERE user_id = :user_id AND status in (1,2)) => 1)";
	$stmt = NewDB::prepare($sql);
	$stmt->bindParam(':user_id', $this->user_id, PDO::PARAM_INT);
	$stmt->execute();
	$rows = $stmt->fetchAll();
	return $rows['user_id'];
}

Se eu colocar isso de baixo do return $rows será que da certo?

if($stmt->rowCount() > 4){
	return true;
}
return false;

Me ajuda por favor!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma... se não retornou nada no var_dump, sua consulta não trouxe resultados. Pegue a SQL e execute direto no banco de dados. Veja se algo é retornado. Se não retornar nada, é porque o a condição do WHERE não foi satisfeita.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo eu voltei o código anterior olha como está.

<?php
require_once 'Crud.php';

class Usuarios extends Crud {
	protected $table = 'apps';
    
    private $account;
	private $status;
	private $reason;
	private $seen;	
	private $question1;
	private $question2;
    private $question3;
    private $question4;
    private $question5;
	private $avaliator;
	
    
    public function setAccount($account) {
		$this->account = $account;
	}
	
	public function setStatus($status) {
		$this->status = $status;
	}
	
	public function setReason($reason) {
		$this->reason = $reason;
	}
	
	public function setSeen($seen) {
		$this->seen = $seen;
	}
    
	public function setQuestion1($question1) {
		$this->question1 = $question1;
	}
	
	public function setQuestion2($question2) {
		$this->question2 = $question2;
	}
    
    public function setQuestion3($question3) {
		$this->question3 = $question3;
	}
    
    public function setQuestion4($question4) {
		$this->question4 = $question4;
	}
    
    public function setQuestion5($question5) {
		$this->question5 = $question5;
	}
	
	public function setAvaliator($avaliator) {
		$this->avaliator = $avaliator;
	}
	
	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'], PDO::PARAM_INT);
        $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 * FROM $this->table WHERE account = :account AND status = 0"; //Pending			
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':account', $this->account);
		$stmt->execute();		

		if($stmt->rowCount() > 0){
			return true;
		}
		return false;
	}
	
	public function isAccepted(){
		$sql = "SELECT * FROM $this->table WHERE account = :account AND status = 2"; //Accepted			
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':account', $this->account);
		$stmt->execute();		

		if($stmt->rowCount() > 0){
			return true;
		}
		return false;
	}
	
	public function update($id) {
		$sql = "UPDATE $this->table SET reason = :reason, status = :status, avaliator = :avaliator WHERE id = :id";
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':reason', $this->reason);
		$stmt->bindParam(':status', $this->status);
		$stmt->bindParam(':avaliator', $this->avaliator);
		$stmt->bindParam(':id', $id);
		return $stmt->execute();
	}
}
?>

Me ajuda fazer uma contagem na tabela para se tiver 4 user_id ele bloqueia o usuário...

O resto está indo tudo okay.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

public function checkApp(){ 
  $sql = "SELECT COUNT(*) AS total FROM $this->table WHERE account = :account AND status = 0"; //Pending  
  $stmt = NewDB::prepare($sql);
  $stmt->bindParam(':account', $this->account);
  $stmt->execute(); 
  $row = $stmt->fetchAll();
  $total = $row['total']
 
  return $total;
}

 

vai retornar o total. aí é só comparar o retorno com 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, percebi que não iria conseguir chegar onde eu quero.

Eu tinha que ter um campo na tabela "apps" do tipo INT, agora eu criei ele, ele se chamava reprovado. O reprovado vai ter o valor nulo por padrão, eu tenho também o user_id que captura o ID da conta do usuário da tabela contas. Tem como me explicar como faço e me dar um exemplo de: Quando o usuário enviar o pedido de avaliação vai incrementar no campo reprovado. Ai vou poder capturar quantas vezes o usuário foi reprovado. E se for quatro ele será impedido de enviar mais solicitações.

 

- attempts irá armazenar quantas vezes o usuário foi reprovado.

 

A logica é isso certo? Más como eu posso fazer?

 

J38JfSQ.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo neste seu post http://forum.imasters.com.br/topic/540465-limitar-crud/?p=2160470 acho que está indo porem deu conflito. Agora se o usuário tiver uma avaliação com o status zero ele não impede o usuário de mandar mais avaliações. E como posso dar um var_dump no index do total para ver se está contando?

<?php
require_once 'Crud.php';

class Usuarios extends Crud {
	protected $table = 'apps';
    
    private $account;
	private $status;
	private $reason;
	private $seen;	
	private $question1;
	private $question2;
    private $question3;
    private $question4;
    private $question5;
	private $avaliator;
	
    
    public function setAccount($account) {
		$this->account = $account;
	}
	
	public function setStatus($status) {
		$this->status = $status;
	}
	
	public function setReason($reason) {
		$this->reason = $reason;
	}
	
	public function setSeen($seen) {
		$this->seen = $seen;
	}
    
	public function setQuestion1($question1) {
		$this->question1 = $question1;
	}
	
	public function setQuestion2($question2) {
		$this->question2 = $question2;
	}
    
    public function setQuestion3($question3) {
		$this->question3 = $question3;
	}
    
    public function setQuestion4($question4) {
		$this->question4 = $question4;
	}
    
    public function setQuestion5($question5) {
		$this->question5 = $question5;
	}
	
	public function setAvaliator($avaliator) {
		$this->avaliator = $avaliator;
	}
	
	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'], PDO::PARAM_INT);
        $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 status = 0";
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':user_id', $_SESSION['ID'], PDO::PARAM_INT);
		$stmt->execute();
		$row = $stmt->fetchAll();
		$total = $row['total'];
		
		return $total;
	}
	
	public function isAccepted() {
		$sql = "SELECT * FROM $this->table WHERE user_id = :user_id AND status = 2";
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':user_id', $_SESSION['ID'], PDO::PARAM_INT);
		$stmt->execute();

		if($stmt->rowCount() > 0){
			return true;
		}
		return false;
	}
	
	public function update($id) {
		$sql = "UPDATE $this->table SET reason = :reason, status = :status, avaliator = :avaliator WHERE id = :id";
		$stmt = NewDB::prepare($sql);
		$stmt->bindParam(':reason', $this->reason);
		$stmt->bindParam(':status', $this->status);
		$stmt->bindParam(':avaliator', $this->avaliator);
		$stmt->bindParam(':id', $id);
		return $stmt->execute();
	}
}
?>

Problema está no checkApp()

 

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como posso dar um var_dump no index do total para ver se está contando?

ué, igual antes:

 

var_dump( $total );

 

 

Se checkApp retorna inteiro, faça o if com o número que lhe interessa.

Este seu if vai entrar sempre que o retorno for diferente de zero:

 

if($this->checkApp()) {
   return false;
  }

 

Pelo que entendi, você só quer que entre se for maior ou igual a 4

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.