PHPでフレームワークを使用せずに投稿サイトを作る

# やりたいこと
PHPで管理画面も含めた用語集サイトを作ります。
わかりやすさを優先して、最低限のソースコードにしています。
管理者パスワード設定もないので、第三者が勝手にコンテンツを変更できる仕様です。
セキュリティが緩いので個人情報を取り扱わないでください。

# 仕様
- トップページ（index.php）は用語名、用語のフリガナの一覧を表示する。
- トップページの用語のハイパーリンクをクリックすると、用語詳細ページ（item.php）画面に遷移する。
- 用語詳細ページは、用語名、分類、用語のフリガナ、用語の内容を表示する。
- 管理画面で用語の新規登録、編集、削除ができる。
- 管理画面で用語の新規登録、編集、削除ボタンを押すと、確認ページ（xxxx_check.php）に遷移し実行ボタンを押すと、実行結果確認ページ（xxxx_done.php）に遷移する。

# その他
サーバーはロリポップを契約、ドメインはムームードメインで取得しています。


# ページ構成と画面遷移
### ページ一覧
index.php
item.php
list.php
branch.php
add.php
add_check.php
add_done.php
edit.php
edit_check.php
edit_done.php
delete.php
delete_done.php
ng.php

### 画面遷移図
![PHPサイト画面遷移図 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/cbaec750-d1c9-51c5-cc1a-f10ece57ef44.jpeg)


# 各ページのソースコード
## index.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
 <div class="wrapper">
  <div id="site_title"><a href="https://XXXX.com/">Webサイトのタイトル</a></div>
   <div class="top_page_title_list">
    <ul>
     <li>
      <?php
       try {
        //DB名、ユーザー名、パスワード
        $dsn = 'mysql:dbname=LAAXXXX-XXXX;host=mysqlXXX.phy.lolipop.lan'; //データベース名。''内は一切スペースを入れてはいけない
        $user = 'LAAXXXX'; //''内にはユーザ名を入力
        $password = 'XXXX';  //''内にはパスワードを入力

        $PDO = new PDO($dsn, $user, $password); //MySQLのデータベースに接続
        $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //PDOのエラーレポートを表示
        $sql = 'SELECT * FROM contents ORDER BY name asc'; //SELECT文を変数に格納。 contentsテーブルてからname列の値を取り出し、name列順に並び替え
        $stmt = $PDO->query($sql); // SQLステートメントを実行し、結果を変数に格納

        // foreach文で配列の中身を一行ずつ出力
        foreach ($stmt as $row) {
        // 取り出した一行を名称とフリガナで表示し、ハイパーリンク設定
        echo "<div class='title_name'><a href='http://XXXX.com/item.php?name=".$row['name']."'>".$row['name'].
        "<span class='reading'>(".$row['reading'].")</span></a></div>\n";
        }
       } catch (PDOException $e) {
       exit('データベースに接続できませんでした。' . $e->getMessage());
      }
     ?>
    </li>
   </ul>
  </div>
 </div>
</body>
</html>
```


## item.php
```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
 <div class="wrapper">
  <div id="site_title"><a href="https://XXXX.com/">Webサイトのタイトル</a></div>
   <div class="detail_page_contents">
    <?php
     try {
      //URLのidの値を取得
      $name = $_GET['name'];

      //DB名、ユーザー名、パスワード
      $dsn = 'mysql:dbname=LAAXXXX-XXXX;host=mysqlXXX.phy.lolipop.lan'; //データベース名。''内は一切スペースを入れてはいけない
      $user = 'LAAXXXX'; //''内にはユーザ名を入力
      $password = 'XXXX';  //''内にはパスワードを入力

      $PDO = new PDO($dsn, $user, $password); //MySQLのデータベースに接続
      $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      //名前付けされたプレースホルダを用いてプリペアドステートメントを実行
      // プレースホルダとはSQLを発行する際に後から値を指定する方法のこと。SQLインジェクションを回避してセキュリティを高める
      $result = $PDO->prepare('SELECT * FROM contents WHERE name = :name');
      $result->bindValue(':name', $name);
      $result->execute();

      while($row = $result->fetch(PDO::FETCH_ASSOC)){
       echo "<p>分類 | ".$row['category']."</p>";
       echo "<h1>".$row['name']." (".$row['reading'].")</span></h1>";
       echo "<p>".nl2br($row['description'])."</p>"; //nl2br関数で改行を反映する
      }

     } catch (PDOException $e) {
      exit('データベースに接続できませんでした。' . $e->getMessage());
     }
    ?>
   </div>
  </div>
 </div>
</body>
</html>
```

## list.php
```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
  <link rel="stylesheet" href="/main.css">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
//tryはデータベースの接続エラー対策
try
{
  //データベースに接続
  $dsn = 'mysql:dbname=LAAXXXX-XXXX;host=mysqlXXX.phy.lolipop.lan'; //データベース名。''内は一切スペースを入れてはいけない
  $user = 'LAAXXXX'; //''内にはユーザ名を入力
  $password = 'XXXX';  //''内にはパスワードを入力
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //この行は定型文としてこのまま書く

  // SQL分を使ってレコードを読み込み
  $sql ='SELECT name FROM contents WHERE 1'; //'SELECT name FROM contents WHERE 1'を変数$sqlに格納する。contentsテーブルのnameカラムのすべての情報(Where 1で全部という意味)を取得する
  $stmt = $dbh->prepare($sql); // レコードを呼び出す準備。この行は定型文としてこのまま書く
  $stmt->execute(); // SQL文で指令を出すための命令文。この行は定型文としてこのまま書く

  // データベースから切断するプログラム
  $dbh = null;

  // 一覧を表示する
  print '用語一覧<br /><br />';

  print '<form method="post" action="branch.php">';

  While(true){
    $rec = $stmt->fetch(PDO::FETCH_ASSOC); //$stmtから1レコードを取り出す
    if($rec==false){ //もし、$recがなければ（もうデータがなければ）、Whileから抜け出す
      break;
    }
    print '<input type="radio" name="name" value="'.$rec['name'].'">';
    print $rec['name']; //もし、$recがあれば、$recのnameを表示
    print "<br />\n"; //\nはソースコードの改行コード。\nはシングルクオテーションで囲うと文字として出力されてしまうので注意
    // 上記3行は結合すると右記のように表示される。　<input type="radio" name="glossary" value="AA">AA<br />
  }
  print '<input type="submit" name="add" value="追加">';
  print '<input type="submit" name="edit" value="修正">';
  print '<input type="submit" name="delete" value="削除">';
  print '</form>';
}
catch (Exception $e)
{
  print 'ただいま障害により表示できません。';
  exit(); //強制終了の命令
}
?>

</body>
</html>
```

## branch.php
branch.phpを使って、list.phpで押したボタンに応じて遷移先を制御する。

```php
<?php
if(isset($_POST['add'])==true){ //もし「追加」ボタンが押されていて
  header('Location:add.php');
  exit();
}

if(isset($_POST['edit'])==true){ //もし「修正」ボタンが押されていて

  if(isset($_POST['name'])==false){ //もしラジオボタンが何も選択されていなければ
    header('Location:ng.php');
    exit();
  }

  $name=$_POST['name'];
  header('Location:edit.php?name='.$name);
  exit();
}

if(isset($_POST['delete'])==true){ //もし「修正」ボタンが押されていて

  if(isset($_POST['name'])==false){ //もしラジオボタンが何も選択されていなければ
    header('Location: ng.php');
    exit();
  }

  $name=$_POST['name'];
  header('Location:delete.php?name='.$name);
  exit();
}
?>
```

## add.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
  用語追加<br />
  <br />
  <form method="post" action="glossary_add_check.php"> <!--postメソッドで、glossary_add_check.phpに情報を引き渡す-->
    用語名を入力してください。<br />
    <input type="text" name="name" style="width:100px"><br /> <!--入力された値はtext型。値はnameと名づける-->

    読み方を入力してください。英語はカナ、日本語は平仮名<br />
    <input type="text" name="reading" style="width:100px"><br /> <!--入力された値はtext型。値はreadingと名づける-->

    カテゴリを入力してください。<br />
    <input type="text" name="category" style="width:100px"><br /> <!--入力された値はtext型。値はcategoryと名づける。-->

    用語の説明文を入力してください。<br />
    <textarea name="description" style="width:500px; height:200px;" wrap="soft"></textarea>
    <br />
    <input type="button" onclick="history.back()" value="戻る"> <!--戻るボタンをクリックすると、前の画面に遷移する-->
    <input type="submit" value="OK"> <!--OKボタンをクリックすると、glossary_add_check.phpに遷移する-->
  </form>
</body>
</html>
```

## add_check.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
$name=$_POST['name']; //前の画面から入力値を受け取り、$nameに格納
$reading=$_POST['reading']; //前の画面から入力値を受け取り、$readingに格納
$category=$_POST['category']; //前の画面から入力値を受け取り、$categoryに格納
$description=$_POST['description']; //前の画面から入力値を受け取り、$descriptionに格納

$name=htmlspecialchars($name,ENT_QUOTES,'UTF-8'); //文字列に変換（セキュリティ対策）
$reading=htmlspecialchars($reading,ENT_QUOTES,'UTF-8'); //文字列に変換（セキュリティ対策）
$category=htmlspecialchars($category,ENT_QUOTES,'UTF-8'); //文字列に変換（セキュリティ対策）
$description=htmlspecialchars($description,ENT_QUOTES,'UTF-8'); //文字列に変換（セキュリティ対策）

//$nameがカラならエラーメッセージを表示する
//$nameが入力されていれば、$nameを表示する
if($name==''){
  print '用語名が入力されていません。<br />';
}
else
{
  print '用語名：';
  print $name;
  print '<br />';
}

//$readingがカラならエラーメッセージを表示する
//$readingが入力されていれば、$readingを表示する
if($reading==''){
  print '読み方が入力されていません。<br />';
}
else
{
  print '読み方：';
  print $reading;
  print '<br />';
}

//$categoryがカラならエラーメッセージを表示する
//$categoryが入力されていれば、$categoryを表示する
if($category==''){
  print 'カテゴリが入力されていません。<br />';
}
else
{
  print 'カテゴリ：';
  print $category;
  print '<br />';
}

//$descriptionがカラならエラーメッセージを表示する
//$descriptionが入力されていれば、$categoryを表示する
if($description==''){
  print '用語説明が入力されていません。<br />';
}
else
{
  print '用語説明：';
  print $description;
  print '<br />';
}

//$name、$reading、$category、$descriptionのいずれかがカラなら、戻るボタンのみを表示する
//入力項目が適切なら、戻るボタンとOKボタンを表示する。
if($name==''|| $reading==''||$category=='' || $description==''){
  print '<form>';
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '<form>';
}
else
{
  print '<form method="post" action="add_done.php">';
  print '<input type="hidden" name="name" value="'.$name.'">'; //'<input type="hidden" name="name" value="'と$nameをドットで連結
  print '<input type="hidden" name="reading" value="'.$reading.'">'; //'<input type="hidden" name="reading" value="'と$nameをドットで連結
  print '<input type="hidden" name="category" value="'.$category.'">'; //'<input type="hidden" name="category" value="'と$categoryをドットで連結
  print '<input type="hidden" name="description" value="'.$description.'">'; //'<input type="hidden" name="description" value="'と$descriptionをドットで連結
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '<input type="submit" value="OK">';
  print '</form>';
}

?>
</body>
</html>
```

## add_done.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
//tryはデータベースの接続エラー対策
try
{
  // POSTメソッドで前の画面の入力値を取得する
  $name = $_POST['name'];
  $reading = $_POST['reading'];
  $category = $_POST['category'];
  $description = $_POST['description'];

  //データベースに接続
  $dsn = 'mysql:dbname=LAAXXXX-XXXX;host=mysqlXXXX.lan'; //データベース名。''内は一切スペースを入れてはいけない
  $user = 'LAAXXXX'; //rootにはユーザ名を入力
  $password = 'XXXX';  //''内にはパスワードを入力
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //この行は定型文としてこのまま書く

  // SQL分を使ってレコードを追加
  $sql ='INSERT INTO contents(name,reading,category,description) VALUES (?,?,?,?)'; //'INSERT INTO mst_staff(name,reading,category,description) VALUES (?,?,?,?)'を変数$sqlに格納する
  $stmt = $dbh->prepare($sql); // レコードを追加する準備。この行は定型文としてこのまま書く
  $data[] = $name; // 一つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $reading; // 二つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $category; // 三つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $description; // 四つ目の?にセットしたいデータが入っている変数を書く
  $stmt->execute($data); // SQL文で指令を出すための命令文。この行は定型文としてこのまま書く

  // データベースから切断するプログラム
  $dbh = null;

  // セキュリティ対策入力値を文字列に変換。出力時にエスケープする
  // エスケープ忘れ、多重エスケープ、エスケープ前の文字列が必要になった際にhtmlspecialchars_decode()等で元に戻す必要があるため
  $name = htmlspecialchars($name,ENT_QUOTES,'UTF-8');
  $reading = htmlspecialchars($reading,ENT_QUOTES,'UTF-8');
  $category = htmlspecialchars($category,ENT_QUOTES,'UTF-8');
  $description = htmlspecialchars($description,ENT_QUOTES,'UTF-8');

  //結果を表示
  print $name;
  print 'を追加しました。<br />';

}
catch (Exception $e)
{
  print 'ただいま障害により接続できません。';
  exit(); //強制終了の命令
}
?>

<a href="list.php">戻る</a>
</body>
</html>
```

## edit.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
//tryはデータベースの接続エラー対策
try
{
  $name=$_GET['name']; //前画面のlist.phpからGETでglossaryを受け取る

  //データベースに接続
  $dsn = 'mysql:dbname=LAAXXXX-XXXX;host=mysqlXXXX.lan'; //データベース名。''内は一切スペースを入れてはいけない
  $user = 'LAAXXXX'; //''内にはにはユーザ名を入力
  $password = 'XXXX';  //''内にはパスワードを入力
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //この行は定型文としてこのまま書く

  // SQL分を使ってレコードを読み込み
  $sql ='SELECT reading, category, description FROM contents WHERE name=?'; //'SELECT name FROM contents WHERE glossary=?'を変数$sqlに格納する。contentsテーブルのnameカラムのあとで指定する(?のこと)値の情報を取得する
  $stmt = $dbh->prepare($sql); // レコードを検索する準備。この行は定型文としてこのまま書く
  $data[] = $name; // 上の上の行の?の値を設定する
  $stmt->execute($data); // SQL文で指令を出すための命令文。この行は定型文としてこのまま書く

  $rec=$stmt->fetch(PDO::FETCH_ASSOC);
  $reading=$rec['reading'];
  $category=$rec['category'];
  $description=$rec['description'];

  // データベースから切断するプログラム
  $dbh = null;
}
catch (Exception $e)
{
  print 'ただいま障害により表示できません。';
  exit(); //強制終了の命令
}
?>

Name<br />
<form method="post" action="edit_check.php">
<input type="text" name="name" value="<?php print $name; ?>">
<br /><br />
Reading<br />
<form method="post" action="edit_check.php">
<input type="text" name="reading" value="<?php print $reading; ?>">
<br /><br />
Category<br />
<form method="post" action="edit_check.php">
<input type="text" name="category" value="<?php print $category; ?>">
<br /><br />
Discription<br />
<form method="post" action="edit_check.php">
<textarea name="description" style="width:500px; height:200px;" wrap="soft">
<?php print $description; ?>
</textarea>
<br />
<input type="button" onclick="history.back()" value="戻る">
<input type="submit" value="OK">
</form>
</body>
</html>
```

## edit_check.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
$name=$_POST['name']; //前の画面から入力値を受け取り、$nameに格納
$reading=$_POST['reading']; //前の画面から入力値を受け取り、$readingに格納
$category=$_POST['category']; //前の画面から入力値を受け取り、$categoryに格納
$description=$_POST['description']; //前の画面から入力値を受け取り、$escriptionに格納

//$nameがカラならエラーメッセージを表示する
//$nameが入力されていれば、$nameを表示する
if($name==''){
  print '用語名が入力されていません。<br />';
}
else
{
  print '用語名：';
  print $name;
  print '<br /><br />';
}

//$readingがカラならエラーメッセージを表示する
//$readingが入力されていれば、$readingを表示する
if($reading==''){
  print '読み方が入力されていません。<br />';
}
else
{
  print '読み：';
  print $reading;
  print '<br /><br />';
}

//$categoryがカラならエラーメッセージを表示する
//$categoryが入力されていれば、$categoryを表示する
if($category==''){
  print 'カテゴリが入力されていません。<br />';
}
else
{
  print 'カテゴリ：';
  print $category;
  print '<br /><br />';
}

//$descriptionがカラならエラーメッセージを表示する
//$descriptionが入力されていれば、$categoryを表示する
if($description==''){
  print '用語説明が入力されていません。<br /><br />';
}
else
{
  print '用語説明：';
  print $description;
  print '<br /><br />';
}

//$name、$category、$descriptionのいずれかがカラなら、戻るボタンのみを表示する
//入力項目が適切なら、戻るボタンとOKボタンを表示する。
if($name==''|| $reading==''|| $category=='' || $description==''){
  print '<form>';
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '<form>';
}
else
{
  print '<form method="post" action="edit_done.php">';
  print '<input type="hidden" name="name" value="'.$name.'">'; //'<input type="hidden" name="name" value="'と$nameをドットで連結
  print '<input type="hidden" name="reading" value="'.$reading.'">'; //'<input type="hidden" name="namereading" value="'と$readingをドットで連結
  print '<input type="hidden" name="category" value="'.$category.'">'; //'<input type="hidden" name="category" value="'と$categoryをドットで連結
  print '<input type="hidden" name="description" value="'.$description.'">'; //'<input type="hidden" name="description" value="'と$descriptionをドットで連結
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '<input type="submit" value="OK">';
  print '</form>';
}
?>
</body>
</html>
```

## edit_done.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
//tryはデータベースの接続エラー対策
try
{
  // POSTメソッドで前の画面の入力値を取得する
  $name = $_POST['name'];
  $reading = $_POST['reading'];
  $category = $_POST['category'];
  $description = $_POST['description'];

  //データベースに接続
  $dsn = 'mysql:dbname=LAAXXXX;host=mysqlXXXX.lan'; //データベース名。''内は一切スペースを入れてはいけない
  $user = 'XXXX'; //rootにはユーザ名を入力
  $password = 'XXXX';  //''内にはパスワードを入力
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //この行は定型文としてこのまま書く

  // SQL分を使ってレコードを追加
  $sql ='UPDATE contents SET name=?,reading=?,category=?,description=? WHERE name=?'; //$sql ='UPDATE contents SET name=?,reading=?,category=?,description=? WHERE name=?'を変数$sqlに格納する
  $stmt = $dbh->prepare($sql); // レコードを追加する準備。この行は定型文としてこのまま書く
  $data[] = $name; // 一つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $reading; // 二つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $category; // 三つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $description; // 四つ目の?にセットしたいデータが入っている変数を書く
  $data[] = $name; // 五つ目の?にセットしたいデータが入っている変数を書く
  $stmt->execute($data); // SQL文で指令を出すための命令文。この行は定型文としてこのまま書く

  // データベースから切断するプログラム
  $dbh = null;

}
catch (Exception $e)
{
  print 'ただいま障害により接続できません。';
  exit(); //強制終了の命令
}
?>

修正しました。　<br /><br />
<a href="list.php">戻る</a>

</body>
</html>
```

## delete.php

```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
//tryはデータベースの接続エラー対策
try
{
  $name=$_GET['name']; //前画面のlist.phpからGETでnameを受け取る

  //データベースに接続
  $dsn = 'mysql:dbname=LAAXXXX;host=mysqlXXXX.lan'; //データベース名。''内は一切スペースを入れてはいけない
  $user = 'XXXX'; //''内にはにはユーザ名を入力
  $password = 'XXXX';  //''内にはパスワードを入力
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //この行は定型文としてこのまま書く

  // SQL分を使ってレコードを読み込み
  $sql ='SELECT reading, category, description FROM contents WHERE name=?'; //'SELECT name FROM contents WHERE glossary=?'を変数$sqlに格納する。contentsテーブルのnameカラムのあとで指定する(?のこと)値の情報を取得する
  $stmt = $dbh->prepare($sql); // レコードを検索する準備。この行は定型文としてこのまま書く
  $data[] = $name; // 上の上の行の?の値を設定する
  $stmt->execute($data); // SQL文で指令を出すための命令文。この行は定型文としてこのまま書く

  $rec=$stmt->fetch(PDO::FETCH_ASSOC);
  $category=$rec['reading'];
  $category=$rec['category'];
  $description=$rec['description'];

  // データベースから切断するプログラム
  $dbh = null;
}
catch (Exception $e)
{
  print 'ただいま障害により表示できません。';
  exit(); //強制終了の命令
}
?>

用語削除<br /><br />
用語<br />
<?php print $name; ?>
<br />
この用語を削除してよろしいですか？<br /><br />
<form method="post" action="delete_done.php">
<input type="hidden" name="name" style="width:200px" value="<?php print $name?>"><br />
<input type="button" onclick="history.back()" value="戻る">
<input type="submit" value="OK">
</form>

</body>
</html>
```

## delete_done.php
```php
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
<?php
//tryはデータベースの接続エラー対策
try
{
  // POSTメソッドで前の画面の入力値を取得する
  $name = $_POST['name'];

  //データベースに接続
  $dsn = 'mysql:dbname=LAAXXXX;host=mysqlXXXX.lan'; //データベース名。''内は一切スペースを入れてはいけない
  $user = 'XXXX'; //rootにはユーザ名を入力
  $password = 'XXXX';  //''内にはパスワードを入力
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //この行は定型文としてこのまま書く

  // SQL分を使ってレコードを追加
  $sql ='DELETE FROM contents WHERE name=?'; //DELETE FROM contents WHERE name=?を変数$sqlに格納する
  $stmt = $dbh->prepare($sql); // レコードを追加する準備。この行は定型文としてこのまま書く
  $data[] = $name; // 一つ目の?にセットしたいデータが入っている変数を書く
  $stmt->execute($data); // SQL文で指令を出すための命令文。この行は定型文としてこのまま書く

  // データベースから切断するプログラム
  $dbh = null;
}
catch (Exception $e)
{
  print 'ただいま障害により接続できません。';
  exit(); //強制終了の命令
}
?>

削除しました。　<br /><br />
<a href="list.php">戻る</a>

</body>
</html>
```

## ng.php

```php
<!DOCTYPE html>
<html lang="ja">
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="description" content="Webサイトのコンテンツ内容">
 <title>Webサイトのタイトル</title>
 <link rel="stylesheet" href="/main.css">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>

<body>
用語が選択されていません。
<a href="list.php">戻る</a>
</body>

</html>
```