PHP

  • googleフォームを利用して掲示板をつくろう!

    掲示板を構築してみたいと思います。
    完成したものはこちら → https://tlog.work/bord.php

    20210903 リンク切れ修正しました。

    動作動画↓

    完成したものを見ると、googleフォームじゃないじゃん?
    って感じですが、googleフォームでスプレッドシートに内容を送信し、送信した内容を表示する、という中身になってます。

    https://logzitsu.tlog.work/google%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%81/
    https://logzitsu.tlog.work/%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%A7api%E3%81%8C%E4%BD%9C%E3%82%8C%E3%82%8B%E3%82%89%E3%81%97%E3%81%84%E3%81%AE%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6/
    https://logzitsu.tlog.work/json%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92php%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

    上記の組み合わせで構築します。

    googleフォームを作ります。
    https://docs.google.com/forms/

    名前とコメントが投稿できるだけです。

    回答の、スプレッドシートのマークを選ぶと、回答のシートが作成できます。

    こんな感じ。

    このシートで、
    ツール > スクリプトエディタ
    を選択してください。

    エディタが立ち上がったら次のように入力

    function doGet() {
      const sheet = SpreadsheetApp.getActive().getSheetByName('フォームの回答 1')
      const rows = sheet.getDataRange().getValues()
      const keys = rows.splice(0, 1)[0] 
    
      const data = rows.map(function (row) {
        var item = {}
        row.map(function (val, i) {
          item[String(keys[i])] = val
        })
        return item
      })
    
      return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON)
    }

    ウェブアプリケーションとして導入します。

    許可作業が求められるので許可してください。

    生成したURLにアクセスした場合に、何か回答がすでにある場合は以下のように表示されるはずです。

    次に自分の所有しているレンタルサーバーにつぎのようなPHPをアップロードしてください。

    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
    
    <?php 
    $url = "https://script.google.com/macros/s/AKfycbwafJYUvnoL0iVRMjWL5ruLsPKEfXq9oLWmr8YIS0Zmw6uiaR9D/exec";
    $json = file_get_contents($url);
    
    //データを変換
    $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
    
    //配列に入れる
    $arr = json_decode($json,true);
    
    ?>
    
    <h2>掲示板</h2>
    
    <ul>
    <?php
     foreach ($arr as  $text) {
       echo "<li>";
       echo "<p>投稿時間:".htmlspecialchars($text["タイムスタンプ"], ENT_QUOTES, 'UTF-8')."</p>";
       echo "<p>名前:".htmlspecialchars($text["名前"], ENT_QUOTES, 'UTF-8')."</p>";
       echo "<p>コメント:".htmlspecialchars($text["コメント"], ENT_QUOTES, 'UTF-8')."</p>";
       echo "</li>";
     }
    ?>
    </ul>
        
    </body>
    </html>

    https://tlog.work/bord.php

    投稿用のgoogleformは次の通り

     https://docs.google.com/forms/d/e/1FAIpQLScyIRxqjo00X-il7hakCPMONAAGnhg9V35IpRG6zuvDgNTqUw/viewform

    自由に試してみてもらって構いません。(個人情報や、みられて困ることは書き込まないでね。削除対応はしません。)

    投稿欄をページ内につける

    投稿する場所がバラバラだと使いにくいので、ページの下にくっつけます。

    https://logzitsu.tlog.work/google%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%81/

    これをやるだけです。

    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
    
    <?php 
    $url = "https://script.google.com/macros/s/AKfycbwafJYUvnoL0iVRMjWL5ruLsPKEfXq9oLWmr8YIS0Zmw6uiaR9D/exec";
    $json = file_get_contents($url);
    
    //データを変換
    $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
    
    //配列に入れる
    $arr = json_decode($json,true);
    
    ?>
    
    <h2>掲示板</h2>
    
    <ul>
    <?php
     foreach ($arr as  $text) {
       echo "<li>";
       echo "<p>投稿時間:".htmlspecialchars($text["タイムスタンプ"], ENT_QUOTES, 'UTF-8')."</p>";
       echo "<p>名前:".htmlspecialchars($text["名前"], ENT_QUOTES, 'UTF-8')."</p>";
       echo "<p>コメント:".htmlspecialchars($text["コメント"], ENT_QUOTES, 'UTF-8')."</p>";
       echo "</li>";
     }
    ?>
    </ul>
    
    
    
    <!-- jQueryの読み込み -->
    <script
    src="https://code.jquery.com/jquery-3.3.1.js"
    integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
    crossorigin="anonymous"></script>
    
    
    <script>
    function postToGoogle() {
    
    //入力内容を取得
    var field1 = $('[name="entry.335927705"]').val();
    var field2 = $('[name="entry.79169581"]').val();
    
    //urlやentryは書き換えてね。
    $.ajax({
    url: "https://docs.google.com/forms/d/e/[key]/formResponse",
    data: {"entry.335927705": field1,
    "entry.79169581": field2
    },
              type: "POST",
              dataType: "xml",
              statusCode: {
                  0: function() {
                      //Success message
    location.href="xxxxxx/bord.php";
                  },
                  200: function() {
                      //Success Message
    location.href="xxxxx/bord.php";
                  }
              }
          });
          }
    </script>
    
    
    
    <form action="#" method="post">
      <input type="text" name="entry.335927705"  value="" placeholder="名前"><br>
      <textarea name="entry.79169581"  placeholder="コメント"></textarea><br>
      <input type="button" onClick="postToGoogle()" value="送信">
    </form>
        
    </body>
    </html>

    できたもの

     https://kouga.tlog.work/bord.php

    以上です。装飾でチャットっぽくもできると思うのでそういうのもいいかもしれませんね。
    投稿後、キャッシュで投稿内容が表示されない場合がありますね・・・。
    対策は色々あると思いますが、今回はそこまでやりません(飽きてる)
    リロードして確認してください。

    応用編

    生活を記録するボタンを作ってみました。
    こちらはgithubで公開しています。

    https://logzitsu.tlog.work/%E7%94%9F%E6%B4%BB%E3%81%AE%E8%89%B2%E3%80%85%E3%82%92%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B%E3%83%9C%E3%82%BF%E3%83%B3/
  • jsonデータをphpで利用する方法

    次のように利用しましょう。
    スプレッドシートから生成したjsonデータをPHPで利用しています。

    https://logzitsu.tlog.work/%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%A7api%E3%81%8C%E4%BD%9C%E3%82%8C%E3%82%8B%E3%82%89%E3%81%97%E3%81%84%E3%81%AE%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6/
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
    
    <?php 
    $url = "https://script.google.com/macros/s/AKfycbxR0D4OJhcTKoB_UX5O9WTkYMlfsj_I1UYxx003/exec";
    $json = file_get_contents($url);
    
    //データを変換
    $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
    
    //配列に入れる
    $arr = json_decode($json,true);
    
    //配列を全て吐き出す
    var_dump($arr);
    
    ?>
    
    <h2>
    <?php //0番目のタイトルを出力
    echo $arr[0]['title'];
    ?>
    </h2>
    
    <p>
    <?php //0番目のタイトルを出力
    echo $arr[0]['contents'];
    ?>
    </p>
    
    <h2>ループで出力</h2>
    
    <ul>
    <?php
     foreach ($arr as  $text) {
       echo "<li>".$text["title"].$text["contents"] ."</li>";
     }
    ?>
    </ul>
        
    </body>
    </html>
    

    https://kouga.tlog.work/test.php

    php.iniの設定で「file_get_contents」が使えない設定だと動きません。
    無料サーバーでは動きませんでした。
    さくらサーバーではすんなり動きました。XFREEは🙅‍♂️でした。

    これで、「スプレッドシートを更新したらPHPサイトに反映できる」
    というサイトが実現できましたね。

    googleフォームを組み合わせれば掲示板ができるのでは?

    スプレッドシートはgoogleフォームで内容を追加する仕組みがもともと備わっていますね。
    今までやってきたことを組み合わせれば、掲示板やチャットが作れるのではないでしょうか?

    上記ではスプレッドシートの編集は自分しかできないため、適当に出力していますが複数人が投稿できる場合はセキュリティにももう少し気を使う必要がありそうです。

    ↓やってみました

    https://logzitsu.tlog.work/google%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B/
  • 【PHPの知識不要】PHP工房さんのフリーメールフォームの設置と使い方

    メールフォームの必要な案件はwordpressで行うことが多いのですが、そこまで複雑ではない案件はPHP工房のフリーメールフォームを使うことがあります。
    サポートが収益になってる部分もあると思いますので紹介と簡単な使い方のみにしたいと思います。
    カスタマイズやサポートなどは本家サイトの方で親切に回答してもらえるようですので是非利用してみてください。

    そもそもメールフォームとは

    企業などのサイトからのお問い合わせは「メールフォーム」を設置するのが一般的となっています。
    企業側のメリットとしては、メールアドレスをサイトに表示しなくてもメールを受け取れるので、スパム対策になるというのがあります。
    また、送信者側もメールアドレスへ直接メールをするのは抵抗があるが、メールフォームで項目がある程度決められている場合は送信に抵抗がないというのがあります。
    送信ミスなども少なく、自動返信や測定など、高度な機能を追加するのも容易です。

    PHPプログラムの自作は危険

    ちゃんと知識がある場合は問題ないですが、PHPはサーバーで様々なプログラムを動かすものですのでセキュリティに穴があり、悪用できてしまうと、サイトの改変などにあい、大変な被害を被る可能性があります。
    セキュリティに関する知識がない場合は、それらを熟知した人間の作成した既存のプログラムを使わせてもらうのが無難と言えます。

    PHP工房 フリーメールフォームとは

    https://www.php-factory.net/

    上記のサイトからアクセスしてください。
    無料で使えるメールフォームが配布されていますのでありがたく使わせてもらいましょう。
    (知識がなく断定できないので恐縮ですが)セキュリティ対策の設定を行うことができます。

    設置と利用にしぼって言えば、PHPの知識は特に必要ありません

    ダウンロードと実装方法

    ③ UTF-8 が一般的な形式です

    以上がダウンロード方法です。

    サーバーにアップロードしよう

    • mail.php
    • contact.html

    の2つのファイルがあると思います。

    mail.phpはプログラム本体です。
    contact.htmlはフォーム入力欄です。
    そのまま使ってもいいですが、カスタマイズしたり自分の作ったものに差し替えて使います。

    mail.phpを編集して設定を行います。
    コメントである程度解説が書いてありますので、それに従って情報を入力したり編集するといいと思います。
    とり合えず、$to (管理者メールアドレス)だけ正しい内容を入力すればメールの送信は可能だと思います。

    編集後PHPの動くサーバーに2つのファイルをアップロードしましょう。

    https://logzitsu.tlog.work/ftp/

    早速使ってみよう

    ブラウザからアップロードしたcontact.htmlにアクセスしましょう。
    メールフォームが表示されたはずです。
    前の欄でmail.phpの管理者メールアドレスを変更した場合はそこにメールが届きますので試してみましょう。
    確認画面や送信完了画面などが動作するのが確認できたと思います。
    メールにちゃんと送信内容がとどいていれば成功です。

    自分のメールフォームで使うには

    しっかりmail.phpの中身の設定を埋めておきましょう
    署名欄などありますのでしっかりといい感じの内容に変えておきましょう。

    さて、自作のメールフォームとmail.phpを結びつける方法です。

    formタグのaction属性をmail.phpとする

    actionはフォームデータの送信先なのでアップロードしたmail.phpを記載して繋げましょう。

    inputなどのname属性を項目の名前にする。

    「お名前」「電話番号」「メールアドレス」
    などなど、「日本語」で書いてしまいましょう。
    ここで記載された内容が確認や送信メールで反映されます。よくできていますね。

    注意点は上記の2つだけ

    使い方がわかってしまえばなんともないですね。
    使い方がわからなかったり、うまく動かない場合はPHP工房さんに問い合わせるといいと思います。
    カスタマイズなども行ってくれるみたいですよ。

    さらに

    もともと便利ですが、JSなどとくみあわせると本気で使えるメールフォームが出来上がっちゃいますよ。もっと便利な有料版も存在するようです。
    是非試してみてください。