почему PHP fopen + fwrite делает двойной документ?

Я использую PHP версии 5.3.4 с Apache/2.2.17 в Windows 7 Ultimate 32bit (IIS отключен). Я просматривал режимы fopen и хорошо знаю, что делает этот режим. что, но я не могу понять, почему двойная публикация в txt-файл с одним fwrite. Я даже пробовал режимы: w и c.

Теперь мне все равно, добавляются ли новые данные в начале или в конце, пока они есть в файле без усечения существующих данных.

Реальный вопрос заключается в том, почему режим «а» вместо того, чтобы просто добавлять новые данные, дважды записывает (дублирует) новые данные в файл перед его закрытием.

В php-коде:

$fh = "";
if(!($fh = fopen("list.txt","x")) // if file exists, just open for writing (prepend)
   $fh = fopen("list.txt","a"); // if not exist, open just for writing (append)

fwrite($fh,"Somthing\r\n"); // write to file (filehandle, "data")
fclose($fh); // close the file

Результаты:
Что-то
Что-то

РЕШЕНО: Виновник найден: с моей кодировкой все в порядке. Это расширение html-валидатора, которое я использовал для Chromium в Ubuntu 10.04. Это расширение, по-видимому, вызывало нечто похожее на мгновенную перезагрузку страницы.


person robx    schedule 29.04.2011    source источник
comment
вы можете использовать режим c, который действует как w, но не стирает файл. двойное что-то похоже на то, что вы дважды запускали скрипт.   -  person yoavmatchulsky    schedule 30.04.2011
comment
На самом деле режим c, кажется, усекает и записывает новые вещи. Каждый раз, когда я ввожу новые данные и загружаю php-страницу, старые данные стираются вместо новых данных.   -  person robx    schedule 30.04.2011
comment
Действительно, это была проблема. Никогда бы не подумал!   -  person Andrei Zisu    schedule 17.12.2011


Ответы (2)


$fh = fopen("list.txt","a");
fwrite($fh,"Somthing\n"); // write to file (filehandle, "data")
fclose($fh); // close the file

ваша логика была неверна.

вот как это делается, я надеюсь, что это сработает для вас

person Ibu    schedule 29.04.2011
comment
извините, я исправил небольшую ошибку, у меня был fopen x в обоих - person Ibu; 30.04.2011
comment
Я думал, что режим x вернет false, если файл существует? И он по-прежнему дублирует сообщения в файле txt. - person robx; 30.04.2011
comment
на самом деле вам не нужно, чтобы файл существовал, просто выполните $fh = fopen("list.txt","a");, если файл не существует, он создаст его, а если он существует, он просто добавит к нему новые данные. - person Ibu; 30.04.2011
comment
Это был мой первоначальный подход — просто использовать режим a. Меня смущает дублирующаяся запись. Если я вывожу его в HTML, я получаю только один раз, но при записи в файл есть повторяющиеся записи. - person robx; 30.04.2011
comment
потому что с вашим подходом вы дважды открываете дескриптор, поэтому вы дважды добавляете или пишете. просто напишите это и дайте мне обратную связь $fh = fopen("list.txt","a"); fwrite($fh,"Somthing\n"); // write to file (filehandle, "data") fclose($fh); // close the file - person Ibu; 30.04.2011
comment
даже такие простые, как эти строки, я все равно получаю двойную запись в файл. - person robx; 30.04.2011
comment
может быть, вам стоит посмотреть на какую-то другую часть вашего файла, вы используете перенаправления? или есть другое условие для записи? предоставьте больше кода, возможно, это не проблема - person Ibu; 30.04.2011
comment
ни петли, ничего. просто старый добрый $fh = fopen(list.txt,a); fwrite($fh,abc\r\n); fclose($fh); @ robx.dyndns.info/app/fwrite.php все ссылки загружаются текстовый файл и стирает содержимое из файла. У этой страницы нет других кодов, даже html. Просто прямой файл php с этими простыми несколькими строками. Ну кроме ссылок других нет. Я мог бы удалить все, кроме этого, и вы увидите, что он будет добавляться дважды каждый раз, когда вы загружаете страницу. - person robx; 30.04.2011
comment
эм, вы проверили ссылку, которую вы только что дали? оно работает! у вас, вероятно, проблема с перезагрузкой браузера или что-то в этом роде. потому что каждый раз, когда я перезагружаю страницу, я добавляю еще одну строку, разве это не то, что вы ищете? - person Ibu; 30.04.2011
comment
Странный. Я использую Chromium на Ubuntu. Вау, я думаю, что это на самом деле проблема с хромом. Возможно, браузер по какой-то причине перезагружается. Пробовал со смарт-устройства, работает так же хорошо. Благодарю. Какая головная боль. - person robx; 30.04.2011

Я понимаю, что этому уже много лет, но известно, что эта проблема все еще возникает, и есть еще одна причина, которая также может ее вызывать. У меня не было расширения, используемого @robx, я отключил все свои расширения и никаких изменений - по-прежнему двойные записи. Однако после прочтения этой темы о том, что это ошибка Chrome (https://bugs.chromium.org/p/chromium/issues/detail?id=64810) комментарий 16 предполагает, что проблема заключается в предварительной выборке фавикона. Не идеально, но удалите тег ссылки на значок favion в заголовке документа, и это остановит двойные записи.

person garrettlynchirl    schedule 10.08.2018