fwrite

(PHP 3, PHP 4, PHP 5)

fwrite -- 写入文件(可安全用于二进制文件)

说明

int fwrite ( resource handle, string string [, int length] )

fwrite()string 的内容写入 文件指针 handle 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

fwrite() 返回写入的字符数,出现错误时则返回 FALSE

注意如果给出了 length 参数,则 magic_quotes_runtime 配置选项将被忽略,而 string 中的斜线将不会被抽去。

注: 在区分二进制文件和文本文件的系统上(如 Windows) 打开文件时,fopen() 函数的 mode 参数要加上 'b'。

例子 1. 一个简单的 fwrite() 例子

<?php
$filename
= 'test.txt';
$somecontent = "添加这些文字到文件\n";

// 首先我们要确定文件存在并且可写。
if (is_writable($filename)) {

    
// 在这个例子里,我们将使用添加模式打开$filename,
    // 因此,文件指针将会在文件的开头,
    // 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方。
    
if (!$handle = fopen($filename, 'a')) {
         echo
"不能打开文件 $filename";
         exit;
    }

    
// 将$somecontent写入到我们打开的文件中。
    
if (fwrite($handle, $somecontent) === FALSE) {
        echo
"不能写入到文件 $filename";
        exit;
    }

    echo
"成功地将 $somecontent 写入到文件$filename";

    
fclose($handle);

} else {
    echo
"文件 $filename 不可写";
}
?>

参见 fread()fopen()fsockopen()popen()file_put_contents()


add a note add a note User Contributed Notes
altant at gmail dot com
02-Nov-2006 03:15
I had to use .txt for email database for sending bulk email (Not spam, for a community).

The problem was i had to use "TAB" between name and email and all records=new lines.
 

<?php
$myFile
= "database.txt";
$fh = fopen($myFile, 'a') or die("Error!!");
fwrite($fh, "$name\t");
fwrite($fh, "$email\r\n");
fclose($fh);
echo
"Recorded!!"
?>
zaccraven at junk.com
11-Sep-2006 03:08
Use this to get a UTF-8 Unicode CSV file that opens properly in Excel:

$tmp = chr(255).chr(254).mb_convert_encoding( $tmp, 'UTF-16LE', 'UTF-8');
$write = fwrite( $filepath, $tmp );

Use a tab character, not comma, to seperate the fields in  the $tmp.

Credit for this goes to someone called Eugene Murai, I found this solution by him after searching for several hours.
santibari at yahoo dot com
19-Mar-2006 03:49
To write a specific byte into a file (let's,say 0000 0001), use the function chr().
<?php

fputs
($fp,chr(0x01),1);

?>
bahatest at ifrance doc com
24-Jul-2005 05:40
[Editor's Note: No, you only need to use this if you want a BOM (Byte order mark) added to the document - most people do not.]

if you have to write a file in UTF-8 format, you have to add an header to the file like this :

<?php
$f
=fopen("test.txt", "wb");
$text=utf8_encode("a!");
// adding header
$text="\xEF\xBB\xBF".$text;
fputs($f, $text);
fclose($f);
?>
james at nicolson dot biz
06-Jul-2005 11:09
I could'nt quite get MKP Dev hit counter to work.... this is how I modified it
<?
function hitcount()
{
$file = "counter.txt";
if ( !
file_exists($file)){
      
touch ($file);
      
$handle = fopen ($file, 'r+'); // Let's open for read and write
      
$count = 0;

}
else{
      
$handle = fopen ($file, 'r+'); // Let's open for read and write
      
$count = fread ($handle, filesize ($file));
      
settype ($count,"integer");
}
rewind ($handle); // Go back to the beginning
/*
 * Note that we don't have problems with 9 being fewer characters than
  * 10 because we are always incrementing, so we will always write at
   * least as many characters as we read
   **/
fwrite ($handle, ++$count); // Don't forget to increment the counter
fclose ($handle); // Done

return $count;
}     
?>
albert;cutthis; at ;coznospam;ribox dot nl
08-Jun-2005 12:02
To write 'true binary' files combine with pack() :

$a = 65530;
$fp = fopen('test.dat', 'w');
fwrite($fp, pack('L', $a));
fclose($fp);
MKP Dev
12-May-2005 08:25
bluevd at gmail dot com mentioned a hit counter. In his/her implementation, the file is first opened, read, closed, then opened +truncated, then written, and closed again. An alternative to this is:
<?php
$file
= 'counter.txt or whatever';
$handle = fopen ($file, 'r+'); // Let's open for read and write
$count = int (fread ($handle, filesize ($file)));
// We don't want to think it's a string and try appending
echo "Number of hits $count";
rewind ($handle); // Go back to the beginning
/*
 * Note that we don't have problems with 9 being fewer characters than
 * 10 because we are always incrementing, so we will always write at
 * least as many characters as we read
 **/
fwrite ($handle, ++$count); // Don't forget to increment the counter
fclose ($handle); // Done
?>
Will at EnigmaChannel dot com
25-Mar-2005 10:24
Using fwrite to write to a file in your include folder...

PHP does not recognise the permissions setting for the file until you restart the server... this script works fine. (still have to create the blank text file first though...it is not created automatically) On OS X Server..
Using the 1 in fopen tells php to look for the file in your include folder. Change your include folder by altering include_path in php.ini
On OS X Server, php.ini is in private/etc/php.ini.default
copy the file and call it php.ini

the default include path is usr/lib/php
(All these folders are hidden - use TinkerTool to reveal them)

<?php
$file
= fopen('textfile.txt', 'a', 1);
$text="\n Your text to write \n ".date('d')."-".date('m')."-".date('Y')."\n\n";
fwrite($file, $text);
fclose($file);
?>
goodwork at myrealbox dot com
18-Feb-2005 04:15
difficulty appending to file in SAFE MODE ON
if you are getting resource errors etc try this...

$textline="whatever string you submitted or created";
$filename="afilename.log"; // or whatever your path and filename
 if (!$handle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)"; // or handle your error
         exit; }
$textline.="\n"; // dont forget that period
// now write content to our opened file.
 IF (fwrite($handle,$textline) === FALSE)
   {echo "Cannot write to file ($filename)";// or handle your error
       exit;}
     echo "Success, wrote ($textline) to file ($filename)";
fclose($handle);
sheyh
10-Feb-2005 01:55
if you want to create quickly and without fopen use system, exec

system('echo "blahblah" > /path/file');
kzevian at cybercable dot net dot mx
04-Feb-2005 03:27
I needed to append, but I needed to write on the file's beginning, and after some hours of effort this worked for me:

$file = "file.txt";
if (!file_exists("file.txt")) touch("file.txt");
$fh = fopen("file.txt", "r");
$fcontent = fread($fh, filesize("file.txt"));

$towrite = "$newcontent $fcontent";

$fh22 = fopen('file.txt', 'w+');
fwrite($fh2, $towrite);
fclose($fh);
fclose($fh2);
bluevd at gmail dot com
23-Dec-2004 01:56
Watch out for mistakes in writting a simple code for a hit counter:
<?php
$cont
=fopen('cont.txt','r');
$incr=fgets($cont);
//echo $incr;
$incr++;
fclose($cont);
$cont=fopen('cont.txt','a');
fwrite($cont,$incr);
fclose($cont);
?>

Why? notice the second fopen -> $cont=fopen('cont.txt','a');
it opens the file in writting mode (a). And when it ads the incremented
value ( $incr ) it ads it ALONG the old value... so opening the counter
page about 5 times will make your hits number look like this
012131214121312151.21312141213E+ .... you get the piont.
nasty, isn't it? REMEMBER to open the file with the 'w' mode (truncate
the file to 0). Doing this will clear the file content and it will make sure that
your counter works nice. This is the final code

<?php
$cont
=fopen('cont.txt','r');
$incr=fgets($cont);
//echo $incr;
$incr++;
fclose($cont);
$cont=fopen('cont.txt','w');
fwrite($cont,$incr);
fclose($cont);
?>

Notice that this work fine =)
XU (alias Iscu Andrei)
chill at cuna dot org
27-Oct-2004 06:32
In PHP 4.3.7 fwrite returns 0 rather than false on failure.
The following example will output "SUCCESS: 0 bytes written" for existing file test.txt:

$fp = fopen("test.txt", "rw");
if (($bytes_written = fwrite($fp, "This is a test")) === false) {
  echo "Unable to write to test.txt\n\n";
} else {
  echo "SUCCESS: $bytes_written bytes written\n\n";
}
php at biggerthanthebeatles dot com
22-Aug-2003 06:04
Hope this helps other newbies.

If you are writing data to a txt file on a windows system and need a line break. use \r\n . This will write hex OD OA.

i.e.
$batch_data= "some data... \r\n";
fwrite($fbatch,$batch_data);

The is the equivalent of opening a txt file in notepad pressing enter and the end of the line and saving it.
Andi
17-Jul-2003 05:32
[Ed. Note:
The runtime configuration setting auto_detect_line_endings should solve this problem when set to On.]

I figured out problems when writing to a file using \r as linebreak, after that file() wasn't able to read the data from that file.
Using \n solved the problem.
chedong at hotmail dot com
20-Jun-2003 05:36
the fwrite output striped the slashes if without length argument given, example:

<?php
$str
= "c:\\01.txt";
$out = fopen("out.txt", "w");
fwrite($out, $str);
fclose($out);
?>

the out.txt will be:
c:^@1.txt
the '\\0' without escape will be '\0' ==> 0x00.

the correct one is change fwrite to:
fwrite($out, $str, strlen($str));
Jake Roberts
05-Jun-2003 02:35
Use caution when using:

$content = fread($fh, filesize($fh)) or die "Error Reading";

This will cause an error if the file you are reading is zero length.

Intead use:

if ( false === fread($fh, filesize($fh)) ) die "Error Reading";

Thus it will be successful on reading zero bytes but detect and error returned as FALSE.
Chris Blown
19-May-2003 06:12
Don't forget to check fwrite returns for errors! Just because you successfully opened a file for write, doesn't always mean you can write to it. 

On some systems this can occur if the filesystem is full, you can still open the file and create the filesystem inode, but the fwrite will fail, resulting in a zero byte file.
seeker at seek dot planet
10-Feb-2003 02:33
[[Editors note: There is no "prepend" mode, you must essentially rewrite the entire file after prepending contents to a string. Perhaps you will use file(), modify, implode(), then fopen()/fwrite() it back]]
To put strings into the front of the file, you need to set place the pointer at the top of the file when openning the file with fopen(), see fopen() for more info.