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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

373閲覧

PHP データベースで動くプログラムを作成したい

garchomp.

総合スコア3

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/11/09 08:46

前提・実現したいこと

データベースを使った掲示板を作っています
編集判断用フォーム$karaがからの場合通常投稿でid 名前 コメント 時間を表示
削除フォームに該当id パスワード入力で削除
編集フォームに該当id パスワード入力で投稿フォームおよび編集判断用フォーム$karaにidを表示、文字を入力しなおし投稿するとidが該当する1文の名前、コメント差し替え(編集)という動きをしたいです

発生している問題・エラーメッセージ

名前、コメントのみを表示、削除、編集するコードを書いたら成功したのですが、時間とパスワード機能を付けたら通常投稿もできなくなってしまいました

### 該当のソースコード <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>51</title> </head> <body> <?php //データベースへの接続 $dsn = 'mysql:dbname=******;host=localhost'; $user = '**-******'; $password = '*******'; $pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); //テーブル作成 $sql = "CREATE TABLE IF NOT EXISTS AAA" ." (" . "id INT AUTO_INCREMENT PRIMARY KEY," . "name char(32)" . "comment TEXT" . "date DATE" . "password TEXT" .");"; $stmt = $pdo->query($sql); //データ挿入 $sql = $pdo -> prepare("INSERT INTO AAA (name, comment, date, pass) VALUES (:name, :comment :date, :pass,)"); $sql -> bindParam(':name', $name, PDO::PARAM_STR); $sql -> bindParam(':comment', $comment, PDO::PARAM_STR); $sql -> bindParam(':date', $comment, PDO::PARAM_STR); $sql -> bindParam(':password', $comment, PDO::PARAM_STR); //name comment passが埋まっていて、編集判断用の$karaが空いていたら if (!empty($_POST['name']) && (!empty($_POST['comment']))&& (!empty($_POST['pass']))&& (empty($_POST['kara']))){ $name = ($_POST["name"]); $comment = ($_POST["comment"]); $pass = ($_POST["pass"]); $date = date("Y/m/d H:i:s"); $sql -> execute(); } //削除機能 if((!empty($_POST['delete'])) && (!empty($_POST['dpass']))){//deleteフォームが埋まっていたら $id = ($_POST["delete"]); $dpass = ($_POST["dpass"]); $sql = 'SELECT * FROM AAA WHERE id=:id '; //idが一致する行を抜き出し $stmt = $pdo->prepare($sql); // ←差し替えるパラメータを含めて記述したSQLを準備し、 $stmt->bindParam(':id', $id, PDO::PARAM_INT); // ←その差し替えるパラメータの値を指定してから、 $stmt->execute(); // ←SQLを実行する。 $results = $stmt->fetchAll(); foreach ($results as $row){ if($row['id'] == $id && $row['pass'] ==$dpass ){ //idが一致する行のidとpassが削除フォームと一致したら $sql = 'delete from AAA where id=:id'; $stmt = $pdo->prepare($sql); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); } } } //編集準備 if(!empty($_POST['edit'])&&(!empty($_POST['edipass']))){ //編集フォームが埋まっていたら $id = ($_POST["edit"]); $edipass = ($_POST["edipass"]); $sql = 'SELECT * FROM AAA WHERE id=:id'; //idが一致する行を抜き出し $stmt = $pdo->prepare($sql); // ←差し替えるパラメータを含めて記述したSQLを準備し、 $stmt->bindParam(':id', $id, PDO::PARAM_INT); // ←その差し替えるパラメータの値を指定してから、 $stmt->execute(); // ←SQLを実行する。 $results = $stmt->fetchAll(); foreach ($results as $row2){ //編集 if(!empty($_POST['kara'])){ //編集判断フォームが埋まっていたら $id = ($_POST["kara"]); if($row2['id'] == $id && $row2['pass'] ==$edipass){ //idが一致する行のidとpassが編集フォームと一致したら $name = ($_POST["name"]); $comment = ($_POST["comment"]); $sql = 'UPDATE AAA SET name=:name,comment=:comment WHERE id=:id'; $stmt = $pdo->prepare($sql); $stmt->bindParam(':name', $name, PDO::PARAM_STR); $stmt->bindParam(':comment', $comment, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); } } } } //表示 $sql = 'SELECT * FROM AAA'; $stmt = $pdo->query($sql); $results = $stmt->fetchAll(); foreach ($results as $row3){ //$rowの中にはテーブルのカラム名が入る echo $row3['id'].','; echo $row3['name'].','; echo $row3['comment'].','; echo $row3['date'].','; echo "<hr>"; } ?> <!--変数をvalueに入れて投稿フォーム記述--> <form action="" method="post"> <input type="text" name="name" placeholder="名前" value="<?php echo $row2['name'];?>"></br> <input type="text" name="comment" placeholder="コメント" value="<?php echo $row2['comment'];?>"></br> <input type="text" name="pass" placeholder="パスワード"> <input type="submit" name="" value="投稿"></br> <!--編集判断材料text あとで隠す--> <input type="text" name="kara" value="<?php echo $row2['id'];?>"> </form></br> <!-- 削除フォームと編集フォーム--> <form action="" method="post"> <input type="text" name="delete" placeholder="削除対象番号"></br> <input type="text" name="dpass" placeholder="パスワード"> <input type="submit" name="" value="削除"></br> </form></br> <form action="" method="post"> <input type="text" name="edit" placeholder="編集対象番号"></br> <input type="text" name="epass" placeholder="パスワード"> <input type="submit" name="" value="編集"></br> </form></br> </body> </html>

試したこと

一度名前コメントのみを表示した場合はうまくいったので時間かパスワード機能が問題かと思いif文を中心に間違いを探したのですがうまくいかなくて困っています
このコードを見ておかしく感じた点をどんどん教えていただきたいです

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

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

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

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

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

guest

回答2

0

動かなくなった直接の原因

ぱっと見て気づいた範囲です。全ての確認はしていません。

//テーブル作成 $sql = "CREATE TABLE IF NOT EXISTS AAA" ." (" . "id INT AUTO_INCREMENT PRIMARY KEY," . "name char(32)" . "comment TEXT" . "date DATE" . "password TEXT" .");"; $stmt = $pdo->query($sql); //データ挿入 $sql = $pdo -> prepare("INSERT INTO AAA (name, comment, date, pass) VALUES (:name, :comment :date, :pass,)");
  • AAAテーブルを作成する時に password カラムを作っているのに、INSERTしようとしているのが pass カラムのようです。

→表記を統一しましょう。

・AAAテーブルに date というカラムを作ろうとされていますが、 date は予約語です。
https://dev.mysql.com/doc/refman/5.6/ja/reserved-words.html
→カラム名を created_date 等に変更するか、INSERT文(他)で使う時にバッククォートで囲いましょう

INSERT INTO AAA (name, comment, date, ↓ INSERT INTO AAA (name, comment, `date`,
  • 念のため……。後から追加したカラム(passwordとdate)、AAAテーブルに追加しましたか?

→プログラム中のクエリは「CREATE TABLE IF NOT EXISTS AAA(なかったらテーブル作成)」なので、1回作ったら終わりです。
カラムを追加する場合、別のクエリを作る必要があります。
https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%AE%E8%BF%BD%E5%8A%A0

その他気になったこと

  • 画面にアクセスする度に「CREATE TABLE」を実行するのはよくありません(IF NOT EXISTSが書いてあるので、実際にはテーブルを作成しないとはいえ、毎回無駄なCREATE文が発行される)。

→テーブル作成は別の処理に切り出しましょう。
意図があってプログラム中にテーブル作成処理を書いているのでなければ、プログラムから削除→phpMyAdmin等で実行しても良いです。

  • (お勉強用であれば、現時点ではOKですが)パスワードは平文(=入力された文字列そのまま)で保存しないほうが良いです。

https://manabiact.com/php-webapp-password/

  • 「動かなくなりました」だけだと、漠然としすぎていて若干回答しづらいです。

「どういうエラーメッセージ/エラーログがでているのか」がわかると、回答がしやすくなりますし、もしかしたら、質問するまでもなく、ご自身で解決できるかもしれません。
https://www.sejuku.net/blog/24522
辺りを参考に、「エラー情報を表示/出力」できるようになると良いと思います。
で、表示されたエラーメッセージ/エラーログの文言でネット検索する習慣をつけるのがおススメです。
それで解決できればOKですし、解決できなくても、「こんなエラーが出てまして……」と質問していただければ、わかる人が「あ、そのエラーは……」と回答しやすくなります。

投稿2020/11/09 10:05

編集2020/11/10 03:38
nak

総合スコア696

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

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

garchomp.

2020/11/09 12:35

回答に様々な指摘、ありがとうございます! まずは表記の統一とdateの修正から始めたいと思います まだクエリなどの単語の意味を正確には把握もできていないので1度ひとつ1つ調べてみようと思います 今回の上手くいっていない点について たしかにかなり漠然としていますよね、申し訳ないです 一応実行した際にエラーは出ていませんが、フォーム表記の上にID 名前 コメントを表示するプログラムは上手くいったが パスワードと時間を追加した結果名前コメントすら表示できなくなったという意味になります アドバイスを元に1度全体的に見直していこうと思います もしまた質問した際はよろしければ回答お願い致します。
guest

0

ざっとしか見てませんが、コピペで作ってませんか?
すでに指摘が入っていますが、設計が破綻しています。
自身のコードがどのような動きになっているのか理解するところから始めるのが良いです。
いわゆるデバッグ環境を整えるところから始めて、ステップ実行できるようになると、コードの挙動が追いやすくなります。

投稿2020/11/10 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問