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

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

ただいまの
回答率

90.50%

  • PHP

    24014questions

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

  • MySQL

    6995questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

postされた値を元にデータベースからデータを削除したいです

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 226

newyee

score 143

PHPの学習としまして、簡易な掲示板を作成したのですが、つまずいてしまった為、お聞きしたい箇所がございます

<?php 
include 'includes/login.php';
  error_reporting(E_ALL);
  ini_set("display_errors",1);
  //1ページに表示されるコメントの数
  $num = 10;
  $user = 'root';
  $password = '';
  $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8';
  //ページ数が指定されている時
  $page = 0;
  if(isset($_GET['page']) && $_GET['page'] > 0){
    $page = intval($_GET['page']) -1;

  }

  try{
    $dbh = new PDO($dsn,$user,$password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

    $stmt = $dbh->prepare("SELECT * FROM post ORDER BY created_at DESC LIMIT
    :page,:num");
    //パラメーターを割り当て
    $page = $page * $num;
    $stmt->bindValue(':page',$page,PDO::PARAM_INT);
    $stmt->bindValue(':num',$num,PDO::PARAM_INT);
    $stmt->execute();

  }catch(PDOException $e){
    echo "エラー: " . $e->getMessage();
  }



?>

  <html>
    <head>
      <title>交流サイト:掲示板</title>
      <meta charset="utf-8">
    </head>
    <body>
      <h1>掲示板</h1>
      <form action="write.php" method="post">
        <p>名前:<input type="text" name="name" value="<?php echo isset($_COOKIE['name']) ? $_COOKIE['name'] : '' ?>"></p>
        <p>タイトル:<input type="text" name="title" size="60"></p>
        <textarea name="comment"></textarea>
        <p>削除パスワード(数字4桁):<input type="text" name="pass">
        <input type="submit" name="submit" value="書き込む">
        <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>">
      </form> 
      <hr>
    <?php 
      while($row = $stmt->fetch()):
        $title = $row['title'] ? $row['title'] : '(無題)';
      ?>
      <p>名前:<?php echo $row['name'] ?></p>
      <p>タイトル:<?php echo $title ?></p>
      <p><?php echo nl2br(htmlspecialchars($row['comment'],ENT_QUOTES,'UTF-8'),false) ?></p>
      <p><?php echo $row['created_at'] ?></p>
      <form action="delete.php" method="post">
        <input type="hidden" name="id" value="<?php echo $row['id']; ?>">
        削除パスワード:<input type="password" name="pass">
        <input type="submit" value="削除">
        <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>">
      </form>
    <?php 
      endwhile;
      //ページ数の表示
      try{
        $stmt = $dbh->prepare("SELECT COUNT(*) FROM post");
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
        $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

        //クエリの実行
        $stmt->execute();

      }catch(PDOException $e){
        echo "エラー:" . $e->getMessage();
      }
      /**
       * コメントの件数を取得
       *fetchColumn関数で 最初のレコードを取り出し、最初の列「id」のデータを取り出す
       * idは降順に設定されているため、コメントの件数が分かる
       * */
      $comments = $stmt->fetchColumn();
      $max_page = ceil($comments / $num);
      echo '<p>';
      for($i = 1; $i <= $max_page; $i++){
        echo '<a href="bbs.php?page=' . $i .'">' . $i .
        '</a>&nbsp;'; 
      }
      echo '</p>';
      ?>

    </body>
  </html>


上記は掲示板の、コメントの表示部分及び、ユーザの名前、コメントなどの入力部分を表示し、投稿されたコメントをデータベースより取得し、表示する「bbs.php」になります。

<?php 
include 'includes/login.php';
  error_reporting(E_ALL);
  ini_set("display_errors",1);
  $id = intval($_POST['id']);
  $pass = $_POST['pass'];
  $token = $_POST['token'];
  //var_dump($id);


  if($id == '' || $pass == ''){
    echo '入力エラーです';
    //header('Location:bbs.php');
    exit();
  }
  if(!password_verify(session_id(),$token)){
    echo 'セッションエラー';
    //header('Location:bbs.php');
    exit();
  };

  $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8';
  $user = 'root';
  $password = '';
  try{
    $dbh = new PDO($dsn,$user,$password);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->prepare(
      "DELETE FROM post WHERE id = :id AND password = :pass"
    );

    $stmt->bindValue(':id',$id,PDO::PARAM_INT);
    $stmt->bindvalue(':pass',$pass,PDO::PARAM_STR);
    $stmt->execute();

  }catch(PDOExeption $e){

    echo "エラー:" . $e->getMessage();
  }

  header("Location:bbs.php");
  exit();

?>


上記は、投稿されたコメントの削除リクエストが、フォームより送信された場合、データベースより、投稿されたコメント、投稿したユーザー名、日付、タイトルを削除し、「bbs.php」へと遷移させる、「delete.php」になります。

下記の画像は、bbs.phpの画像です。
イメージ説明

お聞きしたい部分なのですが、bbs.phpのコメントを削除する為、パスワードを入力し削除ボタンを押すと、delete.phpにて、データベースに追加されている投稿されているコメント情報が削除されるはずなのですが、データベースからコメント情報を削除できません。
エラーも出ていない為、原因が分かりません。
どなたか、ご助言頂けましたら幸いです。よろしくお願いします。
※追記です
以下は投稿されたコメントをデータベースに追加する「write.php」になります

<?php
include 'includes/login.php'; 
error_reporting(E_ALL);
ini_set('display_errors', '1');
$name = $_POST['name'];

$title = $_POST['title'];
$comment = $_POST['comment'];
$pass = $_POST['pass'];
$token = $_POST['token'];
$err_message = [];

if($name == '' || $comment == ''){
  $err_message[] = '名前または、コメントが入力されていません';

}

if(!preg_match("/^[0-9]{4}$/",$pass)){
  $err_message[] = 'パスワードを4文字で入力してください';

}

if(count($err_message) === 0){
  //CSRF対策
  if(!password_verify(session_id(),$token)){
    header('Location:bbs.php');
    exit();
  }

  setcookie('name',$name,time() + 60 * 60 * 24 * 30);



  //データベースに接続
  $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8';
  $user = 'root';
  $password = '';

  try{
    $db = new PDO($dsn,$user,$password);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $stmt = $db->prepare("
      INSERT INTO post (name,title,comment,created_at,password)
      VALUES (:name, :title, :comment, now(), :pass)");
    $stmt->bindValue(':name',$name,PDO::PARAM_STR);
    $stmt->bindValue(':title',$title,PDO::PARAM_STR);
    $stmt->bindValue(':comment',$comment,PDO::PARAM_STR);
    $stmt->bindValue(':pass',$pass,PDO::PARAM_STR);
    $stmt->execute();

  }catch(PDOException $e){
    die ('エラー:' . $e->getMessage());
  }

}

?>
<html>
<head>
  <meta charset="utf-8">
  <title>Page Title</title>

</head>
<body>
  <?php 
    echo implode("<br />",$err_message);
  ?>
  <p><a href="bbs.php">戻る</a>  
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2019/03/04 13:12

    案ずるより産むがやすしという言葉があります。
    敬遠しているうちは難しそう俺には無理だと感じるだけで導入部分だけでしたら
    やってみたら案外大丈夫なものです(使いこなすというところまで最初は考えなくても良いです)

    キャンセル

  • newyee

    2019/03/04 13:24

    分かりました。一度思い切ってチャレンジしてみようと思います!

    キャンセル

  • mts10806

    2019/03/04 13:27

    そこで詰まったら質問すれば良い
    というのがあるはずなので、じっくりしっかりできると思います。

    キャンセル

回答 1

check解決した方法

-1

データベースから投稿されたコメントが削除できないと、ご質問させて頂いたのですが、削除パスワードを入力する際、COOKIEに保存されているパスワードを選んで入力していたのですが、COOKIEに保存されていたコメントのユーザー名のパスワードと実際の削除しようとした、コメントのパスワードが違った為、削除することができませんでした。単なる自分の勘違いによるものでしたので、以後気を付けたいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • PHP

    24014questions

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

  • MySQL

    6995questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。