Damon 20 Denunciar post Postado Outubro 29, 2014 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
Williams Duarte 431 Denunciar post Postado Outubro 30, 2014 http://forum.imasters.com.br/topic/418733-resolvidopdo-contar-resultados/?p=1650394 Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 30, 2014 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
WilliamRodrigues 9 Denunciar post Postado Outubro 30, 2014 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
Williams Duarte 431 Denunciar post Postado Outubro 30, 2014 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
Damon 20 Denunciar post Postado Outubro 30, 2014 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
WilliamRodrigues 9 Denunciar post Postado Outubro 30, 2014 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
Damon 20 Denunciar post Postado Outubro 30, 2014 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
WilliamRodrigues 9 Denunciar post Postado Outubro 30, 2014 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
Damon 20 Denunciar post Postado Outubro 30, 2014 Será que não tem outra função no php? Só esta usando COUNT dentro do select !? Compartilhar este post Link para o post Compartilhar em outros sites
WilliamRodrigues 9 Denunciar post Postado Outubro 30, 2014 Você pode usar como no exemplo 2 do link que passei, que é um exemplo de como fazer ou usar o fetchAll http://php.net/manual/en/pdostatement.fetchall.php. Ele retorna um array vazio caso não tenha registro encontrados. Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 30, 2014 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. OKResolvido 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