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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

3413閲覧

MY SQL掲示板 投稿日時を表示させたい

allfree

総合スコア3

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/08/24 12:28

編集2020/08/24 12:35

現在、データベースを用いた掲示板を作成しています。
最終的な目標は投稿・削除・編集・パス機能を備えた掲示板を作成する事です。

ようやく、色々と試行錯誤を重ねたところ、投稿・削除・編集・パス機能を実装することができました。
しかし、投稿日時が表示されません。$dateを用いて、行うおうとしています(そもそもこれが間違ってるのかもしれませんが)。

また、投稿日時を行なおうとすると、新規投稿と編集ができなくなってしまうと言う状態に陥ってしまいます(削除・パス機能は働きます)。

逆に投稿日時の実装を行うコードを消すと、新規投稿と編集ができるようになります。

どなたか、この問題を解決できる方はいらっしゃるでしょうか?正直、色々と調べて試しても、変化はありませんでした。
現在のコードは下記の通りなのですが、どうにか新規投稿と編集もでき、かつ投稿日時が表示されるようにする方法、もしくは他のコードの書き方などを具体的なコードを用いて、教えて頂けると助かります。

PHP

1<html> 2<head> 3<title>keiziban</title> 4<meta charset= "utf-8"> 5</head> 6 7<body> 8 9 <?php 10 11 //データベースに接続 12 $dsn=';host=ホスト名'; 13 $user='ユーザー名'; 14 $password='パスワード'; 15 $pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); 16 17 18 //テーブルの作成 19 $sql = "CREATE TABLE IF NOT EXISTS tech_text" 20 ."(" 21 ."id INT AUTO_INCREMENT PRIMARY KEY," 22 ."name char(32)," 23 ."comment TEXT," 24 ."date char(32)" 25 ."pass char(32)," 26 .");"; 27 $stmt = $pdo->query($sql); 28 29 30 31 //編集選択機能 32if(!empty($_POST["editNo"]) && !empty($_POST["editpass"])){ 33 $id = $_POST["editNo"]; 34 $editpass = $_POST["editpass"]; 35 $sql = 'SELECT * FROM tech_text'; 36 $stmt = $pdo->query($sql); 37 $results = $stmt->fetchAll(); 38 39 foreach ($results as $row){ 40 if($row['id'] == $id){ 41 $ename = $row['name']; 42 $ecomment = $row['comment']; 43 $pass = $row['pass']; 44 $editnumber = $row['id']; 45 } 46 } 47} 48 49?> 50 51 52 53<form method = "POST" action = keiziban.php> 54<input type = "text" name = "name" value = "<?php if(!empty($pass)){echo $ename;}?>" placeholder = "<?php if(empty($pass)){echo "名前";}?>"> 55<input type = "text" name = "comment" value = "<?php if(!empty($pass)){echo $ecomment;}?>" placeholder = "<?php if(empty($pass)){echo "コメント";}?>"> 56<input id="pass" type = "text" name = "password" value ="<?php if(!empty($pass)){echo $pass;}?>" placeholder = "<?php if(empty($pass)){echo "パスワード";}?>"> 57<input type = "hidden" name = "edit-number" value = "<?php if(!empty($pass)){echo $editnumber;}?>" > 58<input type = "submit" name = "btn"value = "送信"><br> 59 60<input type = "text" name = "deleteNo" placeholder = "削除対象番号" placeholder="編集番号を入力してください"> 61<input id="pass" type = "text" name = "delpass" placeholder = "パスワード"> 62<input type = "submit" name = "delete" value = "削除"><br> 63 64<input type = "text" name = "editNo" placeholder = "編集対象番号" placeholder="編集番号を入力してください"> 65<input id="pass" type = "text" name = "editpass" placeholder = "パスワード"> 66<input type = "submit" name = "edit" value = "編集"><br> 67 68 69 70 71<?php 72 73 74 //編集実行機能 75if(!empty($_POST["edit-number"]) && !empty($_POST["editNo"])){ 76 $id = $_POST["edit-number"]; //ここで編集対象番号の値の受け取りを行う 77 $name = $_POST["name"]; 78 $comment = $_POST["comment"]; 79 $password = $_POST["password"]; 80 $date = date("Y年m月d日 H時i分s秒"); 81 $sql = 'update tech_text set name=:name,comment=:comment,pass=:pass,date=date where id=:id'; 82 $stmt = $pdo->prepare($sql); 83 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 84 $stmt->bindParam(':comment', $comment, PDO::PARAM_STR); 85 $stmt->bindParam(':pass', $password, PDO::PARAM_STR); 86 $stmt->bindParam(':date', $date, PDO::PARAM_STR); 87 $stmt->bindParam(':id', $id, PDO::PARAM_INT); 88 $stmt->execute(); 89 90} 91 92 93 94 //新規投稿 95if(!empty($_POST["name"]) && !empty($_POST["comment"]) and !empty($_POST["password"]) and empty($_POST["edit-number"])){ 96 $name = $_POST["name"]; 97 $comment = $_POST["comment"]; 98 $password = $_POST["password"]; 99 $date = date("Y年m月d日 H時i分s秒"); 100 $sql = $pdo -> prepare("INSERT INTO tech_text (name, comment, pass,date) VALUES(:name, :comment, :pass,:date)"); 101 $sql -> bindParam(':name', $name, PDO::PARAM_STR); 102 $sql -> bindParam(':comment', $comment, PDO::PARAM_STR); 103 $sql -> bindParam(':pass', $password, PDO::PARAM_STR); 104 $sql -> execute(); //実行する 105} 106 107 108 109 // 削除機能 110 if(!empty($_POST['deleteNo']) && !empty($_POST['delpass'])){ 111 $delete=$_POST['deleteNo']; 112 $delpassword=$_POST['delpass'] ; 113 $sql = 'delete from tech_text where id=:id'; 114 $stmt = $pdo->prepare($sql); 115 $stmt->bindParam(':id', $delete, PDO::PARAM_INT); 116 $stmt->execute(); 117 } 118 119 120 //表示機能 121 122 $sql = 'SELECT * FROM tech_text'; 123 $stmt = $pdo->query($sql); 124 $results = $stmt->fetchAll(); 125 126 foreach ($results as $row){ 127 //配列の中で使うのはテーブルのカラム名の物 128 echo $row['id'].','; 129 echo $row['name'].','; 130 echo $row['comment'].','; 131 echo $row['date'].','; 132 echo "<hr>"; 133 } 134 135 136 137?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

MySQLですよね、
dateってSQL予約語にすでに存在するのをそのまま使うと
何らかのエラーになるかと思います。

予約語は、引用符で囲まれている場合、識別子として許可されます。とのことなので、
改善してみてください。

すべてを直すのは質問者さんにやってもらうとして、一例を挙げるとこうなるかと。(いささかくどいけど。)

php

1 //テーブルの作成 2 $sql = <<<EOT 3CREATE TABLE IF NOT EXISTS `tech_text` 4( 5 `id` INT AUTO_INCREMENT PRIMARY KEY, 6 `name` char(32), 7 `comment` TEXT, 8 `date` char(32), 9 `pass` char(32), 10); 11EOT;

みたいに。元の文だと、date定義の行に区切りの「,」が不足していました。
あと、見辛いので、ヒアドキュメント構文を使いました。
(見辛いと、タイプミスや文法ミスに気づきにくくなります。)

あと、char(32)で文字列用の定義にしているようですが、
32バイトに満たない箇所が空白を詰められちゃうと思うのですが。
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.4.1 CHAR および VARCHAR 型

CHAR 値は格納されると、指定された長さになるように右側がスペースで埋められます。

この場合はVARCHAR(32)かもしれませんが、文字エンコーディングをUTF-8(utf8mb4)を使うなら
1文字の記録に最大4バイトを使う可能性があることを考慮して
サイズが適切かどうかを再検討していただきたく。

また、dateにCHAR(32)ですか、
投稿日時の記録用にTIMESTAMP型を使ってみませんか。
一つのデータで日付と時刻をセットで保持します。
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型

投稿2020/08/24 13:01

編集2020/08/24 13:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

allfree

2020/08/25 14:03

m6u様 前回の回答に引き続き、ありがとうございました! それと返信が遅れてしまい、申し訳ありません。 実は、他の方にも聞いていたのですが、やはりtimestamp型を使えば?等のアドバイスを頂いたところで、これで何とか解決できそうです。 ありがとうございました、また何かの縁があればよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問