質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2079閲覧

file_put_contentsで、ファイルを新規作成したい

MakotoIshizawa

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/12 07:08

編集2019/07/12 07:30

前提・実現したいこと

file_put_contentsで、ファイルを新規作成し書き込みを試しています。

コードは
$filename = chmod("test2.txt", 0777);
file_put_contents($filename, "テキストを作成し保存します。");

エラーは
Warning: chmod() [function.chmod]: No such file or directory in パス

色々なページで調べたところ、ファイルが存在しない場合は自動で新規作成してくれるということでいたが
いくら試してもできません。
何がいけないのどしょうか?

参考にしたサイト
https://www.flatflag.nir87.com/touch-829

ffftpの設定でパーミッションは777にしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ファイルを作成する前にchmodすることはできません。umaskで調整するか、ファイル作成後にchmodしてください。

投稿2019/07/12 07:11

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakotoIshizawa

2019/07/12 07:19

返答ありがとうございます。 そうなんですね。ファイルが先に無ければ使えないわけですね。
guest

0

chmodの戻り値はboolです。
1行目実行後、$filenameに入っているものはtruefalseではないでしょうか。

投稿2019/07/12 07:12

karenDevice

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakotoIshizawa

2019/07/12 07:17

すみません、まだ初心者で返答いただいた文章が理解できないレベルです。 頑張って精進します。
karenDevice

2019/07/12 07:31 編集

$filename = chmod("test2.txt", 0777); file_put_contents($filename, "テキストを作成し保存します。"); 1行目でいきなり`test2.txt`の権限を`0777`に変更しようとしていますが、chmodに存在しないファイルを作成する機能はありません。さらに、chmodから戻される値が`$filename`に入りますのでこの中身は`true`か`false`となります。PHPのchmodのマニュアルを見てください。説明のところに、「成功した場合に TRUE を、失敗した場合に FALSE を返します。」とあります。 2行目でファイル名が`$filename`の中身が`テキストを作成し保存します。`というファイルで保存しようとしていますが、$filenameのこの時の値は`true`か`false`ですので、PHPであれば同じフォルダー(ディレクトリー)にtrueという名前かfalseという名前のファイルができていないでしょうか。 PHPのchmodのマニュアル: https://www.php.net/manual/ja/function.chmod.php
MakotoIshizawa

2019/07/12 07:33

それもできていないんです。 一行目がない状態で、何故かfile_put_contentsでファイル作成がされなくて、参考サイトを見て一行目を足してみたんです。
karenDevice

2019/07/12 07:43 編集

mts10806さんとのやり取りのなかで、「file_put_contents(test2.txt) [function.file-put-contents]: failed to open stream: Permission denied in~」というメッセージが出ているそうなので、test2.txtがおかれるフォルダー(ディレクトリー)に書き込み用の権限がなさそうですね。 あと逆なら file_put_contents("test2.txt", "テキストを作成し保存します。"); chmod("test2.txt", "0777"); では?
guest

0

ベストアンサー

chmod()は既に存在するファイルやディレクトリに権限をあたるものなので、
まだファイルを作っていない段階で実行しようとすると提示のエラーになります。
先にfile_put_contents()でファイルを作成してください。

ファイルが存在しない場合は自動で新規作成してくれるということ

それはfile_put_contents()の仕様です。

filename が存在しない場合はファイルを作成します。 存在する場合はそのファイルを上書きします。ただし FILE_APPEND フラグが設定されている場合は別です。

エラーはその内容の通りchmod()に対して起きています。

投稿2019/07/12 07:11

編集2019/07/12 07:17
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakotoIshizawa

2019/07/12 07:20

返答ありがとうございます。 chmodを使わずにやってみます。
m.ts10806

2019/07/12 07:21

そういう意味ではないですよ。 順序が逆という指摘です。
MakotoIshizawa

2019/07/12 07:28

順序を逆にし、 file_put_contents("test2.txt", "テキストを作成し保存します。"); chmod("test.txt",0777) としてみましたが、最初の一行に対して file_put_contents(test2.txt) [function.file-put-contents]: failed to open stream: Permission denied inパス のようなエラーが出てしまいます。 何故かfile_put_contentsで作成がされません。 ffftpの設定でパーミッションを777にしてみました。
m.ts10806

2019/07/12 07:30

となると、その上位のディレクトリ自体のパーミッションが書き込み不可になってたりしませんか?
MakotoIshizawa

2019/07/12 07:43

それです! ありがとうございます。盲点でした。 結構単純なミスでした。
m.ts10806

2019/07/12 07:45

解決されたようで何よりです。
guest

0

chmod

chmod() にファイルが存在しない場合は自動で新規作成という処理はなかったと思います。

投稿2019/07/12 07:12

編集2019/07/12 07:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakotoIshizawa

2019/07/12 07:18

返答ありがとうございます。 chmodの使い方が間違ってるんですね。
退会済みユーザー

退会済みユーザー

2019/07/12 07:26

マニュアル上「自動で新規作成しない」という記述がなかったので検証しましたが、やはり新規作成はしないですね。 質問のとおり chmod() の行で Warning 吐き、動作はスキップされました。
MakotoIshizawa

2019/07/12 07:41

chmodなくしてみましたが、今度は file_put_contents(test2.txt) [function.file-put-contents]: failed to open stream: Permission denied inパス と来ました。 パーミッションは777なんですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問