phpに感動したので、初めてphpを触ってみたくなり、実験してみました。

# 先日、phpに救われたことがありました
CMS（a-blog cms）をアップデートするために、データベースをバックアップしたときのことです。
a-blog cmsの機能で、管理画面側からデータベースを抽出してバックアップを取得できるのですが（この機能ありがたいです）、何らかの問題に引っかかって、バックアップができない時がありました。
問題を解決するまでの時間もあまりなく、原因を突き止めるまでにも色々と問題を1つ1つ検証していたらどれくらい時間がかかるかも分からない＆データベースを直ぐ確認できる状況でもなく・・・。
そんな状態だったので、やや途方に暮れていたのですが、ネット上に、[phpファイルを置くだけでバックアップが取れる方法](https://kazumich.com/a-backup2021.html)が公開されてました。
これで無事にデータベースも（更に）アーカイブディレクトリのバックアップも取得でき、**つい数分前まで悩んでいたことが一瞬で解決したので、いたく感動しました**。
phpをもし自分でも触ることができたら、**これから何かピンチなとき、助かる時があるかな**？と思い、phpを触ってみたいなと思ったので、やってみることにします！:raised_hand:

## phpを勉強して何がしたいか？
サーバーサイドのことがあまり分からないので、Webサイトを運営していて、何かエラーが起きても、なんでエラーになってるのか、すぐに原因を特定できないのが、問題が起こる度に、もどかしいです。
なので、**エラーを拾ってくることができるphpがあれば、すごく便利**だな、と思います。
サーバーサイドの原因（権限とか、アップロード上限数、IP接続数の問題など）か、CMS側（コーディングの記述方法やバージョンの問題）の問題なのかの切り分けも、それが分かれば早く解決できるのかな？と思いました。
特に問題が起きたらスピード解決が求められるので、最初の問題の切り分けスピードは大切かなと認識しています。
ただ、上記がもしできたとしても、**レンタルサーバーなどサーバーの所有者が誰なのかによっては、取得する内容によって不正アクセスになってしまう危険性もあるのかも**・・・?（そもそもドメインを借りているだけの場合、サーバー側のログは、見ることはできないのかも？？）と思いました。
なので、今回は、**ルート直下のみのディレクトリやファイルの権限の状態を取得＆変更をするためのphpを作ってみよう**と思います。（権限変更も、手動だとすごく気を遣いますよね:sweat_smile:。）

## やってみたこと

[家の仮想サーバーに、a-blog cmsが入っている](https://qiita.com/nuon0414/items/063e39397e83eb746c33)ので、そこで、実験します:house:。

### 計画

#### 目的
* ブラウザ上で、ルート直下のみのディレクトリやファイルの権限の状態を取得＆変更をするためのphpファイルを作成する。

#### 参考
* https://gist.github.com/kazumich/0c5ce6ed4e8366628842541ee9101b56

出力画面の見え方は基本、既存のa-blog cmsのphpファイルを参考に。

#### 手順
- まず、ブラウザに出力させる画面を考えてみる
    - phpファイルにアクセスしたときの静的なデザインをどうするか。
        - 基本的には、/themes/system/css/acms-admin.min.css　を読み込む。
    - 動的なデザインをどうするか考える。
        - 権限を変更する場合、「本当にhogeのパーミッションを変更しますか？」みたいなモーダルを出力させたい。なので、JavaScriptを使うかを検討する
- 実際にphpを考える。
    - 自力では難しいので、php部分はAIに協力してもらう。
        - 指示内容「ブラウザ上で、ルート直下のみのディレクトリやファイルの権限の状態を取得＆変更をするためのphpファイルを作成しようと思っています。」という感じ。
    - JavaScriptもAIに考えてもらう。
        - 指示内容「パーミッション変更の「変更」を押したとき、JavaScriptを使って、モーダルウィンドウを出したい。JavaScriptは、ルート直下に置いて読み込ませたい。」

#### 結果
できました:v:！！！！！
phpファイルと、JavaScriptは、AIが考えてくれたもので、ほぼほぼ修正することなくできました。
修正したのは、
* 最初にAIに提案してもらったコードでは、列に、「所有者」と「所有グループ名」が無かったので、その2列を追加してもらったこと。（「所有者」と「所有グループ名」が分かれば、権限変更でエラーが出た際、問題解決の糸口になりうると思い、追加をしました）
* JavaScriptのモーダルは、phpファイルを作成してもらうのとは別で依頼をしたこと。（JavaScriptは、phpファイルが完成してから、あとで追加しました。別指示の方が、AIから適切な回答がもらえるかな？と思いました）

普段、AIに色んな事を話しかけているので、色々学習してくれているのも、実現できた1つの要因かなと思いました。技術的にも普段から相談しておけば、こちらの意図を素早く理解して、適切な回答をくれる、良き相棒だな・・・としみじみ実感しています。

▼最終的にできた実際の画面はコチラ
![追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/917ff5c2-2b05-4c82-9db6-dcedc0b0b0bc.png)

↑のconfig.server.phpの権限を644→666にしてみます。

▼最初は644です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/166896ed-4bf1-4524-a8c4-2fce3eaf8f70.png)


▼666に書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/d90b3d10-76c2-4431-9421-67ff4cc214fd.png)

▼「変更」を押します。すると・・・モーダルウィンドウが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/0417c86b-6ef6-4fb1-867b-ea0516cdaec6.png)

▼「OK」を押すと・・・「変更成功」がでました。
![追加4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/bff4ae6c-0cfa-49e5-b2db-1e4d4e6c8230.png)


PHPコードは、公開はしてません。
JavaScriptは以下でモーダルウィンドウを出せるようにしました。

▼最終的なJavaScriptのコード
```
document.addEventListener("DOMContentLoaded", function () {
  const forms = document.querySelectorAll("form");

  forms.forEach(form => {
	form.addEventListener("submit", function (e) {
	  const filename = form.querySelector('input[name="filename"]')?.value || "このファイル";
	  const permission = form.querySelector('input[name="permission"]')?.value || "";

	  const confirmed = confirm(`${filename} のパーミッションを ${permission} に変更しますか？`);

	  if (!confirmed) {
		e.preventDefault(); // 送信をキャンセル
	  }
	});
  });
});
```

## あとがき
やりたいことは、実現できました。が、実際に運用している本番環境で使ったことはないので、そこは今後検証したいな〜と思っています。今回は実験的にこういった権限の変更可能かを検証しましたが、本番で運用する場合、注意が必要だな・・・と思います。便利にしようとするのに比例して、危険度は高まるんだな・・・と思った実験でした。
あと今回実際にやってみて、今後は、デザイン面、モーダルの出方など、その辺りの見え方を変えてみたいな、と思っています。

**続きを書きました▼**

https://qiita.com/a_kawasaki/items/7110c9400765509f9d04