Jump to content

Recommended Posts

Posted

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>
Posted

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...

Posted

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 ?

Posted

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á.

Posted

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 ;  ?

Posted

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");

}
Posted

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 ); 
}
Posted

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 :@

Posted

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.

Posted

Obrigado 🙂

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

valeu a ajuda, kingless, um abraço 😛

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

Posted

Sobre o \r, acho que isto ajuda 😛

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

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.