Jump to content
PlayMa256

Arquivo a ser lido com characteres a mais

Recommended Posts

PlayMa256

Olá,

estou realizando a leitura de um arquivo .sql para obter algumas informações de dentro do arquivo, o qual possui esta estrutura internamente:

grupo,usuario

grupo,usuario

grupo,usuario

grupo,usuario

grupo,usuario

pois bem, estou a ler desta maneira, e inseri-los em selects.

<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<form action="" method="post" enctype="multipart-form/data">
<select name="usuario">
 <option value="" selected="selected">Selecione um usuario</option>
 <?php
  $arquivo = fopen("grupo.sql", "r+");
  while(!feof($arquivo)){
   $linha = fgets($arquivo, 4096);
   $explode = explode(",", $linha);
   $grupo = $explode[0];
   $usuario = $explode[1];
  
   echo '<option value="'.$usuario.'">'.$usuario.'<option/>';
  

  }
  fclose($arquivo);

 ?>
</select>
<select name="grupo">
 <option value="" selected="selected">Selecione um grupo</option>
 <?php
  $arquivo = fopen("grupo.sql", "r+");
  while(!feof($arquivo)){
   $linha = fgets($arquivo, 4096);
   $explode = explode(",", $linha);
   $grupo = $explode[0];
   $usuario = $explode[1];
   echo '<option value="'.$grupo.'">'.$grupo.'<option/>';

  }
  fclose($arquivo);
 ?>
</select>
<input type="submit" value="Procurar" />
</form>
</body>
</html>

porem quando vejo o html gerado, ele esta gerando options a mais, a quais estao brancas, nulas, sem valor e sem opção, posso estar fazendo algo de errado na leitura do arquivo?

Edited by brunoais
titulo melhorado.

Share this post


Link to post
Share on other sites
brunoais

Vê isto tb, sff.

http://www.php.net/manual/en/function.feof.php#70715

Acho importante teres em conta já que estás a fazer o que está naquele comentário.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
HappyHippyHippo

a aqui está a terceira (relevante ao post apresentado anteriormente) e mais fácil solução de leitura de uma ficheiro em PHP:

while ($line = fgets($arquivo)) { // ao chegar ao fim do ficheiro, a função fgets retorna FALSE, caso contrário retorna sempre uma string seja ela vazia ou não
 // ... do stuff with $line
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PlayMa256

Bom, realizei os passos mostrados, mas mesmo assim continua contendo espaços em cada leitura, mas isso é o de menos...

estou quebrando a linha lida, usando explode com a virgula, depois peço para fazer a pesquisa do usuario dependebndo do grupo, ele mostra todos os usuarios relacionados, porem ao contrario nada feito, aparece: "Undefined Offset 1"

eis o codigo:

<!DOCTYPE html>
<?php include "lerArquivo.php";
?>
<html>
<head>
   <title>Index</title>
</head>
<body>
<form action="" method="post" enctype="multipart-form/data">
   <select name="usuario">
       <option value="" selected="selected">Selecione um usuario</option>
       <?php
           $arquivo = fopen("grupo.sql", "r+");
           while(!feof($arquivo)){
               
               $linha = fgets($arquivo, 4096);
               if(!feof($arquivo)){
               $explode = explode(",", $linha);
               $grupo = $explode[0];
               $usuario = $explode[1];
                   echo '<option value="'.$usuario.'">'.$usuario.'<option/>';            
           }
           }
           fclose($arquivo);


       ?>
   </select>

<select name="grupo">
       <option value="" selected="selected">Selecione um grupo</option>
       <?php
           $arquivo = fopen("grupo.sql", "r+");
           while(!feof($arquivo)){
               $linha = fgets($arquivo, 4096);
               $explode = explode(",", $linha);
               $grupo = $explode[0];
               $usuario = $explode[1];
               echo '<option value="'.$grupo.'">'.$grupo.'<option/>';


           }
           fclose($arquivo);
       ?>
   </select>

<input type="submit" value="Procurar" />
<input type="hidden" name="acao" value="enviar" />
</form>
<?php
   if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
       $grupoReturn = $_POST['grupo'];
       $usuarioReturn = $_POST['usuario'];

       if(($usuarioReturn == NULL) && ($grupoReturn == NULL)) {
           echo 'selecione um usuario e um grupo';

       }else if(($usuarioReturn == NULL) && ($grupoReturn != NULL)){
           $arquivo = fopen("grupo.sql", "r+");
           while(!feof($arquivo)){
               $linha = fgets($arquivo, 4096);
               $explode = explode(",", $linha);
               $grupo = $explode[0];
               $usuario = $explode[1];
               
               if($grupoReturn == $grupo){
                   echo $usuario.'<br/>';
               }    
   
           }
           fclose($arquivo);
               
       }
       if(($usuarioReturn != NULL) && ($grupoReturn == NULL)){
           $fp = fopen("grupo.sql", "r+");
           $current_line = fgets($fp);
           while (!feof($fp)) {
                 $current_line = fgets($fp);
                 $explode2 = explode(",", $linha);
               
                   if($explode2[1] == $usuarioReturn){    //problema aqui
                           echo $explode[0];
                   }

           }
           fclose($fp);

       

       }




   }



?>



</body>
</html>

o problema é no $explode[1], podem no if superior esse explode[1] funciona....

Edited by brunoais
geshi

Share this post


Link to post
Share on other sites
brunoais

1º: Ignoraste completamente o que escrevi.

2º: Ignoraste completamente o que o HappyHippyHippo escreveu.

3º: Tens uma indentação um pouco má (e, por consequente, confusa).

4º: Vê com atenção a diferença entre os 2 para veres pq obtens resultados diferentes (mm q, pessoalmente, ambos estão mal feitos).


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
PlayMa256

Bom, realizei as alterações, mas mesmo assim a busca de usuario continua a nao funcionar, quando seleciono os grupos ele funciona perfeitamente, poderá ser um problema do modo em que estou obtendo a linha? já que ela esta como grupo,usuario, e sendo assim dou um explode na , ?

<!DOCTYPE html>
<?php include "lerArquivo.php";
?>
<html>
<head>
<title>Index</title>
</head>
<body>
<form action="" method="post" enctype="multipart-form/data">
<select name="usuario">
<option value="" selected="selected">Selecione um usuario</option>
<?php
$arquivo = fopen("grupo.sql", "r+");
while (!feof($arquivo)) {
  $linha = fgets($arquivo, 4096);
if(!feof($arquivo)){

$explode = explode(",", $linha);
$grupo = $explode[0];
$usuario = $explode[1];
echo '<option value="'.$usuario.'">'.$usuario.'<option/>';
}

}
fclose($arquivo);
?>
</select>
<select name="grupo">
<option value="" selected="selected">Selecione um grupo</option>
<?php
$arquivo = fopen("grupo.sql", "r+");
while (!feof($arquivo)) {
$linha = fgets($arquivo, 4096);
if(!feof($arquivo)){
$explode = explode(",", $linha);
$grupo = $explode[0];
$usuario = $explode[1];
echo '<option value="'.$grupo.'">'.$grupo.'</option>';

}
}
fclose($arquivo);
?>
</select>
<input type="submit" value="Procurar" />
<input type="hidden" name="acao" value="enviar" />
</form>
<?php
if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
$User = $_POST['usuario'];
$Group = $_POST['grupo'];



if(($User != NULL) && ($Group == NULL)){
$arquivo = fopen("grupo.sql", "r+");
while (!feof($arquivo)) {
$linha = fgets($arquivo, 4096);
if(!feof($arquivo)){
$explode = explode(",", $linha);
$grupo = $explode[0];
$usuario = $explode[1];

}
}
fclose($arquivo);
}elseif(($User == NULL) && ($Group != NULL)){
$arquivo = fopen("grupo.sql", "r+");
while (!feof($arquivo)) {
$linha = fgets($arquivo, 4096);
if(!feof($arquivo)){
$explode = explode(",", $linha);
$grupo = $explode[0];
$usuario = $explode[1];

if($Group == $grupo){
echo $usuario;
}

}
}
fclose($arquivo);

}
}//laço do if de form
?>



</body>
</html>

Share this post


Link to post
Share on other sites
brunoais

Enquanto não resolveres tudo o que indiquei no posto anterior n te vou ajudar mais. É mesmo muito difícil ajudar nesse estado.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
PlayMa256

Não sei porque raios a identação fica totalmente deformada quando copio o codigo do editor, meu codigo esta absolutamente bem identando, mas quando colo pro forum ele fica totalmente deformado.

    <!DOCTYPE html>
   <?php include "lerArquivo.php";
   ?>
   <html>
   <head>
       <title>Index</title>
   </head>
   <body>
   <form action="" method="post" enctype="multipart-form/data">
       <select name="usuario">
           <option value="" selected="selected">Selecione um usuario</option>
           <?php
               $arquivo = fopen("grupo.sql", "r+");
               while (!feof($arquivo)) {
                     $linha = fgets($arquivo, 4096);
                   if(!feof($arquivo)){                        
                       $explode = explode(",", $linha);
                       $grupo = $explode[0];
                       $usuario = $explode[1];
                       echo '<option value="'.$usuario.'">'.$usuario.'<option/>';
                   }

               }
               fclose($arquivo);
           ?>
   </select>
   <select name="grupo">
           <option value="" selected="selected">Selecione um grupo</option>
<?php
           $arquivo = fopen("grupo.sql", "r+");
               while (!feof($arquivo)) {
                       $linha = fgets($arquivo, 4096);
                   if(!feof($arquivo)){
                       $explode = explode(",", $linha);
                       $grupo = $explode[0];
                       $usuario = $explode[1];
                       echo '<option value="'.$grupo.'">'.$grupo.'</option>';
                   }
               }
               fclose($arquivo);
?>
   </select>
   <input type="submit" value="Procurar" />
   <input type="hidden" name="acao" value="enviar" />
   </form>
   <?php
       if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
           $User = $_POST['usuario'];
           $Group = $_POST['grupo'];



           if(($User != NULL) && ($Group == NULL)){
               $arquivo = fopen("grupo.sql", "r+");
               while (!feof($arquivo)) {
                       $linha = fgets($arquivo, 4096);
                   if(!feof($arquivo)){
                       $explode = explode(",", $linha);
                       $grupo = $explode[0];
                       $usuario = $explode[1];

                       if($User == $usuario){
                           echo $grupo;
                       }

                   }
               }
               fclose($arquivo);
           }elseif(($User == NULL) && ($Group != NULL)){
               $arquivo = fopen("grupo.sql", "r+");
               while (!feof($arquivo)) {
                       $linha = fgets($arquivo, 4096);
                   if(!feof($arquivo)){
                       $explode = explode(",", $linha);
                       $grupo = $explode[0];
                       $usuario = $explode[1];

                       if($Group == $grupo){
                           echo $usuario;
                       }

                   }
               }
               fclose($arquivo);

           }
       }//laço do if de form
?>
  </body>
   </html>

Pode ver que o codigo está totalmente identado no link do pastebin http://pastebin.com/611BAgsV

Eu realizei todas as coisa que haviam naquele post do site do php, e mesmo assim não funciona, a busca de usuários selecionando os grupos funciona, porem o contrario nao.

Share this post


Link to post
Share on other sites
HappyHippyHippo

dizer que não funciona não é informação suficiente para perceber o que procurar.

- o que está a acontecer ?

- o que deveria acontecer ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PlayMa256

Se ler alguns posts acima eu falo o problema.

Estava a receber o seguinte erro: "Undefined Offset 1" ao selecionar por usuario e querer pesquisar os grupos que este usuario faz parte.

Pesquisando por grupo, os usuarios que fazem parte desse grupo, funciona perfeitamente, porem ao pesquisar por usuario não aparece nada, simplesmente processa a requisição e não me devolve nenhum resultado. Imagino eu que seja pelo modo que o arquivo esta montado, sendo desta maneira: grupo,usuario

Share this post


Link to post
Share on other sites
PlayMa256

isso, é basicamente uma procura no arquivo, onde tenho relacionado grupo,usuario em diversas linhas do arquivo.sql

Basicamente assim:

ntadmins,anderson_sinotti

ntadmins,vinicius_pavani

ntpwrusr,ademilson

ntpwrusr,alexandre_belotto

ntpwrusr,claudio_conforte

ntpwrusr,ivan_ossuna

ntpwrusr,jesulino_silva

ntpwrusr,lucas_tanajura

ntpwrusr,luciano_santos

ntpwrusr,milton_fernandes

ntpwrusr,vanessa_santana

Ao procurar o grupo ntpwrurs, ele traria todos os usuarios que possuem esse grupo.

Ao selecionar o usuario vanessa_santana ele traria o grupo ntpwrusr como resultado, se fizesse parte de mais grupo, traria todos os quais ela faz parte.

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu sei o que queres fazer, não preceisas de explicar.

só vejo um problema que possa causar o que referes. este :

http://www.cplusplus.com/reference/cstdio/fgets/

A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str.

eu sei que a documentação é de C, mas o PHP funciona muito em chamadas directas do C, logo 99% da documentação de C é perfeitamente válida para as funções de PHP com o mesmo nome.

logo o que deverá estar a acontecer é que o valor de usuario lido possui o caracter '\n' o que invalida a comparação

terás de verificar se esse caracter faz parte do valor lido do ficheiro e remover-lo se for caso disso.

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
brunoais

Já agora:

O ficheiro tem os newlines usando \r\n ou é só \n?

  • Vote 1

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
PlayMa256

Bom, que possui \n é certeza, mas \r eu ja nao sei, como posso descobrir??

Estes arquivos foram criados com um script em linux, buscando os usuarios e as permissoes.

Bom, era esse o problema que o hippy falou, ele estava contendo \n no final de cada linha que lia, entao fiz desta maneira:

$linha = preg_replace('/\n$/','',$linha);
$linha = rtrim($linha);

E funcionou perfeitamente.

Obrigado.

Edited by PlayMa256

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.