• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

Agenda com FILES

12 mensagens neste tópico

Bem malta estou a dar em louco com uma cena.. È uma agenda utilizando ficheiros, mas o livro está nesta parte muito complexo, vocês vao ver que ele tem as register_global off mas isso eu dou conta..

agora nao percebo é a cena do $offset no campo hidden..

Por exemplo se eu carregar "Procurar" ele vai por $offset = 0 ; sim mas o que isto adianta ? para que serve isto no hidden ?

no livro diz :"Notice how $offset is used to track the current browsing position.. Because the two fields(name and email) stored in the file have fixed widths , the program logic is simple; if  the field had varying widths , the logic would be significantly more complex

mas nao entendo mesmo

<html>
<head>
<title>Adress Book</title>
<head>
<body>
<h2>Address Book Browser</h2>
<form method="post" action="browser.php">

$offset -= 49;
if($offset <0){
$offset = 0;
$fh = fopen("abook.txt", "r");
if(!$fh)
die("<br> failed to open the file");

fseek($fh,$offset, SEEK_SET);

$name = fread($fh, 24);
$email = fread($fh, 24);
fclose($fh);}
elseif(isset($right))
{
$offset += 49;
if($offset < 0)
	$offset = 0;
$fh = fopen("abook.txt", "r");
if(!$fh)
	die("<br>Failed to open the file");

fseek($fh, $offset, SEEK_SET);
$name= fread($fh, 24);
$email = fread($fh, 24);
}
elseif(isset($search))
{
$offset = 0;
$pattern = $name;
$name = "";
$email = "";
$fh = fopen("abook.txt", "r");
if(!$fh)
	die("<br>failed to open the file");
fseek($fh, $offset, SEEK_SET);

$s = fgets($fh, 256);
while(feof($fh))
{
	$file_name= fread($fh, 24);
	$file_email = fread($fh, 24);
	$match = stristr($file_name, $pattern);
	if($match !== false ) break;
	$offset += 49;
}

fclose($fh);

$offset +=49;
$name = $file_name;
$email = $file_email;
}
elseif(isset($add))
{
$name = str_pad($name, 24);
$email = str_pad($email, 24);

$fh = fopen("abook.txt", "a");
if(!$fh)
	die("<br>Failed to open file");
fwrite($fh, $name);
fwrite($fh, $email);
fwrite($fh, "\n");
$offset = ftell($fh) - 49;
fclose($fh);
}
$name= trim($name);
$email = trim($email);

<br>Name:
<br><input type="text" name="name" echo "Value=\"$name\"">
<br>
<br>Email Adress:
<br><input type="text" name="email" 
echo "Value=\"$email\"">
<br>
<br>
<input type="submit" name="search" value="search">
<input type="submit" name="left" value="<">
<input type="submit" name="right" value=">">
<input type="submit" name="add" value="ADD">
<input type="hidden" name="offset"  echo " Value=\"$offset\"">
</form>
</body>
</html>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

n sei se tou a perceber o problema aqui... mas quanto a tua pergunta... ele simplesmente esta a passar como argumento do POST o valor do offset. sempre que submetes o formulario, o offset pode vir a ter um valor diferente do anterior, logo é usado um campo hidden (pk n nos interessa nada ver tal informação no ecra mas precisamos dela) para o valor ser passado pelo POST como se tratasse de um campo normal...

ms se a constante register_globals esta off, isso n deve funcionar la mt bem, tudo que é $offset, devia ser $_POST['offset'], ms isso já deves saber...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, já estou a começar a ganhar mais vontade de tentar perceber o que faz o offset ali , whatever.. agora outra dúvida..

$name = str_pad($name, 24);

$email = str_pad($email, 24);

porque é se deixa sempre um espaço a seguir á virgula ? (style ???)

ok depois a duvida é..

fwrite($fh, $name);

fwrite($fh, $email);

isto não vai ficar tudo junto ? tipo : tiagoxka@pap.pt em vez de tiago xka@pap.pt ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1) tanto faz, com espaço ou sem espaço funciona mesma forma. é uma questão de estetica, faz como gostas mais.

2) yep, ms pa contornar isso faz algp como fwrite($fh, $name." "); e já tá.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok , agora , se eu carregar em adicionar ele faz $offset = ftell($fh) - 49;

ora... isto depois do $name = str_pad($name, 24);

                            $email = str_pad($email, 24);

Com o caracter que muda de linha , 24 + 24 +1 = 49... Porque é que não ponho logo $offset = 0 ;  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou com um problema, quero que quando faça registos o gajo mude de linha no .txt mas não consigo, já usei o "\n" e aparece o caracter dele no txt mas o texto não aparece na linha de baixo como eu queria...

já tentei com o fseek($handle, 0 , SEEK_END); também não resultou.. Pede-se Ajuda pff..

snippet :

if(isset($_POST['Adicionar']))
{
$handle = @fopen($file, "a+")
	OR die("Failed to open the file " . $file . "\n");
    $nome = $_POST['Nome'];
$email = $_POST['Email'];


@fwrite($handle, $nome . "|-|");
@fwrite($handle, $email );
@fwrite($handle, "\n");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta assim

if(isset($_POST['Adicionar']))
{
$handle = @fopen($file, "ab+")  OR die("Failed to open the file " . $file);
        $nome = $_POST['Nome'];
$email = $_POST['Email'];

        $gravar = $nome  ."|-|". $email;
@fwrite($handle, "$gravar\r\n");
        @fclose( $handle ); 
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é \r e o ab+ ?? desconheço o b

Já funciona, obrigado, mas podes explicar isso do \r e do ab+ ?

o a eu sei o que é

nem percebo porque é que o outro não dava :@

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O b é para ser compativel com o windows  e  \r\n é para fazer nova linha no windows.  O \r é retorno de carro, eu também não sei muito bem para que serve, mas utiliza-se muito para criar nova linha no windows.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado :)

se alguem souber explicar melhor a cena do \r , agradecia,

valeu a ajuda, kingless, um abraço :P

edit : Ao que parece \r é return e o .txt "is a plane text" e usa o \r e não o \n(newline)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sobre o \r, acho que isto ajuda :P

Mas este para o teu caso deve ser ouro sobre azul :)

\r é o carriage return enquanto que o \n é o line feed (ou newline)

Em sistemas unix basta o \n no entanto windows e MacOS já requer o \r para meter no inicio da nova linha visto que o \n apenas cria essa mesma nova linha.

Espero que dê para perceber :)

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, Heckel    :)

É por estas e por outras que quero mudar rapidamente para LINUX :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora