PHPの学習とその使用例(WordPress利用者向け、他サイトと差別化する活用例)

記事上部注釈
弊サイトでは実際に利用したサービスなどをアフィリエイトリンク付きで紹介することがあります

WordPress利用者にとって、PHPの知識はなくとも何とかなりますが、表現の幅を広げるためにPHP言語を学習することも良いでしょう。では、PHP言語を学んで何か表現の幅が広がったのでしょうか。その実例を紹介します。特にツール型コンテンツの実現を考えている人にとっては良い知識でしょう。

東京メトロ10000系(飯田橋)

写真1. 東京の鉄道網の1つ、有楽町線(飯田橋で撮影、本文との関連は読めばわかります)

PHPの基礎知識

PHPとは、インターネットで必要なプログラミング言語です。ページに動きを持たせるために必要なものです。例えば、サイト上で条件に合う記事を呼び出すなどの動作です。この動作はサイト作成側のサーバーで行います。なお、ページのレイアウトなどについてはCSSという別の概念を使用します。

PHP言語を学ぶには書籍が良いでしょう。書籍は数多くありますが、私は確かな力が身につくPHP「超」入門を活用しました。初心者向けでありながら、MySQLというデータベースと連携した仕組みを構築する段階まで達しています。そのような意味で、とっかかりやすく実践的な書籍という感覚です。

松浦 健一郎、司 ゆき(共著) SBクリエイティブ

本を読んで基本的な概念を理解すること、そして実際に手を動かして作品を作ってみる、という両側からのアプローチが良いように思いました。私のような初心者が初心者向けの書籍を見ても、サイトのコンテンツを作れたことを次の章で示します。

PHPを使用した作品例

私は混雑データ検索システムを作成しました。その考えかたを以下に記します。

PHPを使って何かサイト運営に生かすとしたら、データベースにアクセスし、最適な情報を提供するシステムを構築することです。

一例を挙げると、私たちが使っている乗りかえ案内も一種の「データベースにアクセスし、最適な情報を提供するシステム」です。とはいえ、いまさら乗りかえアプリを提供することも芸がありません。莫大なデータが必要ですし、何よりも既存のアプリがある以上、あなた(や私)がわざわざ作成する必要はありません。

私は、都内の鉄道網に詳しいことに気づきました。身近な人からは感心されるとともに、呆れられています。また、友人と駅で待ち合わせる際にも、相手の路線を予想し、それに合わせて自分が待機する改札口を臨機応変に変えるほどです。また、混雑調査をするなかで、どの路線のどの区間が混むのかということもわかってきました(これは文献調査も含まれます)。

この2つの知識を活用し、「都内の住宅街から都心への通勤経路とその最混雑区間の混雑率」を示すデータベースを作ることにしました。私の混雑関連の知識を活用するともに、都内の鉄道網の知識も活用できます。

多くの鉄道会社ではさらに詳しいアプリケーションが提供されていますが、これはあくまでもその鉄道会社さんが関わる範囲でしかありません。会社をまたがって大まかな経路とその混雑基本データを提供するアプリケーションはないでしょう。そのような隙間産業を狙って私が自らの趣味でシステムを作り上げました。あくまでも「すぐに大枠がわかる」ように設計しています(※)から、細かな点で異論はあるでしょう。それでも、「すぐに大枠がわかる」ニーズは根強いと想定しました。

※このように「大まか」なシステムと割り切ることで、例外処理などの細かなことを考えずに済みます。私の本業の仕事と同じく、割り切ることで作成者側がラクしているのです。

このシステムを作るうえで気づいたことがあります。それは、PHPだのMySQLだのといったコンピュータ言語スキルよりも対象のことがらに対する深い理解が必要なことです。そのような意味で、文章を書くよりも難しいです。別の言いかたをすると、質問と回答を用意することの難しさです。

逆にいうと、このような質問と回答を用意でき、簡単なプログラミングの知識があれば(なくとも書籍を見ながら作りこんでいけば)、他のサイトさんと差別化することが容易です。

ここまで読んだ読者さんがサイト作成者側であれば、「他の人がこの記事を読んだら差別化できない」という懸念を持つことでしょう。しかし、そのような心配は必要ありません。どうせ、弊サイトを訪問する人は少ないです。そうであれば、ライバルたちはこの記事を読んでいません。さらに、数少ないライバルの多くは実践しません!そうすれば、読んでいるあなたの1人勝ちです。やったね!

PHPでプログラムする際につまづいたことと気づき

東武10030系区間急行(北千住)

写真2. 東武伊勢崎線の最混雑区間を通る区間急行(最混雑区間の意味は電車の混雑に関する用語集に書いています)

PHP言語の学習は参考書籍や素晴らしいサイトさんに譲りましょう。ここでは、私がPHP言語を活用した際にポイントとなる考えかたを紹介します。また、つまづいたこととその克服策もご紹介します。

・回答の選択肢と次の動作は連動させる必要なし

・「サイトに重大なエラーがありました」の警告画面にびびらない

・データベースとの連動では関数の表記に注意

・リンクはHTLMと同じルールで出力すれば良い

・if文を通らない場合の表示エラーは別のif文で修正

それぞれの詳細は以下に紹介します。

回答の選択肢と次の動作のための変数を連動させる必要なし

閲覧者の回答の選択肢と、次の動作のための変数を一致させる必要はありません。これでは言っている意味がわからない?でしょうね!そこで、私の実例で紹介します。

私は混雑基本データ検索システムでは居住区の選択→利用路線の選択という順番で該当データを呼び出しています。利用路線の選択で同じ「山手線」と選んでもらう場面があります。しかし、同じ山手線沿線の人が都心に向かう場合でも、駅によって経路が異なり、最混雑区間を通るかどうかが異なります。そのため、居住区によって、同じ「山手線」を選んだ場合でも処理を変えねばならないのです。

これに対し、豊島区居住の山手線沿線の選択結果は「豊島山手線」と、新宿区在住の山手線の選択結果は「新宿山手線」と、後の処理を変えています。このように、表に見える選択肢(ここでは山手線)と内部で処理するための選択肢(ここでは豊島山手線)は異なったものを用意しています(図1、図2)。

  1. <input type="radio" name="rosen" value="新宿山手線">山手線<br>

図1. 新宿区→山手線と選択する場合の入力画面のコード(表に見える選択肢は山手線、裏での処理では新宿山手線)

  1. <input type="radio" name="rosen" value="豊島山手線">山手線<br>

図2. 豊島区→山手線と選択する場合の入力画面のコード(表に見える選択肢は山手線、裏での処理では豊島山手線)

ちょっとわかりにくいですか?処理1、処理2と続く処理があるとします。処理1の結果を踏まえて処理2を実行する場合、一見処理2の選択肢が同じであっても、処理1での結果によって、処理2の(一見同じ選択肢の)処理結果を変えたいということもありましょう。その際は、内部の処理の変数を選択肢と変えるのです。

この発想に至った私は天才とうぬぼれました!

サイトに重大なエラーがありましたの画面にびびらない

以上の気づきを得られながら、ローカルサーバーにPHP言語によるプログラム、そしてMySQLによるデータを構築し、両者を連動させることもできました。

そのデータをロリポップに入れて、セオリー通りにPHPファイルを子テーマと同じ階層に入れ(※)、そのファイルへのショートコードを新しい投稿に貼り付けたところ、以下のエラーが表示されました。

※記事の本文中にPHPそのものを貼り付けることは適切ではないとされています。ショートコードを活用して、本文中にPHPを書きこむと同じことが実現できる方法は【WordPress】本文中に PHP を利用する方法(細部サイト)をご参照ください。

サイトに重大なエラーがありました。WordPress でのデバッグをさらに詳しく見る。」

プレビュー画面にこの表示がなされました。これはびくっとする警告メッセージです。サイトがバグってしまったかと思いました(現実にはそこまで重大なエラーではありませんでした)。

これだけではどのようなエラーが生じているかわかりませんので、まずは警告メッセージを有効にする必要があります。警告メッセージを有効にする手順は以下の通りです。

1) レンタルサーバー上のwp-config.phpファイルの位置を確認する
 ※私の場合はロリポップです。一番上の階層にあります。

2) ロリポップの場合、「現在の属性」を400から600に変更する(図3)

wp-config

図3. 現在の属性の変更画面(この図の右上の400を600に変更します)

3) 以下の通りに設定を変更する

define( 'WP_DEBUG', false );というコードがある場合、
define( 'WP_DEBUG', true );に変更する
※define( 'WP_DEBUG', false );というコードがない場合、define( 'WP_DEBUG', true );と追記します。

これでどのようなエラーがあるのかがわかります。ただし、作業しないときには元の設定に戻さないと、サイトの訪問者にもエラーが表示されるのでかっこ悪いし、セキュリティ面も得策ではありません。そのため、作業の中断、終了時には元の設定に戻しましょう。

データベースとの連動では関数の表記に注意

これでエラーが読み取れます。私の場合は、MySQLとの連携に失敗していたのが原因でした。他サイトさんによると、当該のPHP言語に以下のコードを最初に追加します(図4)。

  1. <?php
  2. error_reporting(E_ALL ^ E_NOTICE);
  3. // 各種、値の設定
  4. $server_name = 'mysqlXXX.phy.lolipop.lan'; // XXXはあなたの割り当てられた数字に置きかえてください
  5. $user_name = 'user';// userはあなたの割り当てられた文字列に置きかえてください
  6. $password = 'password';// passwordはあなたの割り当てられた文字列に置きかえてください
  7. $database_name = 'user-gsbiaj';// userはあなたの割り当てられた文字列に置きかえてください。確か-gsbiajはそのままで問題なかったように記憶しています。
  8. $charset = 'utf8'; // 文字コード:MySQLのバージョンが適切なら「utf8mb4」のほうがよりよいが、一端
  9. // XXX 一端「おまじない」だと思ってください
  10. $opt['PDO::ATTR_EMULATE_PREPARES'] = false;
  11. // 接続に必要な文字列を合成します
  12. $dsn = "mysql:host={$server_name};dbname={$database_name};charset={$charset}";
  13. // 接続処理
  14. try {
  15.     // データベースに接続
  16.     $dbh = new PDO($dsn, $user_name, $password, $opt);
  17. } catch (PDOException $e) {
  18.     exit; // プログラムを終了させる
  19. }

図4. MySQLに接続するための呪文(ロリポップの場合、私は「接続に成功しました」の類のecho文は入れていません)

また、ここでMySQLに接続するための関数を$dsnで定義(※)していることにご注意ください。手持ちの書籍には$pdoと記載されており、私がローカルサーバーでは手持ちの書籍の通りに$pdoと書いていました。そのため、関数がない(null)という趣旨のエラーが出力されてしまいました。

※関数は何と定義しようと構いませんが、定義したらその名称を使うのがPHPでのお約束です。

そのため、ローカルサーバーで書いた関数$pdoを$dsnに書きかえる必要に迫られました。合計100か所程度の修正が必要となりましたが、「Ctrl」+「F」でpdoをページ内検索で見つけ出したので、それほど苦労せずに済みました。

こうして、初歩的な書籍に書いてある範囲で1つのアプリケーション(もどき)が完成したのです。

リンクの追加も簡単!

混雑データ検索システムでは、最後に利用する路線の最混雑区間の情報が出力されます。その出力情報を見た人は、その路線のより深い情報を確認したいかもしれません。そのためには、内部リンクを整備するほうが親切です。では、出力された文字列にどのように内部リンクを追加すれば良いのでしょうか。

echo文がHTLMで出力されることを思い出せば、そう難しいことはありません。HTLM文でURLを追加することと同じ作法です。リンクタグで囲うだけです。

最初の質問が表示され続ける

最初に住んでいる区を選んでいただく仕様になっています。その質問にお答えいただくと、最大2問程度の質問を選択いただく仕様になっていますが、最初の質問がずっと表示されるシステムになっていました。これは私の脳みそでは解決できず、yahoo!知恵袋に質問させていただきました。

すると、ご回答いただき、issetという概念をご教示いただきました。その後、elseif文も適用しましたので、参考までに該当部分のソースコードを提示いたします(最初にyahoo!知恵袋でご回答いただいたコードをさらにアレンジしました)。

  1. $value = "";
  2. if (isset($_GET['ku'])) {
  3. $value = $_GET['ku'];
  4. }
  5. elseif (isset($_GET['rosen'])) {
  6. $value = $_GET['rosen'];
  7. }
  8. (中略)
  9. elseif (isset($_GET['ohedoswwork'])) {
  10. $value = $_GET['ohedoswwork'];
  11. }
  12. if ($value == '') {
  13. ?>
  14. <form>
  15. <br>
  16. <select name="ku">
  17.     <option value="中央区">中央区</option>
  18.     (残り22区は省略)
  19.     <br>
  20.     <input type="submit">
  21. </select>
  22. </form>
  23. <?php
  24. }

PHPの初歩を独学で学んでみて

世の中には多くのサイトさんがあり、わかりやすい文章でものごとを記しています。しかし、簡易的なアプリケーションを作成しているサイトさんはありません。これはサイト作成側から考えると差別化につながりますし、インターネット全体にとっても多様性の実現につながります。そのため、簡易的なアプリケーションの作成は、サイト作成側、インターネット利用側の双方にwin-winの関係をもたらすと確信しております。

私は簡単なPHPでの学習で混雑データ検索システムというアプリケーション(もどき)を作ることができました。PHPの知識こそ初歩的ですが、東京の鉄道を15年以上使いこなさないと作れないものでしょう。これはこれにより、わかりやすい文章で勝負する競合サイトさんとの差別化に成功したと確信しております。

ちょうど電車の混雑に関しては、弊サイトは力を入れてきました。これまでは弊サイトは無意味に詳細な現地調査、(私にしては)比較的簡潔な基本データ集という2つの武器で勝負してきました。これからは、(はまれば)便利な検索システムというもう1つの武器が加わり、3つ以上の武器で勝負することになります。誰ですか、どの武器もしょぼいと言った人は?

★クイズもPHPで作成できます!

クイズを自作してみる!(PHPの活用!)

確かな力が身につくPHP「超」入門を参考文献に活用しました。

松浦 健一郎、司 ゆき(共著) SBクリエイティブ
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする