PHPの勉強①

未分類

PHPで掲示板を作るため、独学を行うことにした。

ネットに色々と情報はあるが、あまり役に立たないのでわかりやすいものを作ることにした。

この講義のポイントとしては3つになります。

  • HTML上でPHPを動かす
  • 投稿内容を処理する
  • 投稿内容をどこかに保存する

これができれば大抵のものは動かせると思います。

なお、PHPファイルを別ファイルに分けるのもありですが、それはまた別の話で

HTML上でPHPを動かす

<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
      <div class="warp">
      </div>
    </body>
  </html>

まずは、上のように書きましょう。ただ、これだけだともちろん何も起こりません。

次にPHPを書くのですが、おまじない様に以下のコードを上に書き込んでください。

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
	
}

?>
<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
      <div class="warp">
      </div>
    </body>
  </html>

この

if($_SERVER['REQUEST_METHOD'] === 'POST')
{
	
}

?>

箇所でPHPの処理を行うことができます。

次にPOST内の処理をさせるために、フォームを設置します。

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
	
}

?>
<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
      <div class="warp">
        <form action="refposting.php" method="post">
              <textarea id="editor" name="message" rows="8" cols="40"></textarea>
              <button type="submit">送信</button>
        </form>
      </div>
    </body>
  </html>

注目すべき点はここですね。

        <form action="refposting.php" method="post">
              <textarea id="editor" name="message" rows="8" cols="40"></textarea>
              <button type="submit">送信</button>
        </form>

actionのところに処理を行うPHPを記載し、送信ボタンを配置します。またMethodの箇所にはPOSTと記載します。ここが一番重要です。

そうすると、この送信を押したときにrefposting.phpにあるコードを実行してPOSTの中にある処理を行うという意味になります。ここまでは、ほとんど共通しているので、このままコピペでOKです。

試しに、記載内容が本当に実行されるのか試してみましょう。

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
	echo "実行されました";
}

?>
<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
      <div class="warp">
        <form action="refposting.php" method="post">
              <textarea id="editor" name="message" rows="8" cols="40"></textarea>
              <button type="submit">送信</button>
        </form>
      </div>
    </body>
  </html>

送信を押すと、この様な文字が表示されると思います。

なお、文字はechoというのを使うと表示されます。

記載している箇所から表示されるので、ヘッダーに表示されました。

投稿内容を処理する

では、続いて、テキストエリアに記載した文字列はどうやって取得するのでしょうか?

実は記載された内容はFormタグ内にあるname属性に記載された情報をもとに値を持っているのです。どういうことかというと、今回は、テキストエリアタグのname属性にmessageと記載されていると思うのですが、そこに値を持っているのです。

先程のコードをこの様に書き換えてみましょう。

if($_SERVER['REQUEST_METHOD'] === 'POST')
{
	echo $_POST['message'];
}

この様に書き換えることで、テキストエリア内にある、値を取得することができました。

ただし、name属性が書けるものに限ります。

なお、Name属性が記載できるタグは以下のものしかありません。

  • a
  • applet
  • button
  • form
  • frame
  • iframe
  • img
  • input
  • map
  • meta
  • object
  • param
  • select
  • textarea

物凄く少ないですよね。WEBをしてて思うのですが、なんでこんなに複雑で使い用もない方法でサービスが作られているのかいまだに疑問です。

AndroidとかVBとか見習って欲しいくらいです。

さて、愚痴はこの辺にいたしまして、ここまででわかったと思いますがPHPの流れとしては

  • HTMLのname属性が書けるタグに情報を入力
  • 入力した内容を$_POSTという箇所で情報を取得
  • 情報の振り分けはname属性に記載された名前をもとに取得

という流れになるわけです。

投稿内容をどこかに保存する

今回は掲示板を作るので、投稿内容をどこかに保存しなければなりません。

テキストファイルに保存するのが簡単ではありますが、今回はDBに保存してみましょう!

いきなり!?

と思うかもしれませんが、コピペでOKなのでそうしましょう。

なおDBはあらかじめ作っておいたので、ダウンロードして今PHPファイルが置いてある場所に配置してください。

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
  try{
    $pdo = new PDO('sqlite:./first.db'); //  PDOの引数に(sqlite:データベースのパス)で指定する
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーが起きた時例外を投げる
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); // 連想配列形式でデータを取得する
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 指定した型に合わせる
  }catch(PDOException $e){
  //echo $e->getMessage();
  exit('エラーが発生しました');
  }

  $message = trim(filter_input(INPUT_POST, 'message'));
  if($message === ''){
    echo '<script>alert("コメントを入力してください。")</script>';
    return;
  }
  // SQL文の実行
  $stmt = $pdo->prepare("INSERT INTO post ( message) VALUES (:message)");
  $stmt->bindValue('message', $message);
  $stmt->execute();
}

?>
<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
      <div class="warp">
        <form action="refposting.php" method="post">
              <textarea id="editor" name="message" rows="8" cols="40"></textarea>
              <button type="submit">送信</button>
        </form>
      </div>
    </body>
  </html>

この様に記載します。

ええ!全くわからん!となるかもしれませんが、心配ないです。

順を追って説明します。

まずは、実際に入力して送信してみると

この様に、こんばんわ・・・と記載した内容がDBに書き込まれているのがわかります。

ポイントとしては

  try{
    $pdo = new PDO('sqlite:./first.db'); //  PDOの引数に(sqlite:データベースのパス)で指定する
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーが起きた時例外を投げる
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); // 連想配列形式でデータを取得する
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 指定した型に合わせる
  }catch(PDOException $e){
  //echo $e->getMessage();
  exit('エラーが発生しました');
  }

  $message = trim(filter_input(INPUT_POST, 'message'));
  if($message === ''){
    echo '<script>alert("コメントを入力してください。")</script>';
    return;
  }
  // SQL文の実行
  $stmt = $pdo->prepare("INSERT INTO post ( message) VALUES (:message)");
  $stmt->bindValue('message', $message);
  $stmt->execute();

これを記載すれば良いだけなのですが、これは一体何をしているのか一回ざっくりとお話しします。

なお、完全に近いしなくて大丈夫です。ポイントだけ押さえてください。

try{
    $pdo = new PDO('sqlite:./first.db'); //  PDOの引数に(sqlite:データベースのパス)で指定する
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーが起きた時例外を投げる
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); // 連想配列形式でデータを取得する
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 指定した型に合わせる
  }catch(PDOException $e){
  //echo $e->getMessage();
  exit('エラーが発生しました');
  }

まず、ここでDBと接続処理を行います。

ポイントとしては$pdo = new PDO(‘sqlite:./first.db’);ここに、DBのあるフォルダーとDB名を拡張子込みで記載します。

今回は、PHPファイルと同じ場所にDBをおいたので./first.dbと記載します。

  $message = trim(filter_input(INPUT_POST, 'message'));
  if($message === ''){
    echo '<script>alert("コメントを入力してください。")</script>';
    return;
  }

これは何をやっているのかと言うと、テキストエリアのname属性はmessageですよね?

trim(filter_input(INPUT_POST, ‘message’));はmessageというname属性を取ってきてねというものになります。

まあ、こう書くとmessageの値を取得することができます。

もちろん$_POSTを使っても良いですが、簡単にするためにこう書きました。

もし、値が空文字、つまり何も記載していない場合はエラーメッセージを表示するという処理にしました。

  $stmt = $pdo->prepare("INSERT INTO post ( message) VALUES (:message)");
  $stmt->bindValue('message', $message);
  $stmt->execute();

最後は何をやっているのかというと、DBに書き込む処理をしています。

これはどちらかというとSQLを実行しているのですが、ここでは難しく考えず、

$stmt = $pdo->prepare(“INSERT INTO post ( message) VALUES (:message)”);

DBのカラムにmessageに記載する場合、この様に書きます。

もしそんな名前のカラム名がない場合はエラーになるので注意してください。

$stmt->bindValue(‘message’, $message);

そして、messageという絡むに保存したい値を書きます。今回は$messageの値の中身を書きたいのでこの様にします。

$stmt->execute();

これを最後に書いて、SQLを実行、つまり、データーが書き込まれます。

まとめ

いかがでしたが、色々書きましたが、以下のコードをコピペして、必要な箇所を書き換えるだけでOKです!

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
  try{
    $pdo = new PDO('sqlite:./first.db'); //  PDOの引数に(sqlite:データベースのパス)で指定する
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーが起きた時例外を投げる
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); // 連想配列形式でデータを取得する
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 指定した型に合わせる
  }catch(PDOException $e){
  //echo $e->getMessage();
  exit('エラーが発生しました');
  }

  $message = trim(filter_input(INPUT_POST, 'message'));
  if($message === ''){
    echo '<script>alert("コメントを入力してください。")</script>';
    return;
  }
  // SQL文の実行
  $stmt = $pdo->prepare("INSERT INTO post ( message) VALUES (:message)");
  $stmt->bindValue('message', $message);
  $stmt->execute();
}

?>
<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
      <div class="warp">
        <form action="refposting.php" method="post">
              <textarea id="editor" name="message" rows="8" cols="40"></textarea>
              <button type="submit">送信</button>
        </form>
      </div>
    </body>
  </html>

次回は文章比較を行なって、その内容を書き込む掲示板を作ります。

お楽しみに!

タイトルとURLをコピーしました