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

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

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

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

Q&A

0回答

354閲覧

一度作成したフォルダをコピーしてそれの中身をかえてログイン画面を作成したい

maguro.sake

総合スコア2

PHP

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

0グッド

1クリップ

投稿2022/11/04 06:12

一度index.phpという名前でフォルダを作成しました。
index.php

<?php require_once(__DIR__ . '/../app/config.php'); use MyApp\Database; use MyApp\Todo; use MyApp\Utils; $pdo = Database::getInstance(); $todo = new Todo($pdo); $todo->processPost(); $todos = $todo->getAll(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>My Todos</title> <link rel="stylesheet" href="css/styles.css"> </head> <body> <main data-token="<?= Utils::h($_SESSION['token']); ?>"> <header> <h1>Todos</h1> <span class="purge">Purge</span> </header> <form> <input type="text" name="title" placeholder="Type new todo."> </form> <ul> <?php foreach ($todos as $todo): ?> <li data-id="<?= Utils::h($todo->id); ?>"> <input type="checkbox" <?= $todo->is_done ? 'checked' : ''; ?>> <span><?= Utils::h($todo->title); ?></span> <span class="delete">x</span><span><?= Utils::h($todo->createnow); ?></span> </li> <?php endforeach; ?> </ul> </main> <script src="js/main.js"></script> </body> </html>

これをそのままコピーして、題名をlogin.phpに変えて接続しようとしたのですが、404 Not Foundとなり接続できませんでした。
中身は同じはずなのにどうして接続できないのかを教えていただきたいです。
画像にもありますが、最初index.phpをlogin.phpがある場所に保存していました。
それを、入れ替えたらlogin.phpの方では接続ができなくなってしまいました。
念のために他のファイルのソースコードも載せておきます。
config.php

<?php session_start(); define('DSN', 'mysql:host=db;dbname=myapp;charset=utf8mb4'); define('DB_USER', 'myappuser'); define('DB_PASS', 'myapppass'); define('SITE_URL', 'http://' . $_SERVER['HTTP_HOST']); spl_autoload_register(function ($class) { $prefix = 'MyApp\\'; if (strpos($class, $prefix) === 0) { $fileName = sprintf(__DIR__ . '/%s.php', substr($class, strlen($prefix))); if (file_exists($fileName)) { require($fileName); } else { echo 'File not found: ' . $fileName; exit; } } });

Database.php

<?php namespace MyApp; class Database { private static $instance; public static function getInstance() { try { if (!isset(self::$instance)) { self::$instance = new \PDO( DSN, DB_USER, DB_PASS, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ, \PDO::ATTR_EMULATE_PREPARES => false, ] ); } return self::$instance; } catch (\PDOException $e) { echo $e->getMessage(); exit; } } }

Todo.php

<?php namespace MyApp; class Todo { private $pdo; public function __construct($pdo) { $this->pdo = $pdo; Token::create(); } public function processPost() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { Token::validate(); $action = filter_input(INPUT_GET, 'action'); switch ($action) { case 'add': $id = $this->add(); header('Content-Type: application/json'); echo json_encode(['id' => $id]); break; case 'toggle': $isDone = $this->toggle(); header('Content-Type: application/json'); echo json_encode(['is_done' => $isDone]); break; case 'delete': $this->delete(); break; case 'purge': $this->purge(); break; default: exit; } exit; } } private function add() { $title = trim(filter_input(INPUT_POST, 'title')); if ($title === '') { return; } $stmt = $this->pdo->prepare("INSERT INTO todos2 (title,createnow) VALUES (:title,CURRENT_TIME)"); $stmt->bindValue('title', $title, \PDO::PARAM_STR); $stmt->execute(); return (int) $this->pdo->lastInsertId(); } private function toggle() { $id = filter_input(INPUT_POST, 'id'); if (empty($id)) { return; } $stmt = $this->pdo->prepare("SELECT * FROM todos2 WHERE id = :id"); $stmt->bindValue('id', $id, \PDO::PARAM_INT); $stmt->execute(); $todo = $stmt->fetch(); if (empty($todo)) { header('HTTP', true, 404); exit; } $stmt = $this->pdo->prepare("UPDATE todos2 SET is_done = NOT is_done WHERE id = :id"); $stmt->bindValue('id', $id, \PDO::PARAM_INT); $stmt->execute(); return (boolean) !$todo->is_done; } private function delete() { $id = filter_input(INPUT_POST, 'id'); if (empty($id)) { return; } $stmt = $this->pdo->prepare("DELETE FROM todos2 WHERE id = :id"); $stmt->bindValue('id', $id, \PDO::PARAM_INT); $stmt->execute(); } private function purge() { $this->pdo->query("DELETE FROM todos2 WHERE is_done = 1"); } public function getAll() { $stmt = $this->pdo->query("SELECT * FROM todos2 ORDER BY id DESC"); $todos = $stmt->fetchAll(); return $todos; } }

イメージ説明

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

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

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

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

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

m.ts10806

2022/11/04 06:51

フォルダとファイルは正しく表現してください。 作られたのはどう考えても「ファイル」です。 あと、「接続」では分かりません。 ブラウザから実行したのなら「アクセス」としたほうが良いでしょう。 ところで、見た感じindex.phpとlogin.phpは同じ階層にはないようですが、 ドキュメントルートの設定(httpd.confなどapacheの設定ファイルに記載があるはず)はどうなっていて、 どういうURLでアクセスしようとしていますか? 404の意味は理解されていますか?
maguro.sake

2022/11/04 08:26

初心者のため言葉の使い方など把握していないのでそのあたりはご容赦下さい。 同じ階層にすると、login.phpが404 Not Foundとなってしまいます。 404の意味は調べたので知っています。
m.ts10806

2022/11/04 11:50

用語が正しく使えないと情報が正しく伝わらないので、そこは覚えましょう。 質問は編集できます。 私が依頼した事項を追記してください(確認方法が分からない情報があるのでしたら、まず調べたうえで、聞いてください)
maguro.sake

2022/11/11 04:02

それはわかっていますが、言われなくても覚えるつもりでいます。私が言っているのは正しく使えない云々よりもどう考えてもなど言わなくていい一言が多いのではないでしょうかということです。 こちらの伝えたい意図が伝わっていますか? そもそも色々調べた上でこの質問を載せています。何も調べずにただやみくもに聞いているわけではありません。 今後私の質問にはお応えいただかなくて結構です。 ありがとうございました。
m.ts10806

2022/11/11 15:32 編集

質問に書いてないことは赤の他人には伝わりません。 本当に何も調べず試さず丸投げする人との区別は赤の他人には不可能です。 解決したくないのならそのままで良いかと思いますが、解決せずに困るのは何よりも質問者さんではないでしょうか。 質問は編集できます。適宜追記してください。 PHPの質問は割かし回答率が高い印象ですが、1週間以上経ち、閲覧数も100を超えたのに誰も回答しないということは、正しく伝わってないからに他なりません(もしくは質問者のコメントを読み、面倒な印象を抱いたか) 丸投げに回答する人は少なからずいますが、そういう人ですら手を付けてないということは認識されたほうが良いです。 ※そもそも質問者の事情は赤の他人には知ったこっちゃないので、どんな事情であれ1週間も放置してる時点で「解決する気なし」とみられても仕方ないです。ようやくコメントがあったと思えば、対応されたわけではないですし、こちらの意図も伝わってないようなので (伝わりづらかったら申し訳ないですが、言及がないため「思い込みで突っ走ってる」と判断)以下、 もう少し直接的な表現で申し訳ないですが、お伝えさせていただきます。 ------- 「どう考えても」を引き合いに出すのでしたら、 書いた通りにしか動かないプログラミングにおいて、正しく用語を使えないのはどう考えても致命的です。 「雰囲気で伝わるだろ」「回答できるんだから当然分かるよね」という上から目線で投稿していませんか? 赤の他人故に、それが単なる誤用なのか、本当にそのつもりで書いているのか分からないのです。 この手のものに王道はなので、順序を間違えた人に順序をアドバイスするのも回答者のスタンスとしてはありだと思います。すぐ詰まるのが分かっているから。 それを「どう考えても言わなくていい一言が多い」と切り捨ててしまう時点で、 どう考えても得られたはずのアドバイスの機会を捨てているようにしか思えません。 ここで自身のスタンスに固執して相手と喧嘩をするのはどう考えてもあなたにとって損にしかなりません。 質問は編集できます。適宜追記してください。 今のスタンスを貫く限り、赤の他人からアドバイスを得られる機会はほぼないと言っていいです。 例えマルチポストしたとしても、直接的な回答を得て分かった気になるだけで、根本的な理解には至らず、 大きく後戻りをしてしまい「あのときこうしておけば」と後悔することになります。 そういう人は多いですよ。後悔する時点で辞めてしまう勿体ない人も多い。 根気は絶対必要ですが、例え学生や求職中など時間がたっぷりある人だとしても人生で使える時間は誰であれ等しく有限ですからね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問