2011-02-07 5 views
63

Я пытаюсь написать запрос к файлу для отладки. Файл находится в database/execute.php. Файл, который я хочу написать, - database/queries.php.file_put_contents запрещен

Я пытаюсь использовать file_put_contents('queries.txt', $query)

Но я получаю

file_put_contents (queries.txt) [function.file-пут-содержание]: не удалось открыть поток: введенное отклоненных

У меня есть файл queries.txt chmod'd to 777, что может быть проблема?

+0

Вы просмотрели файл 'php.ini' за все, что может лишить доступа к файлу? – Hello71

+2

также убедитесь, что каталог chmod'd справа –

+0

также попробуйте использовать абсолютное имя файла. Может быть, ваша интерпретация текущей папки отличается от PHP – laher

ответ

58

Попробуйте настроить права доступа к каталогу.

из терминала, запустите chmod 777 database (из каталога, содержащего папку базы данных)

апач, и никто не будет иметь доступ к этому каталогу, если он правильно chmodd'ed.

Другое, что нужно сделать, это echo "getcwd()". Это покажет вам текущий каталог, и если это не «/something.../database/», вам нужно будет изменить «query.txt» на полный путь для вашего сервера.

+77

Не является ли угрозой безопасности 777? – hitautodestruct

+9

Я сильно подозреваю, что директория цели должна быть записана только с учетной записью сервера, но каждый родительский каталог целевого каталога должен позволять учетной записи сервера входить в нее; Я думаю, что это будет + x для разрешений. – Erhannis

+1

Я экспериментировал с теориями Erhannis на новом стеке LAMP, и теория правильная. – thotheolh

-10

Кроме того, как указано в file_put_contents man page в php.net, остерегайтесь проблем с именами.

file_put_contents($dir."/file.txt", "hello"); 

может не работать (даже если он правильно на синтаксис), но

file_put_contents("$dir/file.txt", "hello"); 

работы. Я испытал это на разных установленных серверах php.

+17

Неправильное использование. '$ dir."/file.txt "' функционально эквивалентен '' $ dir/file.txt ''во всех случаях, если' $ dir' является строкой. Более того, это поведение не документировано на php.net, как утверждает Киванк. – mattbasta

1

Для тех, кто с помощью Ubuntu и получающего эту ошибку при загрузке страницы локально, но не на веб-хостинга,

Я просто установил это, открыв наутилуса (sudo nautilus) и щелкните правой кнопкой мыши на файл, который вы пытаясь открыть, нажмите «Свойства»> «Настройки»> и дайте прочитать запись «всем остальным»

7

Поймите, что сейчас это довольно старый, но нет необходимости вручную записывать запросы в такой файл. У MySQL есть встроенная поддержка ведения журнала, вам просто нужно включить ее в среду разработки.

Посмотрите на документации для «общего журнала запросов»:

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

3

Ребят я имел эту проблему в течение 1 месяца и сделал все, но не могли это исправить, но теперь я знаю, решение.

Я использую общий хостинг linux, когда мой администратор изменил php на 5.3. У меня появилось много ошибок для кода «file_put_contents». попытаться проверить мой план:

В хосте создать файл как mytest.php, и поместить этот код и сохранить:

<?php  mail('Your-EMail','Email-Title','Email-Message');  ?> 

Откройте URL «WWW.your-domain.com/mytest.php ", а затем проверьте электронную почту. У вас должно быть письмо от вашего хоста с информацией, введенной вами в mytest.php, проверьте имя отправителя, если оно от Никто у вас есть проблема о «Permission Denied», потому что что-то не определено, и если имя отправителя похоже на мой id: [email protected] у вас нет проблемы.

Мой администратор изменил сервер и снова установил хост. Я думаю, и проблема удалось решить, сообщите администрации хозяина, что я сказал вам, и, возможно, они найдут ответ.

надеюсь, что это поможет вам!

+0

Я полностью потерян !! Что ты пытаешься сказать? Если вы говорите, что пользователь Apache не смог получить имя хоста на сервере (общий или любой другой), то настало время пересмотреть свой выбор службы хостинга. – Fr0zenFyr

-3

Здесь решение. Чтобы скопировать img из URL. этот URL: http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg'); 

создать желаемый путь закончить имя с .jpg

$file_destino_path="imagenes/my_image.jpg"; 

file_put_contents($file_destino_path, $image_Url) 
+0

Как это решить проблему? – Fr0zenFyr

3

Я знаю, что это очень старый вопрос, но я хотел бы добавить хорошее решение с некоторыми в глубину объяснение. Вам нужно будет выполнить два утверждения по подобным системам Ubuntu, а затем он работает как шарм.

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

Предполагается, что веб-сервер будет выполнен с идентификатором, который является членом группы. Веб-сервер никогда не должен запускаться с тем же идентификатором, что и владелец файлов и каталогов. В Ubuntu работает apache под ID-данными id. Этот идентификатор должен быть членом группы, для которой указаны разрешения.

Чтобы дать директорию, в которой вы хотите изменить содержание файлов необходимые права, выполнить инструкцию:

find %DIR% -type d -exec chmod 770 {} \; 

.Это означало бы, в вопросе о О.П., что разрешения для каталога% ROOT%/database следует соответствующим образом изменить. Поэтому важно не иметь файлы внутри этого каталога, которые никогда не должны меняться или удаляться. Именно поэтому рекомендуется создать отдельный каталог для файлов, содержимое которых необходимо изменить.

Чтение разрешений (4) для каталога означает возможность собирать все файлы и каталоги с их метаданными в каталоге. Разрешение записи (2) дает разрешение на изменение содержимого каталога. Это означает, что вы добавляете и удаляете файлы, меняете разрешения и т. Д. Разрешение на выполнение (1) означает, что вы имеете право перейти в этот каталог. Без последнего невозможно глубже войти в каталог. Веб-серверу необходимы права на чтение, запись и выполнение при изменении содержимого файла. Therefor нуждается в группе цифру 7.

Второе утверждение в вопросе о OP:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \; 

Будучи в состоянии прочитать и написать документ не требуется, но это не требуется для выполнения файла , 7 предоставляется владельцу файлов, а 6 - группе. Веб-серверу не нужно иметь разрешение на выполнение файла, чтобы изменить его содержимое. Эти права на запись должны указываться только в файлах в этом каталоге.

Все остальные пользователи не должны получать никаких разрешений.

Для каталогов, не требующих изменения его файлов, требуется групповое разрешение 5. Документация о разрешениях и некоторые примеры:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/

-2

Там 2 способа решить эту проблему вопросы
1. использование chmod 777 path-to-your-directory.
если он не работает, то
2. просто укажите полный путь к файлу query.txt.

+1

Это ужасно небезопасная и крайне плохая практика. Также трудно обнаружить и исправить при разработке пользовательских приложений, и их можно легко упустить. Пожалуйста, на самом деле выясните правильные разрешения. – ftrotter

6

Другой вариант

является то, что вы можете сделать Apache (www-data), владелец папки

sudo chown -R www-data:www-data /var/www 

, который должен сделать file_put_contents работу в настоящее время. Но для большей безопасности лучше устанавливать права доступа, как показано ниже

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder 
find /var/www -type f -print0 | xargs -0 chmod 0644 # files 
  • изменения /var/www в корневой папке вашего PHP файлов
1

Собрав информацию по этой ссылке stackoverflow-image save doesn't work with chmod 777 и от пользователей azerafati и Люком Бергмана

, если вы должны были смотреть под/и т.д./Apache/envvars файл, вы увидите что-то вроде:

export APACHE_RUN_USER=www-data 
export APACHE_RUN_GROUP=www-data 

Apache запускается под именем «WWW-данные»

«0755» означает, что владелец файла может читать/запись/выполнение, но группа и другие пользователи не могут писать. поэтому в терминале ur, cd в папку, содержащую вашу папку «images». затем введите:

find images -type d -exec chmod 0755 {} \; 
find images -type f -exec chmod 0755 {} \; 
sudo chown -R www-data:www-data images 

необходимо сменить пермиссию первым, прежде чем сменить владельца. введите свой пароль при появлении запроса. это сделает владелец www-data в папке с изображениями.

Ваша загрузка должна теперь работать.

Смежные вопросы