Ir para conteúdo

POWERED BY:

Arquivado

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

deh_silva

While (count > 0) em PDO

Recommended Posts

Como ficaria esse código quando se está trabalhando com PDO?

$identificacao = gerar_numero_random(10);

while (mysql_num_rows(mysql_query("SELECT COUNT(*) FROM pessoa WHERE identificacao = '" . $identificacao . "'")) > 0) :

	$identificacao = gerar_numero_random(10);

endwhile;

$query = mysql_query("INSERT INTO pessoa (identificacao, nome) VALUES ('" . $identificacao . "', '" . $nome . "')");

A idéia é que a variavel identificação tenha um valor que não exista no banco de dados ainda. Se existir, deve ser gerado um novo valor antes da inserção.

Agradeço se puderem me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$identificacao = gerar_numero_random(10);

while (mysql_num_rows(mysql_query("SELECT COUNT(*) FROM pessoa WHERE identificacao = '" . $identificacao . "'")) > 0) :

    /**
     * Após você ter todo esse trabalho para verificar se a identificação não existe no banco,
     * você gera outra identificação?
     * Nesta forma que você esta fazendo, o correto seria já dar o insert aqui,
     * e não fazer $identificacao = gerar_numero_random(10) novamente
     */
    $identificacao = gerar_numero_random(10);

endwhile;

$query = mysql_query("INSERT INTO pessoa (identificacao, nome) VALUES ('" . $identificacao . "', '" . $nome . "')");

Pergunta:

Você não pode simplesmente deixar a coluna identificação como auto incremento no banco?

http://php.net/manual/pt_BR/pdo.connections.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais ou menos isso...

<?php
	$identificacao = gerar_numero_random(10);

	$show = $pdo->prepare(" SELECT COUNT(*) FROM pessoa WHERE identificacao = :identificacao ");
	$show->execute(array(
		':identificacao' => $identificacao
	));

	$row_Count = $show->rowCount();

	while ($row_Count > 0) {
		$identificacao = gerar_numero_random(10);
	}else{
		// Faz algo se for menor que 0
	}

	$show2 = $pdo->prepare(" INSERT INTO pessoa (identificacao, nome) VALUES (:identificacao, :nome) ");
	$show2->execute(array(
		':identificacao' => $identificacao,
		':nome' => $nome
	));
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei fazer desse jeito, mas ainda não certo.

$identificacao = gerar_numero_random(10);

$sql = $con->query("SELECT identificacao FROM pessoa WHERE identificacao = '" . $identificacao . "'");

do {

	$identificacao = gerar_numero_random(10);

} while (count($sql->fetchAll(PDO::FETCH_ASSOC)) > 0);

$query = $con->query("INSERT INTO pessoa (identificacao, nome) VALUES ('" . $identificacao . "', '" . $nome . "')");

Sugestões?

Compartilhar este post


Link para o post
Compartilhar em outros sites

fetchAll apenas retorna os registros já executados. Para o caso de PDO, são necessárias ao menos de duas a três linhas:

- bindValue()/bindParam() (pode ser enviado diretamente o execute);
- execute();
- fetch()/fetchAll().

No seu caso, uma função recursiva faria mais sentido:

function myRand($length = 10)
{
     /**
      lógica para gerar o número
      utilize a mesma que já possui
     **/
     

     $statement = $pdo->prepare("SELECT identificacao FROM pessoa WHERE identificacao = :identificacao");
     $statement->bindParam(':identificacao' , $identificacao);
     $statement->execute();

     return $statement->rowCount() > 0 ? myRand($length) : $identificacao;
}

No seu caso, pode montar a lógica diretamente na função gerar_numero_random.

PS.: esse código está longe de ser/estar otimizado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

deh_silva, não tinha entendido muito bem o seu codigo, pode testar esse aqui que vai fazer o que você quer:

 $dbh = new PDO('mysql:host=127.0.0.1;dbname=SeuBanco', 'SeuUsuario', 'SuaSenha');
   
 $identificacao = gerar_numero_random(10);

 while ( $dbh->query("SELECT identificacao FROM pessoa WHERE identificacao = $identificacao ")->rowCount() > 0) {
     $identificacao = gerar_numero_random(10);
 }

 $insert = "INSERT INTO pessoa (identificacao, nome) values (:identificacao, :nome)";
 $stmt = $dbh->prepare($insert);
 $stmt->bindParam(':identificacao', $identificacao);
 $stmt->bindParam(':nome', $nome);
 $stmt->execute();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para Randon, utiliza algo assim então haha:

 bin2hex(openssl_random_pseudo_bytes(16)); //generate a random token

é interessante tmb adicionar o indice 'UNIQUE' na sua tabela, assim garante performasse nas consulta utilizando esta chave primaria

E fazer um select antes do Insert garantindo que não está ferindo o índice de unicidade (unique)

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.