Форум "Web-мастер"
Технологии web-програмирования
#0 Таго Гваун © 21.09.06 11:36:48 - 22.09.06 18:49:59 ФайлыСтавит в тупик серьезный. Есть код function showkom(){Эта зараза орет, что файл открыть не может. И ему по фиг указываю ли я в функции file() второй аргумент 1 или 0 и открываю я файл fopen(), не открываю - результат один и тот же. Не могет открыть файл, хотя этот файл до написания каркаса был уже в директории, где лежит скрипт. В чем тут может быть дело? Я смотрел справку - ответ толком не дала.
|
|
Блин, ну задавай нормально вопросы. Скока можно телепать? О чём можно понять из названия темы? Какую конкретно ошибку выдаёт? Что делает приведённый кусок кода и почему приведён именно он? Не понятно, где используется результат функции fopen. И нельзя использовать в flock результат функции file, т.к. это массив, а не указатель на файл. |
|
#2 Таго Гваун © 21.09.06 12:22:06
ошибка простая. срабатывает or die("Не могу открыть файл.") Тогда как заблокировать файл от чтения записи, если нельзя юзать flock? fopen ни где не нужен по ходу дела, хотя это вестимо моя ошибка, так как я думла, что надо сначала открыть файл потом брать массив. Функция приведена не вся ВитяТ, но теперь уже понятен вопрос? |
|
> ошибка простая. срабатывает or die("Не могу открыть файл.") А система какую ошибку выдает? Или у тебя как всегда отключен показ ошибок? Впрочем, могу предположить, у тебя либо нету этого файла, либо неправильные права у файла, либо где-то ты ему заблокировал доступ. Ты это проверял??? > Тогда как заблокировать файл от чтения записи, если нельзя юзать flock? Юзать flock можно, нельзя ему передавать неправильные параметры. > fopen ни где не нужен по ходу дела, хотя это вестимо моя ошибка, так как я думла, А я откуда знаю, что ты думал? Как обычно, расчёт на телепатов? > Функция приведена не вся Нужно приводить код, непосредственно касающийся проблемы. > но теперь уже понятен вопрос? Теперь уже понятен ответ? |
|
#4 Таго Гваун © 21.09.06 13:20:41
А система какую ошибку выдает? Или у тебя как всегда отключен показ ошибок? Впрочем, могу предположить, у тебя либо нету этого файла, либо неправильные права у файла, либо где-то ты ему заблокировал доступ. Ты это проверял??? как проверить заблокирован ли доступ и права? ошибки я НЕ подавлял. файл ЕСТЬ. срабатывает запрограммирвоаная мной ошибка $fr=file("komment.txt") or die("Не могу открыть файл");я виделил ее жирным. Юзать flock можно, нельзя ему передавать неправильные параметры. а чем параметры не правильны? Я прочел их из справки php4 Нужно приводить код, непосредственно касающийся проблемы. я его и привел. Теперь уже понятен ответ? не совсем. смотри первый мой вопрос. |
|
> ошибки я НЕ подавлял. Ну и какую же ошибку выдаёт система (не твоё сообщение!)? > чем параметры не правильны? Я прочел их из справки php4 Неправильно значит прочёл. Перечитай. Я уже написал выше, file возвращает массив, а flock требует идентификатор файла. |
|
#6 McSimm © 21.09.06 15:09:24
Для начала по теме : Конструкция > $fr=file("komment.txt") or die("Не могу открыть файл"); будет приводить к смерти если 1. файл пустой (судя по всему этот случай) 2. файл не найден 3. не хватает прав Чтобы избежать первого, писать строгое сравнение на false: if (false === $fr=file("komment.txt")) { die ('to be or not to be'); } Чтобы избежать второго, указывать полный путь, а не относительный, как здесь Чтобы избежать третьего, - создавать файл лучше от того же пользователя, которым потом будем читать и не забывать натравливать на него chmod() ---- ( В приведенном коде использование flock() совершенно бессмысленно. ) |
|
#7 McSimm © 21.09.06 15:14:01
> file возвращает массив, а flock требует идентификатор файла. Плюс к этому, константа LOCK_NB не имеет смысла будучи одинокой |
|
#8 McSimm © 21.09.06 15:15:49
ну и напоследок, даже если вызвать flock() с полностью правильными параметрами, смысла не прибавится, т.к. чтение уже фактически произведено с помощью file(). |
|
> #4 Таго Гваун © > ошибки я НЕ подавлял. пока отлаживаешь скрипты обязательно включай рапортование об ошибках ПРИНУДИТЕЛЬНО. Как отладишь - закоментируй. Функция error_reporting -- set which PHP errors are reported Description int error_reporting(int [level] ); Sets PHP's error reporting level and returns the old level. The error reporting level is a bitmask of the following values (follow the links for the internal values to get their meanings): Table 1. error_reporting() bit values value constant 1 E_ERROR 2 E_WARNING 4 E_PARSE 8 E_NOTICE 16 E_CORE_ERROR 32 E_CORE_WARNING 64 E_COMPILE_ERROR 128 E_COMPILE_WARNING 256 E_USER_ERROR 512 E_USER_WARNING 1024 E_USER_NOTICE 2047 E_ALL Example 1. error_reporting() examples <?phpсамое простое - вначале каждой странички ставить error_reporting (E_ALL); а когда отладишь - закоментировать // error_reporting (E_ALL); глянь также вот это #ini.display-errors |
|
#10 Таго Гваун © 21.09.06 16:46:58
1. файл пустой (судя по всему этот случай) Файл точно пуст. Ну и какую же ошибку выдаёт система (не твоё сообщение!)? Никакой, а когда я имел глупость поставить в file("что-то", "r"); - Тогда выходила ошибка, что второй аргумент слишком длинный. Чтобы избежать второго, указывать полный путь, а не относительный, как здесь Чтобы избежать третьего, - создавать файл лучше от того же пользователя, которым потом будем читать и не забывать натравливать на него chmod() Спасибо за советы, только я под виндой сидю. #9 Deep © 21.09.06 17:44:55 Сенькса Дрёма - буду ставить. |
|
#11 Таго Гваун © 21.09.06 16:50:25
Кстати как тады блокировать и стоит ли блкировать McSimm? |
|
> Файл точно пуст. ну так значит в этом и проблема. > Кстати как тады блокировать и стоит ли блкировать Для начала определись, для чего ты блокируешь. Тогда станет понятно, стоит ли, и как. > буду ставить |
|
#13 Таго Гваун © 21.09.06 21:07:18
#12 VictorT © 21.09.06 19:31:26 Для того, что бы два юзверя не могли записать одновременно в файл. что ставить? репорт ошибок, как посоветовал Дрёма. |
|
Код бредовый какой-то... 1. На кой хрен тебе понадобился fopen ?2. На кой хрен тебе понадобился flock, да еще и после file ? Функция file читает ВЕСЬ файл в массив - зачем блокировать ПОСЛЕ того, как ВЕСЬ файл прочитан в память ? Кроме того, тебе VictorT уже дважды сказал, что ты передаешь этой функции НЕ ТОТ параметр.3. Если файл пустой, то die вполне закономерен по уже сказанной McSimm'ом причине. Да и иначе код споткнется на 5 и 6-й строчке, т.к. пойдет обращение к несуществующим элементам массива. |
<offtop>
|
|
#16 McSimm © 22.09.06 09:20:32
Блокировать безусловно надо. Под виндой блокировать капельку труднее, т.к. flock() там иногда имеет скверную привычку фактически блокировать доступ к файлу, т.е. попытки открыть его приводят к ошибке. Не имея возможности потестировать не рискую советовать, т.к. под Windows не имею практического опыта. Общая схема должна быть такая, чтобы пока кто-то пишет никто не мог читать и писать , пока кто-то читает, никто не мог писать. Особенное внимание следует обратить на открытие файла с режимом 'w', тут PHP малость неудобен, т.к. с одной стороны не позволяет использовать flock() пока файл не открыт, с другой стороны, уничтожает все данные при открытии с режимом 'w' Следовательно при построении распределенного доступа к файлу про режим 'w' стоит забыть. Либо использовать в качестве флажка посторонний файл. |
|
#17 McSimm © 22.09.06 09:24:02
> а когда отладишь - закоментировать > > // error_reporting (E_ALL); Оффтоп: E_ALL - режим, который строго рекомендую включать всегда. Не надо прятать ошибки и нотайсы от себя, их надо прятать от пользователей, а для этого существуют другие механизмы, нежели error_reporting. |
|
> #17 McSimm © согласен |
|
#19 Таго Гваун © 22.09.06 18:49:59
#14 Физик © 22.09.06 00:06:42 Уже столкнулся. И как тогда предлагаешь решить эту фигню? У меня башка чугунная, уже файлы текстовые проклял на фиг. |
Написать ответ |
|
