php - Mutiple file_put_content not working except the last one
I have a file {-code-1}
looks like the below:
$first_data = 0;
$second_data = 0;
$third_data = 0;
I have three HTML checkbox on frontend and I would like to store the value into {-code-1}
.
( The value is 1
if it's checked )
In process.php
, I use $_POST['data_value']
and store the value into the variables which looks like the below:
$process_first_data = isset ( $_POST['first_checkbox'] ) ? 1 : 0;
$process_second_data = isset ( $_POST['second_checkbox'] ) ? 1 : 0;
$process_third_data = isset ( $_POST['third_checkbox'] ) ? 1 : 0;
And I use this method with preg_replace
to replace the value in {-code-1}
from process.php
which looks like the below:
$find_first_data = '/\$first_data = \d;/';
$find_second_data = '/\$second_data = \d;/';
$find_third_data = '/\$third_data = \d;/';
$replace_first_data = '$first_data = ' . $process_first_data . ';';
$replace_second_data = '$second_data = ' . $process_second_data . ';';
$replace_third_data = '$third_data = ' . $process_third_data . ';';
$dir = 'path/to/file';
$file_content = file_get_contents ( $dir );
file_put_contents ( $dir, preg_replace ( $find_first_data, $replace_first_data, $file_content ) );
file_put_contents ( $dir, preg_replace ( $find_second_data, $replace_second_data, $file_content ) );
file_put_contents ( $dir, preg_replace ( $find_third_data, $replace_third_data, $file_content ) );
But now the problem is only the last file_put_contents
is working. For example, now only the third one is working. And if I remove the third one, there are two left, then the second one is working only. And if I remove the second and the third one, there is one left, then the first one is working only.
There is no error, sorry for the long story because I want to make it in detail. May I know why only the last file_put_contents
is working in this case?
Answer
Solution:
It looks like all three file_put_contents() are working, but you are overwriting the same file "$dir" three times.
file_put_contents($file, $contents, $flags);
An example of $flags is FILE_APPEND which will append to the end of the file instead of overwriting.
Answer
Solution:
One way to understand code better is to introduce some meaningful names for intermediate variables. So we could change this:
$dir = 'path/to/file';
$file_content = file_get_contents ( $dir );
file_put_contents ( $dir, preg_replace ( $find_first_data, $replace_first_data, $file_content ) );
file_put_contents ( $dir, preg_replace ( $find_second_data, $replace_second_data, $file_content ) );
file_put_contents ( $dir, preg_replace ( $find_third_data, $replace_third_data, $file_content ) );
To this:
$dir = 'path/to/file';
$original_file_content = file_get_contents ( $dir );
$first_new_content = preg_replace ( $find_first_data, $replace_first_data, $original_file_content );
file_put_contents ( $dir, $first_new_content );
$second_new_content = preg_replace($find_second_data, $replace_second_data, $original_file_content );
file_put_contents ( $dir, $second_new_content);
$third_new_content = preg_replace($find_third_data, $replace_third_data, $original_file_content );
file_put_contents ( $dir, $third_new_content);
Now, notice that the definitions for the three new variables don't reference each other, or re-read the file, they just look at $original_file_content
. They could actually happen in any order, before the set of file_put_contents
calls:
$dir = 'path/to/file';
$original_file_content = file_get_contents ( $dir );
$third_new_content = preg_replace($find_third_data, $replace_third_data, $original_file_content );
$second_new_content = preg_replace($find_second_data, $replace_second_data, $original_file_content );
$first_new_content = preg_replace ( $find_first_data, $replace_first_data, $original_file_content );
file_put_contents ( $dir, $first_new_content);
file_put_contents ( $dir, $second_new_content);
file_put_contents ( $dir, $third_new_content);
Since file_put_contents
over-writes the whole file by default, the content of the file will always be $third_new_content
.
What you probably intended is for each of the replacements to happen on the result of the previous one, then write the final result to the file at the end:
$dir = 'path/to/file';
$original_file_content = file_get_contents ( $dir );
$first_new_content = preg_replace ( $find_first_data, $replace_first_data, $original_file_content );
$second_new_content = preg_replace($find_second_data, $replace_second_data, $first_new_content );
$third_new_content = preg_replace($find_third_data, $replace_third_data, $second_new_content );
file_put_contents ( $dir, $third_new_content);
Answer
Solution:
Use FILE_APPEND
option
e.g.
file_put_contents ( $dir, preg_replace ( $find_third_data, $replace_third_data, $file_content ), FILE_APPEND );
Source