Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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. 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
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.
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());
}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 !!!???
Nesse caso ele não dar nenhum erro e insere normalmente com usuário repetido.
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.>
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?
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, use[PDO::query()](http://br1.php.net/manual/pt_BR/pdo.query.php) to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then use[PDOStatement::fetchColumn()](http://br1.php.net/manual/pt_BR/pdostatement.fetchcolumn.php) to retrieve the number of rows that will be returned. Your application can then perform the correct action."Será que não tem outra função no php? Só esta usando COUNT dentro do select !?
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.
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;
?>
http://forum.imasters.com.br/topic/418733-resolvidopdo-contar-resultados/?p=1650394