I want to make a .php file downloadable by my users.
Every file is different from an user to another:
at the line #20 I define a variable equal to the user ID.
To do so I tried this: Copy the original file. Read it until line 19 (fgets) then fputs a PHP line, and then offer the file to download.
Problem is, the line is not inserted after line 19 but at the end of the .php file. Here is the code:
if (is_writable($filename)) {
if (!$handle = fopen($filename, 'a+')) {
echo "Cannot open file ($filename)";
exit;
}
for ($i = 1; $i <= 19; $i++) {
$offset = fgets($handle);
}
if (fwrite($handle, $somecontent) === FALSE) {
exit;
}
fclose($handle);
}
What would you do ?
append mode
+ain fopen() places the handle’s pointer at the end of the file. Your fgets() loop will fail as there’s nothing left to read at the end of the file. You’re basically doing 19 no-ops. Your fwrite will then output your new value at the end of the file, as expected.To do your insert, you’d need to
rewind()the handle to the beginning, then do your fgets() loop.However, if you’re just wanting people to get this modified file, why bother doing the “open file, scan through, write change, serve up file”? This’d leave a multitude of near-duplicates on your system. A better method would be to split your file into two parts, and then you could do a simple:
which saves you having to save the ‘new’ file each time. This would also allow arbitrary length inserts. Your fwrite method could potentially trash later parts of the file. e.g. You scan to offset “10” and write out 4 bytes, which replaces the original 4 bytes at that location in the original file. At some point, maybe it turns into 5 bytes of output, and now you’ve trashed a byte in the original and maybe have a corrupted file.