Re: Failed to write to a text file (text file is RW) [message #171433 is a reply to message #171432] |
Mon, 03 January 2011 06:36 |
Adrienne Boswell
Messages: 25 Registered: October 2010
Karma:
|
Junior Member |
|
|
Gazing into my crystal ball I observed justaguy <donli(at)yahoo(dot)com>
writing in
news:ccc49c8d-262f-4b86-a1d6-4ef388fe677e(at)p7g2000prb(dot)googlegroups(dot)com:
> On Jan 2, 10:22 pm, Jerry Stuckle <jstuck...@attglobal.net> wrote:
>> On 1/2/2011 9:13 PM, justaguy wrote:
>>
>>
>>
>>> On Jan 2, 8:34 pm, Jerry Stuckle<jstuck...@attglobal.net> wrote:
>>>> On 1/2/2011 8:04 PM, justaguy wrote:
>>
>>>> > On Jan 2, 6:55 pm, Jerry Stuckle<jstuck...@attglobal.net> wrot
> e:
>>>> >> On 1/2/2011 6:26 PM, justaguy wrote:
>>
>>>> >>> On Jan 2, 5:00 pm, Denis
>>>> >>> McMahon<denis.m.f.mcma...@googlemail.com> wrote:
>>>> >>>> On 02/01/11 20:19, justaguy wrote:
>>
>>>> >>>>> I dig up the following script. Added a simple HTML file with
>>>> >>>>> a
> form
>>>> >>>>> field named "vote" and have it send to the following php
>>>> >>>>> script. However, it failed to write to the poll_result.txt
>>>> >>>>> file. Why?
>>
>>>> >>>> The following seems to work for me.
>>
>>>> >>>> <?php
>>>> >>>> $filename = "poll_result.txt";
>>>> >>>> if (isset($_POST['vote'])) {
>>>> >>>> $vote = intval($_POST['vote']); // get this vote
>>>> >>>> $content = file($filename); // read result file
>>>> >>>> $array = explode("||", $content[0]);
>>>> >>>> $yes = intval($array[0]); // get stored results
>>>> >>>> $no = intval($array[1]);
>>>> >>>> if ($vote == 1) $yes++; // increment one
>>>> >>>> if ($vote == 0) $no++;
>>>> >>>> $insertvote = $yes."||".$no; // new result string
>>>> >>>> }
>>>> >>>> else {
>>>> >>>> $insertvote = "0||0\n"; // reset result string
>>>> >>>> $yes = 0;
>>>> >>>> $no = 0;
>>>> >>>> }
>>>> >>>> $fp = fopen($filename,"w"); // store results
>>>> >>>> fputs($fp,$insertvote);
>>>> >>>> fclose($fp);
>>>> >>>> echo<<<EOT
>>>> >>>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
>>>> >>>> "http://www.w3.org/TR/html4/strict.dtd">
>>>> >>>> <html>
>>>> >>>> <head>
>>>> >>>> <title>Yes-No Poll</title>
>>>> >>>> </head>
>>>> >>>> <body style="padding:1em 3em">
>>>> >>>> <form method="post" action="quickpoll.php" name="f1" id="f
> 1">
>>>> >>>> <p>Yes:<input type="radio" name="vote" id="v1_1" value="1"
>> <br>
>>>> >>>> No:<input type="radio" name="vote" id="v1_0" value="0"><br
>>
>>>> >>>> <input type="submit" value="Vote Now" name="s1" id="s1"></
> p>
>>>> >>>> </form>
>>>> >>>> <p>The results so far:<br>
>>>> >>>> Yes: $yes votes<br>
>>>> >>>> No: $no votes</p>
>>>> >>>> </body>
>>>> >>>> </html>
>>>> >>>> EOT;
>>>> >>>> ?>
>>
>>>> >>>> Rgds
>>
>>>> >>>> Denis McMahon
>>
>>>> >>> Denis,
>>
>>>> >>> I still failed to write to the poll_result.txt file and I
>>>> >>> noticed there's a slight difference between this file's access
>>>> >>> attributes compared to a similar target text file with a
>>>> >>> similar script and process. The other target text file has
>>>> >>> rwxrwxrwx attributes whi
> le
>>>> >>> this one has rwrwrw attributes. I thought the global writable
>>>> >>> wo
> uld
>>>> >>> suffice but it seems I was incorrect. My ftp client failed to
>>>> >>> do chmod 755 to the global x (execute) attribute to the file.
>>
>>>> >>> Thanks though.
>>
>>>> >>> Don
>>
>>>> >> You do not need execute privileges to write the file - in fact,
>>>> >> you should NOT have it - the file is not an executable. You
>>>> >> also defi
> nitely
>>>> >> should NOT have global write (or read) privileges.
>>
>>>> >> Did you check the return value from fopen()? ALWAYS check it to
>>>> >> e
> nsure
>>>> >> that the file opened correctly. Also, do you know if the
>>>> >> fread()
> and/or
>>>> >> fwrite() worked correctly? You never check to see.
>>
>>>> >> --
>>>> >> =================
>>>> >> Remove the "x" from my email address
>>>> >> Jerry Stuckle
>>>> >> JDS Computer Training Corp.
>>>> >> jstuck...@attglobal.net
>>>> >> =================
>>
>>>> > Jerry,
>>
>>>> > Here's the block of code with debugging info and it still has a
>>>> > problem:
>>>> > //insert votes to txt file
>>>> > $insertvote = $yes."||".$no;
>>>> > $fp = fopen($filename,"w");
>>>> > echo "fp;";
>>>> > echo $fp;
>>
>>>> > fputs($fp,$insertvote);
>>>> > echo "insert; ";
>>>> > echo $insertvote;
>>>> > fclose($fp);
>>
>>>> > And here's its output:
>>>> > 10 fp;insert; 1||0
>>
>>>> > Which seems to suggest the operation of $fp =
>>>> > fopen($filename,"w") failed.
>>
>>>> > // the poll_result.txt file is in the same directory
>>>> > $filename = "poll_result.txt";
>>
>>>> > /* why ok with another php script?
>>>> > Why a similar statement for file read in another script is ok.
>>>> > $myFile = "someLog.txt";
>>>> > */
>>
>>>> > And yes, I know the 'x' bit isn't necessary. Odd. Thanks.
>>
>>>> I'm not talking about 'debug code' - I'm talking about actual code
>>>> you should have in every script - error checking.
>>
>>>> NEVER assume an external operation works. You should ALWAYS check
>>>> the return code, especially where external operations are
>>>> concerned, and i
> f
>>>> you get a bad one, you should take correct action.
>>
>>>> fopen() returns false if the file was not opened. So your current
>>>> example should have checked for a failure in fopen and taken the
>>>> appropriate action. For testing purposes, displaying a message
>>>> woul
> d be
>>>> sufficient. You would not want to do that on a production server,
>>>> o
> f
>>>> course, but you should at least log the error.
>>
>>>> Had you had such code in place, you would have known that the
>>>> fopen() failed and could have followed down why. And if this is
>>>> your development server, you should have in your php.ini:
>>
>>>> display_errors=on
>>>> error_reporting=E_ALL (or E_ALL | E_STRICT)
>>
>>>> These would have given you additional messages. But you don't want
>>>> the
> se
>>>> on a production server; instead you should log your PHP errors to
>>>> a fi
> le
>>>> and look at that file when you have problems.
>>
>>>> --
>>>> =================
>>>> Remove the "x" from my email address
>>>> Jerry Stuckle
>>>> JDS Computer Training Corp.
>>>> jstuck...@attglobal.net
>>>> =================
>>
>>> Jerry,
>>
>>> The code isn't working, so, of course it's not in production. I'm
>>> using an ISP's server, don't have a lot of control...
>>> yes, you're right, I was lazy in error detection/tracking for this
>>> piece of code, thought it should be fairly straight-forward.
>>
>>> Thanks.
>>
>>> Don
>>
>> Another point - get your own development machine going. It will make
>> your life a lot easier. Even if it's not the same OS and won't catch
>> every error (i.e. you wouldn't see this error on Windows), it will
>> help you many other ways.
>>
>> And depending on the ISP's setup, ini_set() and/or your .htaccess
>> file can change a number of PHP settings for a single script, every
>> script on your site, or many steps in between.
>>
>> --
>> =================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> =================
>
> Too bad, an open source webserver, Caucho Resin on my Windows 7 box
> fails to support php. The same code produced a blank page with
> nothing.
>
What edition of Win7? If it's not Home, you could use IIS.
--
Adrienne Boswell at Home
Arbpen Web Site Design Services
http://www.cavalcade-of-coding.info
Please respond to the group so others can share
|
|
|