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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,232

score 3

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

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

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

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

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

<html>
<head>
<title>keiziban</title>
<meta charset= "utf-8">
</head>

<body>

 <?php

       //データベースに接続   
    $dsn=';host=ホスト名';
    $user='ユーザー名';
    $password='パスワード';
    $pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); 


      //テーブルの作成
    $sql = "CREATE TABLE IF NOT EXISTS tech_text"
    ."("
    ."id INT AUTO_INCREMENT PRIMARY KEY,"
    ."name char(32),"
    ."comment TEXT,"
    ."date char(32)"
    ."pass char(32),"
    .");";
    $stmt = $pdo->query($sql);



      //編集選択機能
if(!empty($_POST["editNo"]) && !empty($_POST["editpass"])){
    $id = $_POST["editNo"];
    $editpass = $_POST["editpass"];
    $sql = 'SELECT * FROM tech_text';
    $stmt = $pdo->query($sql);
    $results = $stmt->fetchAll();

    foreach ($results as $row){
        if($row['id'] == $id){
        $ename = $row['name'];
        $ecomment = $row['comment'];
        $pass = $row['pass'];
        $editnumber = $row['id'];     
        }
    }
}

?>  



<form method = "POST" action = keiziban.php>
<input type = "text"  name = "name"  value = "<?php if(!empty($pass)){echo $ename;}?>"  placeholder = "<?php if(empty($pass)){echo "名前";}?>">
<input type = "text"  name = "comment"  value = "<?php if(!empty($pass)){echo $ecomment;}?>"  placeholder = "<?php if(empty($pass)){echo "コメント";}?>">        
<input id="pass" type = "text" name = "password" value ="<?php if(!empty($pass)){echo $pass;}?>"  placeholder = "<?php if(empty($pass)){echo "パスワード";}?>">
<input type = "hidden"  name = "edit-number" value = "<?php if(!empty($pass)){echo $editnumber;}?>" >
<input type = "submit"  name = "btn"value = "送信"><br>

<input type = "text" name = "deleteNo"  placeholder = "削除対象番号" placeholder="編集番号を入力してください">
<input id="pass" type = "text" name = "delpass"  placeholder = "パスワード">
<input type = "submit"  name = "delete" value = "削除"><br>

<input type = "text" name = "editNo" placeholder = "編集対象番号" placeholder="編集番号を入力してください">
<input id="pass" type = "text" name = "editpass"  placeholder = "パスワード">
<input type =  "submit" name = "edit" value = "編集"><br> 




<?php


      //編集実行機能
if(!empty($_POST["edit-number"]) && !empty($_POST["editNo"])){
    $id = $_POST["edit-number"];      //ここで編集対象番号の値の受け取りを行う
    $name = $_POST["name"];
    $comment = $_POST["comment"];
    $password = $_POST["password"]; 
    $date = date("Y年m月d日 H時i分s秒");
    $sql = 'update tech_text set name=:name,comment=:comment,pass=:pass,date=date where id=:id';
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
    $stmt->bindParam(':pass', $password, PDO::PARAM_STR);
    $stmt->bindParam(':date', $date, PDO::PARAM_STR);
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->execute();

}



        //新規投稿
if(!empty($_POST["name"]) && !empty($_POST["comment"]) and !empty($_POST["password"]) and empty($_POST["edit-number"])){
    $name = $_POST["name"];
    $comment = $_POST["comment"];
    $password = $_POST["password"];
    $date = date("Y年m月d日 H時i分s秒");
    $sql = $pdo -> prepare("INSERT INTO tech_text (name, comment, pass,date) VALUES(:name, :comment, :pass,:date)");
    $sql -> bindParam(':name', $name, PDO::PARAM_STR);        
    $sql -> bindParam(':comment', $comment, PDO::PARAM_STR);
    $sql -> bindParam(':pass', $password, PDO::PARAM_STR);
    $sql -> execute();              //実行する
}



         // 削除機能
 if(!empty($_POST['deleteNo']) && !empty($_POST['delpass'])){
    $delete=$_POST['deleteNo']; 
    $delpassword=$_POST['delpass'] ;
    $sql = 'delete from tech_text where id=:id';
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':id', $delete, PDO::PARAM_INT);
    $stmt->execute();
  }


          //表示機能

    $sql = 'SELECT * FROM tech_text';
    $stmt = $pdo->query($sql);
    $results = $stmt->fetchAll();

    foreach ($results as $row){
        //配列の中で使うのはテーブルのカラム名の物
        echo $row['id'].',';
        echo $row['name'].',';
        echo $row['comment'].',';
        echo $row['date'].',';
        echo "<hr>";
    }



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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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

      //テーブルの作成
    $sql = <<<EOT
CREATE TABLE IF NOT EXISTS `tech_text`
(
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` char(32),
  `comment` TEXT,
  `date` char(32),
  `pass` char(32),
);
EOT;

みたいに。元の文だと、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/25 23:03

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る