Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
eu tenho um código que checa se o pin gerado já consta no banco, caso positivo chama a função recursiva que gera o pin.
function aleatorio(){
$pin = "";
$valor = "0123456789";
srand((double)microtime()*1000000);
for ($i=0; $i<6; $i++){
$pin.= $valor[rand()%strlen($valor)];
}
include 'conexao.php';
$consulta = $mysqli->query("SELECT PIN from eventos WHERE PIN = $pin ");
$ocorrencia = $consulta->num_rows;
while($ocorrencia>0){
//echo 'errou';
aleatorio();
}
return $pin;
}
Quando realizo um cadastro ora o servidor responde rápido, ora aparece erro 500 erro internal server, será que este loop está sobrecarregando o sistema?
não entendi como aplicaria foreach neste caso?
Mais pro seu caso só deveria retornar 1, então não tem motivos para foreach ou while, mais vai o exemplo
$consulta = $mysqli->query("SELECT PIN from `eventos` WHERE PIN = '$pin' ");
$dados = $query->mysqli_fetch_array();
foreach($dados as $campo){
print $campo['coluna_a'] . '<br />';
}entendi, será que este loop que tá fazendo o servidor cair? então cara o meu while serve para chamar a função recursiva caso o pin já conste no banco.
Note que em cada vez que o while roda, o arquivo de conexão é incluido e a query é re-executada. Recomendo que você separe as coisas, eu faria de forma diferente, faria algo assim:
<?php
include 'conexao.php';
/*
* Função para gerar um novo código pin
* @return string
*/
function pin(){
// Gera o pin
// forma mais fácil de gerar o pin
// $pin = md5(uniqid(time()));
// desta forma o pin nunca seria o mesmo
// pois é baseado no timestamp atual
$pin = "";
$valor = "0123456789";
srand((double)microtime()*1000000);
for ($i=0; $i<6; $i++){
$pin.= $valor[rand()%strlen($valor)];
}
// se existir o codigo pin, para o script e gera um novo pin
if(existePin($pin)){
pin();
return false;
}
return $pin;
}
/*
* Função para verificar se o pin ja existe
* @return boolean
*/
function existePin($pin){
$consulta = $mysqli->query("SELECT PIN from eventos WHERE PIN = $pin ");
return ($consulta->num_rows != 0) ? true : false;
}
echo pin();Mateus quando coloco o include fora função existePin() da erro
Qual é o erro que dá? De ligação à BD?
Já agora, no exemplo do Mateus Silva, podes simplificar o retorno da função existePin() por:
return ($consulta->num_rows != 0);
A expressão de teste da condição já devolve um booleano, logo basta usar esse valor.
o erro é como se não houvesse conexao sendo que quando coloco dentro da função a conexao funciona
Mateus quando coloco o include fora função existePin() da erro
Sim sim, porque ela está em baixo, coloque ela em cima da função pin(), o php le o script de cima pra baixo, logo da forma que eu mandei lá ele vai tentar executar a existePin() antes de cria-la, pra ser sincero não sei pq coloquei ela em baixo :D :D
>
Qual é o erro que dá? De ligação à BD?
Já agora, no exemplo do Mateus Silva, podes simplificar o retorno da função existePin() por:
return ($consulta->num_rows != 0);
A expressão de teste da condição já devolve um booleano, logo basta usar esse valor.
Bem observado!
>
while($ocorrencia>0){eu tenho um código que checa se o pin gerado já consta no banco, caso positivo chama a função recursiva que gera o pin.
Quando realizo um cadastro ora o servidor responde rápido, ora aparece erro 500 erro internal server, será que este loop está sobrecarregando o sistema?
Tenta usar o foreach para listagem vindas do banco, por que o que você faz ai, qualquer valor que represente verdadeiro (qualquer coisa entre true e >=1) vai ficar fazendo o loop infinito e daí ocorrendo esse bendito erro.
Use também aspas simples nos valores exemplo " PIN = '$pin' "; e escapas no nome da tabela e colunas