0

busy studying php with a book called "php and mysql web development 4th edition". i have trouble with the following code. i am trying to create a text file. i'm testing all code on a live server i get the following errors:

Warning: fopen(/home/truevvky/public_html/../orders/orders.txt): failed to open stream: No such file or directory in /home/truevvky/public_html/test/processorder.php on line 60 

Warning: flock() expects parameter 1 to be resource, boolean given in /home/truevvky/public_html/test/processorder.php on line 62.

the idea is to create a new text file

<?php
    //create short variable names
    $tireqty = $_POST['tireqty'];
    $oilqty = $_POST['oilqty'];
    $sparkqty = $_POST['sparkqty'];
    $address = $_POST['address'];
    $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
    $date = date('H:i, jS F Y');
?>

<html>
    <head>
    <title>Bob's Auto Parts - Order Results</title>
    </head>
    <body>
    <h1>Bob's Auto Parts</h1>
    <h2>Order Results</h2>
    <?php           
    echo "<p>Order processed at ".date('H:i, jS F Y')."</p>";
    echo "<p>Your order is as follows: </p>";
    $totalqty = 0;
    $totalqty = $tireqty + $oilqty + $sparkqty;
    echo "Items ordered: ".$totalqty."<br />";
    if ($totalqty == 0) {
    echo "You did not order anything on the previous page!<br />";
    } else{
    if ($tireqty > 0) {
    echo $tireqty." tires<br />";
    }

    if ($oilqty > 0) {
        echo $oilqty." bottles of oil<br />";
    }

    if ($sparkqty > 0) {
                        echo $sparkqty." spark plugs<br />";
                    }
                }

                $totalamount = 0.00;            

                define('TIREPRICE', 100);
                define('OILPRICE', 10);
                define('SPARKPRICE', 4);

                $totalamount = $tireqty * TIREPRICE
                                + $oilqty * OILPRICE
                                + $sparkqty * SPARKPRICE;

                $totalamount = number_format($totalamount, 2, '.',' ');

                echo "<p>Total of order is $".$totalamount."</p>";
                echo "<p>Address to ship to is ".$address."</p>";           

                $outputstring = $date."\t".$tireqty." tires \t".$oilqty." oil\t"
                                .$sparkqty." spark plugs\t\$".$totalamount."\t".$address."\n";

                // open file for appending
                @ $fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab');

                flock($fp, LOCK_EX);

                if (!$fp) {
                    echo "<p><strong> Your order could not be processed at this time. 
                            Please try again later.</strong></p></body></html>";
                    exit;
                }

                fwrite($fp, $outputstring, strlen($outputstring));
                flock($fp, LOCK_UN);
                fclose($fp);

            ?>
        </body>
    </html>
2
  • @HithamS.AlQadheeb it does not exist im trying to create it with php Commented Dec 26, 2013 at 6:15
  • orders directory has been created but orders.txt still not created Commented Dec 26, 2013 at 6:20

6 Answers 6

1

I'm working on the same book and found the solution to his problem. I know this is old and maybe he figured this out, but wanted to put my answer for anyone else who encounters this.

for some reason in the book he puts flock before we even know if the file exist that's what is causing the error. flock() just puts a lock so that we can write LOCK_EX and fwrite() then writes whatever we output and LOCK_UN releases the lock.

for $DOCUMENT_ROOT mine with WAMP looked like this "C:/wamp/book/orders/orders.txt" so in the code remove the "..".

 // open file for appending
 @ $fp = fopen("$DOCUMENT_ROOT/orders/orders.txt", 'ab');

 if (!$fp) {
   echo "<p><strong> Your order could not be processed at this time. 
   Please try again later.</strong></p></body></html>";
   exit;
 }

 //you move flock down here
 flock($fp, LOCK_EX);

 fwrite($fp, $outputstring, strlen($outputstring));
 flock($fp, LOCK_UN);
 fclose($fp);
Sign up to request clarification or add additional context in comments.

Comments

1

Opening file for appending works with file that exists. I would personally do something like

$path = "$DOCUMENT_ROOT/../orders/orders.txt";
$content = "Okay here are my contents";
$fp = null;
if(file_exists($path))
{
    $fp = fopen($path, 'ab');
}
else
{
    $fp = fopen("myText.txt","wb");
}
fwrite($fp,$content);
fclose($fp);

Comments

1

Maybe you did not create "orders" folder in "$DOCUMENT_ROOT/../" path. You should understand fopen('filepath', 'ab') just can create the specific file. If the path was not complete (can't find the "orders" folder), it won't work. So you can make the folder manually first, then test the .php

Comments

1
echo $DOCUMENT_ROOT

you could see your server's root address, mine is D:/AppServ/www.

If you use "$DOCUMENT_ROOT/../orders/orders.txt" you will get address: D:/AppServ/orders/orders.txt. Notice that you should be sure that you have a file folder named orders. So we can see that .. is to mean the parent directory of the document root directory, the parent directory is D:/AppServ.

Comments

0

Please make sure that the web server user can write a file on '/home/truevvky/public_html/../orders/' directory.

Comments

0

The fopen statement should be:

$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'w');

Your way assumes the file exists.

By the way the 'b' you included in the second argument means you want to write the data in binary. If that's the case then fopen should be:

$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'wb');

1 Comment

he wants to append to file so my answer is better in that if file does not exist it creates and if it does it just do the append :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.