edit a file with PHP.

Ok here is what I have going on.

I am listing the contest of a directory so I can edit and delete files.

The code I am using to do that is below (Other then editing as it does not work).

<?php
$directory = ("enctlfiles/");
$dir = opendir($directory);
$files = array();
while (($file = readdir($dir)) != false) {
$files[] = $file;
}
closedir($dir);
sort($files);
print("<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n");
print("<TR><TH>File Name</TH><th>Modified Date</th><th>Entries In File</th><th>Delete | Edit</th></TR>\n");
foreach ($files as $file)
 {
                if (strpos($file, '.jpg',1)||strpos($file, '.ctl',1) ){
                echo "<TR><TD><a href=$directory$file>$file</a></td>";
                echo "<td>";
                echo date("F d Y H:i:s",filemtime($directory. $file));
                echo "<td>";
                echo count(file($directory. $file));
                echo "<td>";
                echo "<a href=enctlfiles/dodelete.php?file=$file>Delete</a> | <a href=enctlfiles/editfile.php?file=$file>Edit</a>";


             }
        }
?>

That lists all of the files in order in a nice pretty table. The delete function works. The edit one not so much :(. It is due to me not knowing what I am doing I am sure of it.

Here is the contents of the editfile.php

<form action="edit.php" method="post">
<TEXTAREA NAME="save" COLS=150 ROWS=50 wrap="off">
<?php
$dir = ".";
include($dir. '/' .$_GET['file']);
?>
</textarea>
<P><INPUT TYPE="SUBMIT" VALUE="Update File"><INPUT
TYPE="RESET">
</FORM>

That populates the textarea with the file contents when you click on the "Edit" link. I don't know if that is the right way to get the data in there to be able to edit the file.

Here is the contents of the edit.php file:

<?php
//$org = ($_GET['file']) or exit("Unable to open file!"); //I have tried this but it give me that Unable to open file.
$org = $_POST['save'] or exit("Unable to open file!"); //This returns me to the prodsh.php page but does not edit the file.
$copy = $org . date("-m-d-Y-His");
copy($org,$copy);
$f = fopen($org, 'w');
fwrite($f, $_POST['save']);
fclose($f);
header('Location: http://somesite.com/GroveTuckey/itemsetup/prodsh.php');
?>

I think the editfile.php and the edit.php file are jacked up but don't know where.

I am trying to learn this and this site has been very helpful when I get stumped on something so I thank you in advance for the help given.

Also I know the danger of editing files via a webpage. This is not public or on a server that is accessible by the world. Right now I don't want to deal with a database.

---------- Post updated at 11:14 AM ---------- Previous update was at 10:35 AM ----------

I have edited files using the below code:

<form action="doedit.php" method="post">
<TEXTAREA NAME="save" COLS=150 ROWS=50 wrap="off">
<?php
include('somefile.ctl');
?>
</textarea>
<P><INPUT TYPE="SUBMIT" VALUE="Update File"><INPUT
TYPE="RESET">
</FORM> 

With the contents of doedit.php being:

<?php
$org = 'Somefile.ctl';// This is the name of the file in the form above
$copy = $org . date("-m-d-Y-His");
copy($org,$copy);
$f = fopen('somefile.ctl', 'w');//This is the name of said file also.
fwrite($f, $_POST['save']);
fclose($f);
header('Location: http://somesite.com/GroveTickey/editfile.php');
?>

But since the names of the files can be anything I can't put specific names in the script.

This works great other then having to hardcode file names.

You won't be able to write to the file unless the web server has write permissions. Are you sure you have them for that file?

Yup.

I can edit a file if I call for them in the script directly (The last part of my post).

I will look at the permission again though.......

The folder the files are in themselves has permission of 777 and the files are 664.

Corona688 did that answer your question?

I also have a working script that creates files from info that is entered into a textarea.

Thanks Corona688!

I feel I am not passing the info from one php script to the next correctly. But again I am a n00b at all of this.

This gives the entire universe permission to delete and create new files in this folder. Are you sure that's a good idea?

Not quite. Who owns these files, the user and group?

This is on a server that is not accessible to the outside world. I mean I can change the permission on the folder itself.

The files are owned by the user(twilliab) and the group is www.

Sorry I did not answer your question correctly. I hope I did this time.

---------- Post updated at 02:00 PM ---------- Previous update was at 12:18 PM ----------

I guess when it comes down to it I want to be able to list a certain file type in a dir. Have a link to edit the file. Take me to another page where it has a text area filled in with the file information. Let me edit said file and save the changes. Making a copy of the original so I have a backup.

Taking a closer look.

For page?var=value URL's, you must use $_GET, not $_POST.

You are not preserving the filename anywhere, so the code won't know what file to save as. Right now, you're using the file contents as the file name!

You can preserve it as another field in the form.

<input type='hidden' name='filename' value='<?=$filename?>' >

I have to think on what that means. I am slow :slight_smile:

I am using $_GET in the form. So I think I got that.

Thanks again!

How will your file-editing program know what file to edit? You have to give it back to it somehow. So you make it part of the form, which will put it into $_GET for you.

Well no such luck yet. I may just have to step away and come back to it once I don't feel like I want to punch my laptop :slight_smile:

I mean I get what you are saying. Just putting it into practice is my issue :frowning:

Add another element to your form to hold the value, so when it's submitted, it gives it back.

<input type='hidden' name='filename' value='<?=$filename?>' >

When PHP's done with it it ought to look like

<input type='hidden' name='filename' value='somesillyfile.txt' >
<form action="edit.php" method="POST">
<TEXTAREA NAME="save" COLS=150 ROWS=50 wrap="off">
<?php
$dir = ".";
include($dir. '/' .$_GET['file']);
?>
</textarea>
<P><INPUT TYPE="SUBMIT" VALUE="Update File"><INPUT
TYPE="RESET" ><INPUT TYPE="hidden" name="filename" value="<?$filename?>">
</FORM>

That is what I added to the form.

:wall:

---------- Post updated at 09:03 PM ---------- Previous update was at 04:58 PM ----------

Ok so here is what worked

This is the form:

<form action="edit.php?file=<?php echo $_GET['file'];?>" method="POST">
<TEXTAREA NAME="save" COLS=150 ROWS=50 wrap="off">
<?php
$dir = ".";
readfile ($dir. '/' .$_GET['file']);
?>
</textarea>
<P><INPUT TYPE="SUBMIT" name="form" VALUE="Update File"><INPUT
TYPE="RESET" >
</FORM>

This is the edit page:

<?php
$org = $_GET['file'] or exit("Unable to open file!");
$copy = $org . date("-m-d-Y-His");
copy($org,$copy);
$f = fopen($org, 'w');
fwrite($f, $_POST['save']);
fclose($f);
header('Location: http://somewebsite.com/GroveTuckey/itemsetup/prodsh.php');
?>

Thanks for your input!