Ir ao conteúdo

PHP Erro PHP: mysqli_num_rows() expects parameter 1 to be mysqli_result boolean


Ir à solução Resolvido por DiF,

Posts recomendados

Postado

Eu estou tentando fazer com que a pagina ao confirmar que o registro foi realizado ela redirecione a outra pagina, mas esse erro do titulo acontece na linha 37, eis o codigo:

 

<?php
	    if(isset($_POST['nome']) && isset($_POST['senha'])  && isset($_POST['avatar'])){
		$nome= $_POST['nome'];
	   $senha= $_POST['senha'];
	   $avatar= $_POST['avatar'];
	   
	  
	    }
	   	if(isset($_FILES['fileUpload']))
			{
			date_default_timezone_set("Brazil/East"); //Definindo timezone padrão

			$ext = strtolower(substr($_FILES['fileUpload']['name'],-4)); //Pegando extensão do arquivo
			$new_name = date("Y.m.d-H.i.s") . $ext; //Definindo um novo nome para o arquivo
			$dir = 'uploads/'; //Diretório para uploads

			move_uploaded_file($_FILES['fileUpload']['tmp_name'], $dir.$new_name); //Fazer upload do arquivo
			echo $_FILES['fileUpload']['tmp_name'];
			echo '<img src= '.$dir.$new_name.'>';

			//

			//
			}
			
				$mysqli = new mysqli("localhost", "id7209847_root", "usbw123", "id7209847_db_login");

		if(mysqli_connect_errno()){
			printf("Connect failed: %s\n", mysqli_connect_error());
			exit();
		}
		if(isset($_POST['nome']) && isset($_POST['senha'])  && isset($_POST['avatar'])){
       $inserir = "insert into tb_usuario values (null,'".$nome."','".$senha."','".$avatar."')";
		if(!$mysqli->query($inserir)) {
			printf("Errormessage: %s\n", $mysqli->error);
		}
		$query1 = mysqli_num_rows(mysqli_query($mysqli, "SELECT * FROM TB_USUARIO WHERE NM_USUARIO = '$nome' AND NR_SENHA = '$senha' AND DS_AVATAR = '$avatar'"));
        if($query1 == 1){
            header("Location: Chatflix_chat.php");
        }else{
            echo "<script>alert('Por favor preencha todos os campos... (Usuario, senha e Avatar)'); history.back();</script>";
		}
		
		 
        }

		$mysqli->close();

?>

 

Eis a linha 37:

	$query1 = mysqli_num_rows(mysqli_query($mysqli, "SELECT * FROM TB_USUARIO WHERE NM_USUARIO = '$nome' AND NR_SENHA = '$senha' AND DS_AVATAR = '$avatar'"));

Eu procurei sobre o erro, mas pelo que parece ele pode ter diversas causa, alguem poderia me ajudar?

  • Moderador
Postado

@Oliveira Cristian Olá, 

Você está misturando coisas de orientada a objetos com procedural.

 

No caso o seu mysqli_num_rows() e o mysqli_query() da linha 37 estão em forma procedural enquanto a conexão está em forma orientada a objeto

 

Use assim:

$result = $mysqli->query($inserir);

$row_count = $result->num_rows;

Aí você compara se o $_row_count for igual a 1....

Postado
5 minutos atrás, DiF disse:

@Oliveira Cristian Olá, 

Você está misturando coisas de orientada a objetos com procedural.

 

No caso o seu mysqli_num_rows() e o mysqli_query() da linha 37 estão em forma procedural enquanto a conexão está em forma orientada a objeto

 

Use assim:

$result = $mysqli->query($inserir);

$row_count = $result->num_rows;

Aí você compara se o $_row_count for igual a 1....

 

 

Eu não entendi como aplicar, eu troco o $query1 pelo $result = [...] ?

e depois eu checo o row_count, if($row_count == 1) ?

  • Moderador
  • Solução
Postado

@Oliveira Cristian Primeiro, o que vejo ali é que há muitas coisas desnecessárias. Muitos ifs.

 

Eu não entendi a sua lógica em fazer um insert e depois um select  com vários ifs ali dentro.

Não achas que é melhor você fazer os testes de campo vazio primeiro e depois testar se o cadastro foi bem sucedido?

Assim você reduz o monte de IF e realmente testa se houve um registro.

 

Por exemplo, eu faria desta forma:

$mysqli = new mysqli("localhost", "id7209847_root", "usbw123", "id7209847_db_login");

if(empty($nome) OR empty($senha) OR empty($avatar)):
    echo "<script>
             alert('Por favor preencha todos os campos... (Usuario, senha e Avatar)'); 
             history.back(-1);
          </script>";
    exit;
endif;


$testaRegistros = $mysqli->query("SELECT * FROM TB_USUARIO 
                                  WHERE NM_USUARIO LIKE '$nome' AND 
                                          R_SENHA LIKE '$senha' AND 
                                          DS_AVATAR LIKE '$avatar'");

$num = $testaRegistros->num_rows;

if($num  == 0):
    $inserir = $mysqli->query("INSERT INTO tb_usuario 
                               VALUES (null,'$nome',
                                            '$senha',
                                           '$avatar')");
    
    if($inserir):
          header("Location: Chatflix_chat.php"); 
    else:
        //aqui podes colocar um header para uma página de erro
    endif;    
   
else:
    //aqui indica que já existe um registro com os nome, senha e avatar.

    //podes colocar uma mensagem de erro.    

endif;

Basicamente Você recebe os dados do formulário e testa se os campos estão vazios. Se sim, força voltar para a tela anterior com o history.go(-1)

 

Depois você precisa fazer um select trazendo os dados basedos no que o usuário digitou.

 Se não achar nenhum registro, faz o insert. Ali dentro você testa se foi executado. Se sim redireciona com o header senão apresenta mensagem de erro.

 

Se quando, for feito o teste e achou um registro com base no que o usuário digitou, signifique que já tem um usuário registrado, então apresenta mensagem de erro.  Este é o bloco de else do IF que testa o num rows.

 

Creio que seria isso que você queria fazer. 

  • 2 semanas depois...
Postado

Desculpa, eu esqueci de agradecer, o seu código me salvou no dia! E eu fiquei muito satisfeito com o resultado, se quiser dar uma olhada: chatflix.000webhostapp.com

 

(Obs: não é um projeto profissional mas me garantiu uma nota boa na escola, muito obrigado!)

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!