Ir para conteúdo

Arquivado

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

Damon

função rowCount com PDO e SQL Server

Recommended Posts

Galera estou testando algumas verificações usando PDO, estou utilizando a função rowCount para

verificar e o usuário já existe, se ele existir realiza o insert, mas não sei por que o verificação

não esta sendo feita e esta inserindo o usuário existente no banco.

$nome= $_GET["nome"];

	//prepara o cadastro 
	$buscasegura= $pdo->prepare("insert into usuario (nome) values (:nome)");
	$buscasegura->bindValue(":nome",$nome);
	//valida o cadastro 
	$consulta = $pdo->prepare("SELECT nome FROM usuario where nome = :nome;");
	$consulta->bindValue(":nome", $nome);
	$consulta->execute();
	
	if($consulta->rowCount() == 0):
	$buscasegura->execute();
	

	
	else:
	echo "Já  existe este nome!";
		
	endif;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Williams, verifiquei o link que vc me passou e vi que a forma deles tratar o problema foi um pouco diferente, a a minha duvida mesmo é na questão da função rowCount por que ela não esta funcionando se tem alguma coisa

a ver com pdo do mssql ou se eu estou usando de forma errada mesmo, e mais uma curiosidade mesmo.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema deve ser por você estar preparando as 2 query antes de usar o execute;

Quando você faz:

$consulta->execute(); 

Você já tem 2 query preparadas, então ele deve estar executando as 2 e assim o rowCount fica maior que 0, pois cadastro o usuário.

 

Tente colocar a parte que prepara o cadastro dentro do if que onde você verifica se o rowCount é maior 0.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lance o erro na Exception

 

Mas pode ser neste ponto e virgula ( ; ) na query

SELECT nome FROM usuario where nome = :nome;

<?php
try {
    
    if (empty($_GET["nome"])) {
        throw new Exception("Informe o nome.", 1);
    }
    
    $nome = $_GET["nome"];
    
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    //prepara o cadastro
    $buscasegura = $pdo->prepare("insert into usuario (nome) values (:nome)");
    $buscasegura->bindValue(":nome", $nome);
    //valida o cadastro
    $consulta = $pdo->prepare("SELECT nome FROM usuario where nome = :nome;");
    $consulta->bindValue(":nome", $nome);
    $consulta->execute();
    
    if ($consulta->rowCount() <= 0):
        $buscasegura->execute();
    else:
        echo "Já  existe este nome!";
    endif;
    
}
catch (Exception $e) {
    
    die('Error: ' . $e->getMessage());
    
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então pessoal eu executei a função sozinha sem if eu tenho 4 registro no meu bd e ela esta me retornando 0.

include("conexaopdo.php");
 $pdo=conectar();
 
 
 $buscarusuario=$pdo->prepare("select * from usuario");
 $buscarusuario->execute();
 
 echo $buscarusuario->rowCount(); 

Estranho não !!!???





Williams Duarte

 

Nesse caso ele não dar nenhum erro e insere normalmente com usuário repetido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://br1.php.net/manual/pt_BR/pdostatement.rowcount.php

 

Veja no manual ele diz:

 

"PDOStatement::rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object."

 

Sendo que ele diz também que na maioria do bancos de dados o rowCount não retorna o número de linhas afetadas pelo SELECT.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Sendo que ele diz também que na maioria do bancos de dados o rowCount não retorna o número de linhas afetadas pelo SELECT.

 

Não encontrei esta parte no manual não, mas estou me convencendo que ela realmente não funciona no SQL SERVER, a questão é, qual seria a outra função para substitui-la normalmente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está na parte dos exemplos, exemplo 2, ele é uma sugestão para substituir o rowCount.

 

"Exemplo #2 Counting rows returned by a SELECT statement

For most databases, PDOStatement::rowCount() does not return the number of rows affected by a SELECT statement. Instead, usePDO::query() to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then usePDOStatement::fetchColumn() to retrieve the number of rows that will be returned. Your application can then perform the correct action."

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

William F. Rodrigues

 

Acho que a melhor opção seria esta mesmo, ai pessoal fica a dica o rowCount não conta quantidade de linha no SQL SERVER, se alguém conseguir fazer com que esta função funcione poste o código pra gente ver. OK

Resolvido desta maneira este caso!

<?php
	include("conexaopdo.php");
	$pdo= conectar();
		
	$nome= $_GET["nome"];
	$email= $_GET["email"];

	//prepara o cadastro 
	$buscasegura= $pdo->prepare("insert into usuario (nome,email) values (:nome,:email)");
	$buscasegura->bindValue(":nome",$nome);
	$buscasegura->bindValue(":email",$email);
	//valida o cadastro 
	$consulta = $pdo->prepare("SELECT * FROM usuario where nome =:nome");
	$consulta->bindValue(":nome",$nome);
	$consulta->execute();
	$lina = $consulta->fetchAll(PDO::FETCH_ASSOC);
	
	
	if($lina == null):
		//Executa o cadastro 
	$buscasegura->execute();
	

	
	else:
	echo "Já existe este nome!";
		
	endif;




?>

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.