Ir para conteúdo

Arquivado

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

icarof

Laço de repetição

Recommended Posts

Olá Amigos

tenho um sistema, e nele ao fazer o cadastro de cobranças, ele gera um código através de uma função, de depois  grava no banco.

só que, as vezes são geradas muitas cobranças ao mesmo tempo, tipo 40 a 50 por requisição, um laço cria todas e cada uma tem seu código especifico.

 

mas, como ja existe muitas e no banco o campo é marcado como único, as vezes aparecem erros, pois acontece de gerar um combinação que ja existe.

no momento, estou usando uma analise simples, gero o código, vejo se já existe, se existir e gera outro e grava, se não grava o que ja estava.

 

mas essa verificação so acontece uma, e se o outro código gerado na condição também já estiver no banco?

gostaria de saber se alguem sabe algum forma de usar um laço, para que se faça a veriricação até que gere um registro que não esteja no banco.

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pergunta e consideração:

 

Se são novos registros e diferentes registros porque está acontecendo conflito de códigos?

 

Se você tem a necessidade de criar códigos sequenciais, sugiro que você crie uma tabela somente para estes codigos e deixe o ID como autoincrement e assim você evita esse conflito e deixa a engine do SQL preocupar-se em fazer essa verificação, ou seja, para que tentar reinventar a roda se ela já está ali a sua disposição?!

 

Se não for essa situação, recomendo que você utilize hash do tipo md5 ou sha1 para estes códigos, mas é preciso atentar-se para que o código "hasheado" não tenha a mesma origem porque assim você vai seguir com o problema de conflito. Uma sugestão? No hash inclua a hora, minutos, segundos e milesimos na composição do hash e assim você dificilmente - quase que impossivel - terá conflito de códigos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qualquer FOR/WHILE resolve suponho.

for ($codigo_unico = false, $i = 0; !$codigo_unico && $i < 10; $i++) {
    $novo_codigo = funcao_criar_novo_codigo();
    $codigo_unico = funcao_que_verifica_codigo_unico_retorna_true_or_false($novo_codigo);                                             
}

Geralmento eu evito WHILEs para não ficar em loop eterno por algum acidente (por isso tem limite de 10 no for).

 

@Guilherme Luiz deu uma sugestão boa e criar códigos a partir da data, geralmente você consegue códigos quase únicos. Eu pessoalmente para criar um código único, faria algo assim:

<?php uniqid("ID da Chave Primária do Banco de Dados", true); ?>

IDs de chave primárias são únicos, e o uniqid é uma função que é um identificador único com a data em milésimos de segundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos esse código, tem que ser exclusivamente numérico, e um código de barras simples para carnês de pagamento, com 12 dígitos, uso a seguinte função para gerar os codigos:

function gerabarras(){
	$novo_valor= "";
	$valor = "0123456789";
	srand((double)microtime()*1000000);
	for ($i=0; $i<12; $i++){
	$novo_valor.= $valor[rand()%strlen($valor)];
	}
	$codbarras = "01".$novo_valor;
	return $codbarras;
}

dai quando vai gravar no banco, as vezes acontece de gerar um que ja esta salvo, e causa erro, preciso de um laço que verifique o código de barras, e veja se já existe, se já existe, tenta de novo, ate aparecer uma combinação que seja única

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não entendeu meu FOR quando escrevi, então vou tentar novamente.

for ($codigo_unico = false, $i = 0; !$codigo_unico && $i < 10; $i++) {
    $novo_codigo = gerabarras();
    $codigo_unico = verificar_codigo($novo_codigo);                                             
}

function verificar_codigo($cod) {
    // conecta ao banco e procura se existe este código
    // ...                                         

    if (!$existe_codigo) {
       return true;                                                       
    }

    return false;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 09/07/2017 at 01:54, Kosonome disse:

Acho que você não entendeu meu FOR quando escrevi, então vou tentar novamente.


for ($codigo_unico = false, $i = 0; !$codigo_unico && $i < 10; $i++) {
    $novo_codigo = gerabarras();
    $codigo_unico = verificar_codigo($novo_codigo);                                             
}

function verificar_codigo($cod) {
    // conecta ao banco e procura se existe este código
    // ...                                         

    if (!$existe_codigo) {
       return true;                                                       
    }

    return false;
}

eu entenid amigo seu for, mas a quantidade de codigos geradas é variavel,  nunca e mesma, pode ser 1, 2 ou 40

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
$code = '';
$numeros = str_split('012345678901234567890', 1);
for ($i = 0; $i < 4; ++$i) {
    $code .= $numeros[array_rand($numeros)];
}
$resultado = $code . time();

echo $resultado;

 

Duvido muito que consiga exibir o mesmo código numérico duas ou mais vezes com isso.

 

Só que o problema é que está tentando encontrar chifre em cabeça de cavalo....

 

Como o Guilherme disse, é mais vantajoso e correto usar, uma chave primária auto-increment e deixar o SQL fazer a gestão dos dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É simples, você inicia buscando o código no banco, e não fazendo a inserção.

 

Tipo assim, select cod_barra from tabela where cod_barra = '123456789102'

'

Após sua função que gera o cod_barras automáticamente, selecione no banco de dados algum codigo que foi gerado pela sua funcao, se não encontrar, cadastre, caso contrario chame a função novamente para gerar um novo código.

 

Não comece inserindo o código de barras gerado e sim consultando se o codigo gerado já existe.

 

@icarof

Outra coisa, trabalha com classes no PHP e crie uma classe para gerir e representar suas tabelas e consultas a banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, não é questão de criar cifre em cabeça de cavalo, entendam que o campo, de código de barras ja é único, assim como a id, não posso deixar que o banco gerencie, pois esse códigos são dinâmicos, esses dígitos, são adicionados a outros identificadores, tipo:  cod_instituição + cod_curso + identificador aluno + código da função, e todas essas combinações são dinâmicas.

 

Josimar, creio que sua ideia parecer ser a mais sensata, vou testar e ver se da certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Josimar, sua ideia deu certo em partes, pois ainda encontra conflito.

preciso criar um laço que fique gerando e buscando até encontrar um que passe.

to tentando com Do Whille, mas ainda sem sucesso.

 

alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, resolvi meu problema, usando o Do While, fiz no primeiro laço 2 verificações como josimar sugeriu, caso nas duas ele nao gere um unico, ele repete o laço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por First
      Olá a todos!
       
      Quando eu tento fazer o login me mostra esse erro "Could not log you in."; Alguém sabe me ajudar a resolver esse problema no meu código?
      <?php require_once("core/init.php"); if (Input::exists()) { if (Token::check(Input::get("token"))) { $validate = new Validate(); $validation = $validate->check($_POST, array( "username" => array("required" => true), "password" => array("required" => true) )); if ($validation->passed()) { $user = new User(); $remember = (Input::get("remember")) === "on" ? true : false; $login = $user->login(Input::get("username"), Input::get("password"), $remember); if ($login) { Session::flash("home", "Welcome back!"); Redirect::to("index.php"); } else { echo "Could not log you in."; } } else { foreach ($validation->errors() as $error) { echo $error."<BR>"; } } } } ?> <form action="" method="POST"> <div class="field"> <label for="username">Username</label> <input type="text" name="username" id="username"> </div> <div class="field"> <label for="password">Password</label> <input type="password" name="password" id="password"> </div> <div class="field"> <label for="remember"> <input type="checkbox" name="remember" id="remember"> Remember me </label> </div> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <input type="submit" value="Log in"> </form>  
       
      Desde já obrigado.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.